文章

目前顯示的是 2020的文章

Azure Pipeline - 自動新增版號

圖片
前言 前一篇文章" 建置組件加上自訂版號 "的後半段提到,使用BuildId實作了版號自動新增,如下圖。 name: v1.0.$( Build.BuildId ) ($(SourceBranchName)) ...     msbuildArgs: '/p:Configuration=release /p:AssemblyVersionNumber=$(versionNumber)' 但這個方式有一個問題是,BuildId是跟著整個Project走,Project內所有的Pipeline會共用此ID,所以下次取得是版號可能會跳號,例:1.0.213 變 1.0.219。 另外一個問題,BuildId只會一直累加,所以建置次變多了,數字會變得很奇怪,若Minor版號進版也無法重置。例如:1.0.5999、1.1.6000。 解決方式 使用 內建函式counter ,參數是第一個Key值,第二個回傳的預設值,每次叫用會依Key值,回傳一個自動加1的數字,例如:Key=1.0.0,第一次呼叫得到0,第二次呼叫得到1。 $[counter('1.0', 0)] 結合變數的使用,versionNumber變數,會得到1.0.0、1.0.1、1.0.2 以此類推....。若Minor進版的話(1.1),則counter會重算,變成1.1.0、1.1.1... variables:   version.MajorMinor: '1.0'    version.Revision: $[counter(variables['version.MajorMinor'] , 0)]    versionNumber : '$(version.MajorMinor).$(version.Revision)' 修改建置工作名稱 解決了版號問題,但產生了另一個問題! 建置工作的名稱,無法使用函式。 name: v1.0.$(Build.BuildId) ($(SourceBranchName))  $[counter('1.2', 0)] 名稱變成如下紅框,這樣建置工作無法跟發行的組件對應起來.....所以得另外使用其他方式解決此問題。 解決方式 使用PowerShell在建置執

建置組件加上自訂版號

圖片
前言 目前的專案,組件版號,預設是自動新增,設定在 AssemblyInfo.cs ,例:1.0.* ,建置後 1.0 .7613.6859 ,後方 粗體字為*號 ,自動編的結果。 日前,同事問道,可以在建置時,不修改程式下,設定一組自訂的版號嗎?  呃.....沒做過,搜尋相關文章後,Nuget有一套件 MSBuild.AssemblyVersion ,可以解決此需求。 實作 1.安裝套件 Install-Package MSBuild.AssemblyVersion  2.MsBuild設定版本參數AssemblyVersionNumber cd  C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin .\msbuild.exe "D:\VSO\Kim\Lab Projects\AzureArtifactsLab\AzureArtifactsLab\AzureArtifactsLab.csproj"  -t:rebuild /p:AssemblyVersionNumber=1.0.25 建置結果 結合CI 建置 將版號設定為自動增加,並設定在每次建置的標題及組件上。本例的環境為Azure Pipeline,使用BuildId當作Major的流水號 #設定建置名稱 name: v1.0. $(Build.BuildId) ($(SourceBranchName)) #建置工作,設定版號 - task: VSBuild@1   displayName: 'Build'   inputs:     solution: '$(solution)'     msbuildArgs: '/p:Configuration=release /p:AssemblyVersionNumber=1.0. $(Build.BuildId) '     platform: '$(buildPlatform)'     configuration: '$(buildConfiguration)' 建置結果 建置工作名稱加上流水號 版號跟建置工作,保持一致 其它參考 https:/

Blogger重新導向網域錯誤

圖片
問題 N年前的設定" 重新導向網域 ",不知怎麼地,好像跳掉了,還是我有改到..(謎),今天想要啟用時,一直出現訊息"您 尚未獲得授權,無法使用這個網域。請按照設定操作說明進行。 ",所有DNS相關設定都設了,但依舊無法啟用。 解決方式 在試到沒方法下,索性把自訂網域 刪掉後,再加回去 .....................就可以 啟用 了.......昏倒。 ps: 重新加入後,Https 需要重新啟用,並等待個20分才會生效。 其它參考 https://support.google.com/blogger/answer/1233387?hl=zh-Hant&ref_topic=6321959

Windows Terminal窗格操作

圖片
看了Scott介紹Windows Terminal窗格操作後,順手玩了一下,相關指令。 開新的分割窗格 垂直分割 : alt+shift+加號 水平分割 : alt+shift+減號 窗格之間切換 alt 上下左右 調整窗格大小 alt+shift+上下左右 關閉窗格 ctrl +shift+w 參考連結 https://www.hanselman.com/blog/HowToUseOpenResizeAndSplitPanesInTheWindowsTerminal.aspx https://docs.microsoft.com/zh-tw/windows/terminal/panes?WT.mc_id=-blog-scottha

使用Visual Studio Code 編輯Azure Pipline

圖片
問題 Azure Pipelines 在網頁上編輯,雖然提供了提示、Task UI輸入方式,但編輯時,卻總覺得不是很方便。例如:輸入法不小心切到中文,會有亂碼問題。 由於yaml的語法嚴謹性,換行,縮排、空格要排好,不然會直接報錯。而換行、複製/貼上時,縮排常會跑掉,所以又要一直調整......=.=。 解決方法 使用Visual Studio Code編輯YML,支援排版、語法提示等。 1.安裝extension: Azure Pipeline 2.設定Azure Pipeline與 *.yml的檔案關聯, 進入 Command Palette,輸入Change Language Mode  針對*.yml設定為Azure Pipelines     設定完成 編輯時會出現相闗提示 其它/參考 Visual Studio Code 編輯Azure DevOps Pipeline的YAML 這裡有教到如何連接Azure Piple直接建立檔案,但我沒試成功,只有用編輯器提示功能。

Jenkins無法更新版本

圖片
問題 公司有2台CI Server,一台正式區,一台測試區, 從上星期開始,測試區主機一直無法更新,另一台正式區的卻可以。一開始以為是地理環境,連的Jenkins Update Center不同,才會有此情形,所以放先不管它。 這兩天再次執行更新,仍然會出現錯誤,訊息如下,找不到憑證。 sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source) at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source) at java.security.cert.CertPathBuilder.build(Unknown Source) Caused: sun.security.validator.ValidatorException: PKIX path building failed at sun.security.validator.PKIXValidator.doBuild(Unknown Source) at sun.security.validator.PKIXValidator.engineValidate(Unknown Source) at sun.security.validator.Validator.validate(Unknown Source) at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source) .... 原因 一開始搜尋時,找到

使用Azure Pipeline發佈Artifacts

圖片
前言 之前寫過一篇 使用Azure DevOps Artifacts來建立自用Nuget Source ,發行的方式,在本機使用Power Shell。一開始頻繁修改,對發行方式還很熟,沒什麼問題。 但...隨著時間一久就開始有了以下問題: 太久沒更新程式! 要再發行時,就會頓時卡卡的,需要再去溫習一下文章,才知如何下手。 同事也要更新程式,但不知如何發行套件.....雖有文章,但....還是不如作者在旁。 以上都是浪費大好青春的瑣事,這兩天剛好看到Azure Pipeline的介紹,就使用它來完成這....雜事吧。 使用方式 1.建立Pipeline 下一步:選擇git來源後,會產生一個Pipeline YAML,嗯...看不懂沒關係,右方的區塊有小助手會幫你,有各式各樣工作可以選擇,例如: VsBuild、MsBuild、Azure Publish等 2.修改YAML,以下為發行到Azure DevOps專案內的Artifacts # ASP.NET Core (.NET Framework) # Build and test ASP.NET Core projects targeting the full .NET Framework. # Add steps that publish symbols, save build artifacts, and more: # https://docs.microsoft.com/azure/devops/pipelines/languages/dotnet-core trigger: none pool:   vmImage: 'windows-latest' variables:   solution: '**/*.sln'   buildPlatform: 'Any CPU'   buildConfiguration: 'Release' steps: - task: NuGetToolInstaller@1 - task: NuGetCommand@2   displayName: 'Restore'   inputs:     restoreSolution: '$(solution)' - task: VSBu

.Net Core 無法發行到IIS網站

圖片
前言   之前都是使用MsDeploy來發行.net framework專案,部份專案改用.Net Core後,部署到IIS,遇到一些無法發行的問題,例如:dll使用中,無法更新、驗證錯誤等。 執行環境 Window 10 .Net Core 3.1 Visual Studio 2019 Azure DevOps 問題排解 命令列,透過發行檔發行,需使用管理權限執行。 dotnet build -c Release /p:DeployOnBuild=true /p:PublishProfile=iis-remote  /p:Password=xxxx 1.dll使用中,無法更新 解決方式: 使用app_offline.htm,讓應用程式先停止。 在發行檔加入如下即可:     <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline> 微軟文件寫道 ,專案檔上引用Microsoft.NET.Sdk.Web,在發行時就會自動加入app_offline並在發行後移除。             但我看專案明明就有引用,但就是試不出來....。--> 此方式失敗 ,記錄備查 ps:在發行檔pubxml也試用,但沒用。 2.發行到遠方主機,出現憑證錯誤。 MSDEPLOY : error Code: ERROR_CERTIFICATE_VALIDATION_FAILED 解決方式: 在發行檔加入如下:     <AllowUntrustedCertificate>true</AllowUntrustedCertificate> 3.在Azure DevOps 使用Pipeline發行時,出現SDK錯誤 ##[error]C:\Program Files\dotnet\sdk\3.1.302\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(234,5): Error NETSDK1047: Assets file 'D:\a\1\s\Nop.Web\Server\obj\project.assets.json' doesn't have a

.Net Core Identity 無法登入

圖片
前言   前陣子使用Blazor Assembly寫的一個Side Project給家人使用,這兩天反應無法登入,一直跳回Login。在反應的當下,我測試都正常,直到今天早上要登入時,出現了同樣的問題。 http status回應200,沒有任何錯誤訊息。 執行版本 .Net Core 3.1 Blazor Assembly 3.2.0 Microsoft.AspNetCore.Identity 3.1.7 原因 檢查console及Response Header,有警告訊息"Identity.External samesite=none; httponly...",判斷應該chrome 85針對SameStie更嚴格的限制造成的。 圖片來源  Ps:忘了擷圖XD,引用一張相似的。 關於SameStie SameStie是防止第三方Cookie的存取。 Strict : 嚴格限制。 Lax  : 只有Get 可以存取,Post不行。 本來預設是None ,Chrome在80之前會通知你要修改為Lax。 80之後,Lax為Chrome的預設值。意思是你不設定的話,預設為Lax。 ps:目前的 程式不用更動 。 .net 4.7.2 及 4.8後,Session,Cookie ,Form Auth Cookie 已預設為Lax None : 在https下,Secure設為true,第三方才可以存取。 解決方式 將Identity相關Cookie由原于的none設置成Lax。 1.設定Lax    services.ConfigureExternalCookie(options =>             {                 options.Cookie.SameSite =  Microsoft.AspNetCore.Http.SameSiteMode.Lax;             });             services.Configure<CookiePolicyOptions>(options =>             {                 options.MinimumSameSitePolicy = SameSiteMode.Lax;                 

Facebook 取得粉絲頁資訊整理

圖片
前言    工作需求,需要取得自家粉絲頁的影片資訊。這幾天的搜尋及研究後,頭腦有點亂,整理一下相關內容及連結。 Token 區分 User Access Token:最常用的一種,讀寫用戶的Facebook資料,透過 login dialog經過用戶授權取得 App Access Token : 用來更改你的app設定或是發佈一些消息,透過server對facebook呼叫取得 Page Access Token : 跟User access token很像,但是它可以讀 寫 Facebook page的資料 Client Token:封裝在mobile apps或是桌面程式 參考: https://ithelp.ithome.com.tw/articles/10158130 取得 粉絲頁 影片資訊 取得粉絲頁的影片清單 需要Page Id,管理者在粉絲頁管理的"關於"可以取得。 需要權限:pages_read_engagement 內嵌影片播放器 API 事件控制 影片與直播是不同的API Token 取得-使用工具 透過工具取得短期Token 個人、Page都可以 透過 Debuger可以換成三個月的Long Token 90天過期,若有使用則會繼續展延,若沒使用60天就會過期。 過期的token不可再拿來換新的。 可以透過API取得short-token,再去換long-token。 未過期的也可以使用long-token,換另一個long-token回來。 Token 取得-使用API 透過Fb API Client 取得短期Token 更換成長期Token及Page Token 需要App Id及App Secret 我的作法是換成長期Token後,再把它換成Page Token。ps:期限是永久的....不知什麼時時會失效。 pages_read_engagement:取得影片的權限 在 Developer Mode下,可以直接使用 在Live Mode下,需要App Review相關權限。 申請權限,需要附上你的應用程式的操作畫面及影片 要通過個人或商業審核。 個人審核現在暫停中(已停4個月了) App 啟用Live基本條件 相關參考 透過Fb API Client 取得短期Token 使用App Id,Secret更換成長期Tok

ASP.NET MVC-Google Authenticator雙因素認證實作

圖片
前言 雙因素認證,除了Email及簡訊以外,另一選擇 Google Authenticator。本文針對在ASP.NET MVC實作方式作說明。 實作 1.安裝動態密碼及QRCode套件 2.產生動 態密碼的私鑰及BarcodeUrl       private GoogleAuthenticatorModel GenerateGoogleAuthenticatorModel()         {             byte[] secretByte = KeyGeneration.GenerateRandomKey(20);             string userName = "Kimxinfo";             string barcodeUrl = KeyUrl.GetTotpUrl(secretByte, userName) +  "&issuer=GoogleAuthenticatorLab";             var model = new GoogleAuthenticatorModel             {                 SecretKey = Base32Encoder.Encode(secretByte),                 BarcodeUrl = barcodeUrl             };             return model;         } 3.產生Barcode圖檔   private string GenerateQRCode(GoogleAuthenticatorModel model)         {             string fileUrl = $"~/temp/{model.SecretKey}.jpg";             string filePath = Server.MapPath(fileUrl);             QRCodeGenerator.ECCLevel eccLevel = QRCodeGenerator.ECCLevel.M;             using (QRCodeGenerator qrGenera

Angular自訂後端Route

圖片
前言 原本開發的.Net Core程式,想要跟Angular並存,例如:路徑/kim開頭為Angular App,其他則使用MVC。 開發環境 Visual Studio 2019 .Net core 3.1 Angular 9 解決方式 修改Starup.cs,將原本的app.UseSpa 註解或移除        //app.UseSpa(spa =>             //{             //    // To learn more about options for serving an Angular SPA from  ASP.NET Core,             //    // see https://go.microsoft.com/fwlink/?linkid=864501             //    spa.Options.SourcePath = "ClientApp";             //    if (env.IsDevelopment())             //    {             //        spa.UseAngularCliServer(npmScript: "start");             //    }             //}); 加入自訂Angular進入的Route,本例為 kim。 public-host:For Live Reload使用         app.Map("/kim", client =>             {                 client.UseSpa(spa =>                 {                     spa.Options.SourcePath = "ClientApp";                     if (env.IsDevelopment())                     {                          //開發時期,需要指定base-href為kim                          s

Jenkins-備份鎖定錯誤

圖片
問題   公司的Jenkins,原本可以正常備份,但這幾天備份出現錯誤,如下訊息: [ERROR] org.codehaus.plexus.archiver.ArchiverException: Problem creating zip: The process cannot access the file because another process has locked a portion of the file org.jvnet.hudson.plugins.backup.BackupException: java.io.IOException: org.codehaus.plexus.archiver.ArchiverException: Problem creating zip: The process cannot access the file because another process has locked a portion of the file         at org.jvnet.hudson.plugins.backup.utils.BackupEngine.doBackup(BackupEngine.java:115)         at org.jvnet.hudson.plugins.backup.utils.BackupTask.run(BackupTask.java:130)         at java.lang.Thread.run(Unknown Source) Caused by: java.io.IOException: org.codehaus.plexus.archiver.ArchiverException: Problem creating zip: The process cannot access the file because another process has locked a portion of the file         at org.jvnet.hudson.plugins.backup.utils.BackupEngine.handleEnd(BackupEngine.java:104)         at org.apache.commons.io.Directo

WIX-建立URL註冊碼U啟動程式

圖片
前言        此篇今天在測試Notion筆記的桌面應用程式,針對在登入時,透過網頁啟動應用程式這個功能,感到有點好奇。雖然這不是很新奇的功能,幾年前就在iTune上看過,只是自己 寫的程式,都沒試著去作此功能。 實作 開始前,依照 微軟提供的說明 ,我們需註冊URL相關機碼,reg範例檔案內容如下: [HKEY_CLASSES_ROOT\WixLab] @="URL:WixLab Protocol" "URL Protocol"="" [HKEY_CLASSES_ROOT\kai\DefaultIcon] @="C:\\Program Files (x86)\\WixLab.WpfApp\\WpfApp.exe" [HKEY_CLASSES_ROOT\WixLab\shell] @="" [HKEY_CLASSES_ROOT\WixLab\shell\open] @="" [HKEY_CLASSES_ROOT\WixLab\shell\open\command] @="C:\\Program Files (x86)\\WixLab.WpfApp\\WpfApp.exe /url \"%1\"" 根據上方的機碼內容,在安裝程式時,將內容註冊進去。本範例使用Wix安裝範本作說明(關於Wix請 參考 )。 打開Product.wxs,新增一筆Component如下,紅字 WixLab 為Url Schema開頭。     <!-- 註冊URL執行的機碼-->       <Component Id="RunURLComponent" Guid="*">         <RegistryKey Root="HKCR" Key=" WixLab " >           <RegistryValue Type="string" Name="URL Protocol" Value=""/>           <Regi

刪除Docker資料夾中的windowsfilter目錄

圖片
前言      之前在測試Docker for Windows時,下載了不少Image檔案在我的E槽內,大約有30G左右。今天因硬碟不足,想要來清掉它,但卻出現權限不足,無法刪除的訊息。另一點,很怪的是,Image目錄已經指向其他位置了,都已經沒用到了,也不能刪。 解決方式 下載檔案 https://github.com/jhowardmsft/docker-ci-zap 解壓後,使用管理者權限執行command 如下,就可以完全刪除該目錄 docker-ci-zap.exe -folder "E:\Hyper-V\Docker\windowsfilter" 其它參考 http://edwardkuo.github.io/paper/2017/03/10/Docker/Deletewindowsfilter/

Visual Studio Angular 8 升級到9

圖片
前言   這兩天在學習Angular,對於習慣使用Visual Studio 2019的我,使用Angular專案樣板,當然是最好的選擇了,可以省一下一些.Net Core與Angular的一些配置工夫。 建立好專案後,查看package.json的Angular版本為 8.2.12, 最新的版本為9.x.x。嗯...看到有新版本後,強迫症發作,順手就下了升級命令,結果代誌不是憨人想的那麼簡單,升級後的程式, 無法執行,最後還是得依靠google大神解決....=.=。 升級方式   環境條件 .Net Core 3.1 Node.js 10.13 命令模式,切到ClientApp目錄 1.先升級到 8 的最後版本 ng update @angular/core@8 @angular/cli@8 2.再升級到 9 ng update @angular/core@9 @angular/cli@9 3.打開 main.ts,移除程式如下: export { renderModule, renderModuleFactory } from '@angular/platform-server'; 4.打開 package.json,修改"start: 原 "start": "ng serve", 修改後 "start": "echo Starting... && ng serve", 以上....收工。 其它參考 https://jasontaylor.dev/asp-net-core-angular-9-upgrade/

NSwag Studio 產生API的Client介接程式碼

圖片
前言    一直以來在寫Web API時,給同事參考都是透過Swagger產生的說明文件。如下圖使用Swashbuckle 套件產生。 專案環境 .Net Framework 4.8 ASP.NET Web API 2 ASP.NET MVC  跟API 取資料,作展示。 問題    同事詢問是否可以直接提供介接類別,讓他直接可以使用。例如:Google API SDK。這...若要手刻的話,可能會累屬偶,幸好科技發達,關於這方面,早已有相關的解決方法。 如何使用    1. Web API 安裝NSwag 安裝Nuget package NSwag.AspNet.Owin Microsoft.AspNet.WebApi.Owin Microsoft.Owin.Host.SystemWeb ps: 關於為什麼不用Swashbuckle,請 參考此篇 。 在Web API專案新增Startup.cs [assembly: OwinStartup(typeof(NSwagLab.Startup))] namespace NSwagLab {     public class Startup     {         public void Configuration(IAppBuilder app)         {             var config = new HttpConfiguration();             app.UseSwaggerUi3(typeof(Startup).Assembly, settings =>             {                 //針對RPC-Style WebAPI,指定路由包含Action名稱                 settings.GeneratorSettings.DefaultUrlTemplate =                     "api/{controller}/{action}/{id?}";                 //可加入客製化