發表文章

目前顯示的是有「CI」標籤的文章

Jenkins-無法儲存工作設定

圖片
問題 同事回報CI工作發行錯誤,原因為建置參數遺失...。此工作只有在昨天Jenkins更新到2.69後,修改了Pipeline的語法而已,查詢工作設定後,發現原本的參數設定不見了....變成未設定的狀態. 測試其他如trigger build等其他的設定,儲存後也都會不見....昏 除錯過程 本以為是Jenkins 2.69更新的問題,所以就先 回報議題 ,過了一天收到了回覆,開發人員使用相關環境測試,是沒問題的....。 為確定是否為Java runtime或是環境等問題,我重新安裝最新的及舊版Jeknins,測試結果正常 將主機的Jenkins還原到我本機來測試後, 問題一樣存在 .....。 在確定與主機環境一致後,再比對兩邊的檔案後,差異的只有Plugin,所以我先將測試正常的Plugin替換到目前有問題的Jenkins下,果然一測試就正常了....。 ps:此目錄只需要copy .jpi就可以使用了 解決方式 在經由交叉比對、連番測試差異的plugin,終於找到了問題所在,一枚六年前安裝,目前已停止維護的 TFS Plugin 造成的。在Jenkins 更新至2.64之後,此Plugin會影響Jenkins的工作設定。 目前的版控已全部改成git,所以將它移除後,恢復正常。

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) .... 原因 一開始搜尋時,找到...

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  ...

AzureDevOps-使用Azure Artifacts建立私有的Nuget來源

圖片
前言 同事前兩天問到AzureDevOps 的Artifacts可以用來管理私有nuget套件,但..沒什麼研究,無法回答=.=。今日找到一篇教學文章,跟著作一次,,並將相關步驟記錄下來。 如何使用 1.建立Feed 2.設定Feed  3.選擇nuget.exe 4.將上圖紅框內的xml另存成Nuget.config,並下 載最新的Nuget.exe 放到方案目錄內。 ps:要放哪都可以,放在方案目錄內,是個人開發習慣。 5.透過nuget.exe封裝套件 進入PowerShell後,先切換目錄到.nuget目錄,nuget.exe及組態檔所在位置。 .\nuget.exe pack ..\AzureArtifactsLab\AzureArtifactsLab.csproj 封裝後會產出 AzureArtifactsLab.1.0.0.nupkg,版號自動參照AssemblyInfo.cs 6.發行nuget .\nuget.exe push -source "KimFeedLab" -ApiKey az AzureArtifactsLab.1.0.0.0.nupkg 執行後,第一次會先跳出登入畫面 發行完畢,回到Azure Devops會看到已發佈的套件 7.在開發工具的Nuget Package Sources加入新的來源 ps: 來源的URL在第3點建立的Nuget.config內。 完成後,就可以在套件管理參考囉 其它參考 範例下載 https://azuredevopslabs.com/labs/azuredevops/packagemanagement/#exercise-1-working-with-azure-artifacts https://www.nuget.org/downloads

Jenkins-升上2.223的安全性問題解決

圖片
問題 1.同事回報在Jenkins的操作出現錯誤,訊息如下: No valid crumb was included in the requestSERVLET 2.AzureDevOps的push trigger無法觸發,發生403錯誤。 以上發生是在Jenkins 版本升上 2.223所遇到問題。 解決方式 1.在防止跨站點請求偽造的設定,將代理相容性打勾。 此問題發生在公司的測試主機上,正式主機無此問題。在搜尋相關文章後,方向往安全性設定尋找,比對了2台主機的設定後,找到了差異的地方,設定後,回復正常。 ps:此設定原本是Prevent Cross Site Request Forgery exploits,之前為了讓第三方網站呼叫,把它停用。更新最新版後,Enable proxy compatibility 就變成是未勾選狀態。 2.第三方網站呼叫Jenkins要改用toke的驗證。原本使用的是帳號/密碼的方式,會出現403錯誤。 建立token,進入位置:http://localhost:8080/user/[你的帳號]/configure。 紅框的token,建立後只會顯示一次,代替原本使用的密碼。 更新AzureDevOps 的User API token,輸入將剛在Jenkins建立的token。 其它參考 https://blog.csdn.net/wanglin_lin/article/details/73849146 https://jenkins.io/doc/upgrade-guide/2.176/#upgrading-to-jenkins-lts-2-176-3

Jenkins - 使用Java rumtime 64位元

圖片
前言 同事回報Jenkins建置時,發生錯誤:StackOverflowError,查詢相關文章後,判斷跟JVM使用記憶體上限有關。 解決方法 在jenkins.xml將記憶體調高,不過在32位元下的Java runtime下,最多只能調到1.5G左右, 我目前的設定值為1024mb 。鑑於目前C I主機有足夠的記憶體,可以讓Jenkins好好發揮。所以試著將Java runtime 改成64位元,才可以設定更高的記憶體。 1. 下載java runtime 64 位元 。本文安裝路徑:C:\Program Files\Java\jre1.8.0_241 2.修改jenkins.xml。 executable : 原為Jenkins內建的jre,改成jre 64位元安裝位置。ps:要指定.exe副檔案,網頁才有辨法執行。 arguments :本例 X2048m 為設定記憶體到2G <service>   <id>jenkins</id>   <name>Jenkins</name>   <description>This service runs Jenkins continuous integration system.</description>   <env name="JENKINS_HOME" value="%BASE%"/>   <!--     if you'd like to run Jenkins with a specific version of Java, specify a full path to java.exe.     The following value assumes that you have java in your PATH.   -->   <executable>C:\Progr...

Jenkins - 使用FTP發行程式

圖片
目前有一支Console程式,在Jenkins建置後,會發行到內部網路的其他主機。現在有一需求是要跨Internet到遠方主機。想來想去,透過FTP好像是唯一可行的方式。 安裝Publish Over FTP 安裝後,到Configure,建立FTP的登入資訊。 紅框打勾後,會使用 一條連線完成所有傳輸 。避免被FTP Server判定為使用太多條連線,而發生錯誤。 透過Pipeline執行FTP 以下為透過Pipeline Snippet Generator產生的語法。但產生後,會缺少2個參數,少了這2個,建置會報錯,如下紅字。 configName:KimFtp  在Configure設定好的組態檔。 sourceFiles: '**/**' 所有檔案及子目錄 ftpPublisher paramPublish: null,masterNodeName:'' ,alwaysPublishFromMaster: false, continueOnError: false, failOnError: false, publishers: [[configName: ' KimFtp ', transfers: [[asciiMode: false, cleanRemote: false, excludes: '', flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: ' **/** ']], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false]] 其它/參考 Publish Over FTP

Pipeline Shared Library-目錄方式載入-2

圖片
前言    前一篇提到了 Pipeline Shared Library-目錄方式載入 ,可以確保不會因git無法連線,而無法執行工作。但...這樣作的另一個缺點是,當要Library修改後,要更新時又要手動copy一次。這種手工工作,作一次還ok,多了自己都看不過....。 解決方法 1.新增另一個Job,透過git下載Library,並將設定將Library的位置指向它。 2.上面第1點基本設定好就可以使用,但有一個問是放在workspace的目錄,會定時被清空,所以需作一下調整,將git下載後的Library複製到另一目錄,並將設定將Library的位置指向它。 本例:複製到根目錄 stage ('copy') {                  steps {              fileOperations([fileCopyOperation(                   excludes: '',                   flattenFiles: false,                   includes: "**/**",      ...

Pipeline Shared Library-目錄方式載入

圖片
前一陣子將Jenkins上的Job改成Pipeline grovvy的方式撰寫腳本後,整個CI的運作,也變得相當有彈性。上手後,真的是回不去原本的GUI設定方式。在Job比較多時,針對相同的腳本可以使用Shared Library的方式將共用方法封起來,方便維護與調用, 參考文章 。 問題 回到本文,這陣子同事回報最近的Job在建置失敗時,都沒有發出通知。檢查原因後,發現兇手為Pipeline引用Shared Library時,因載入的方式使用的是git,當git server連不到時,整個Job內的腳本是不會被運行的。所以當然也不會執行到falire的通知區段。 解決方式 Google一下後,好像沒有人有類似的問題....可能是我們家的主機放在網路不甚穩定的區域吧...XD。在找不到相關解決方式下,將方向轉往若不使用git取得,改用目錄位置取得。作法如下: 1.安裝Plugin : File System SCM 2.將Library搬到Jenkins主機目錄,本例:D:\Jenkins\KimPipelineLib 3.到Pipeline Shared Library設定相關參數。 Default version:若是git方式,此值為branch,現在為File System,為檔案比對的識別標籤(必填)。 選擇Legacy SCM後,才會出現File System的參數設定。     Library的主機目錄位置。 參考文章 https://blog.johnwu.cc/article/jenkins-pipeline-job-shared-library.html https://www.slideshare.net/roidelapluie/jenkins-shared-libraries-workshop

AzureDevOps-透過Command Merge

環境 AzureDevOps Jenkins git 問題     目前的專案每天中午會透過手動的方式,固定發pull request將develop分支併到relesae。由於是常態性質,大部份是不需要review,所以一來浪費時間,二來有時一忙就會忘了作=.=。 解決方式 經測試後,可以透過command及Jenkins的建置工作來完成每日自動合併,以下為測試後的2種方式 (使用jenkins pipeline) 1.使用merge的方式 withCredentials([usernamePassword(credentialsId: '0f57466e-8dc0-444b-a88a-d56d663d3378', usernameVariable: 'username', passwordVariable: 'password')]){     bat "git pull https://${username}:${password}@xxx.visualstudio.com/KimGitLab/_git/KimGitLab"     bat "git merge origin/develop"     bat "git push https://${username}:${password}@xxx.visualstudio.com/KimGitLab/_git/KimGitLab" } 透過withCredentials取得在Jenins上已儲存的AzureDevOps token pull回來後,merge orgin/devlop到本地的release 在pull到遠端 2.使用Pull Request的方式 前面第1點雖然可以每天合併分支,但缺點是在release分支上無法看出develop每次併回來的commit有哪些。而pull request則可以。 安裝VSTS CLI 裝完後要重開機 VSTS CLI Command Sample withCredentials([...

Jenkins-更新Slack 2.1.5後無法發送

圖片
昨天更新Slack Plugin後,無法收到通知,原因為2.1.5後,設定要重新輸入,並且原本的Integration Token已移除,如下圖 修改方式 1.到Credentials 加入驗證資訊 Kind : Secret text Sercet : 輸入 Slack 提供的Token 2.在Configure/Global Slack Notifier Settings 選擇剛建立的Credential 

Jenkins - Android安裝建置環境

圖片
最近開發第二個Android專案,第一個手動建置混過了,第二個再這樣就太混了=.=,還是得乖乖上Jenkins去建置才對。以下為安裝及初步成功建置的記錄 JAVA SDK (Koltin需要) Java SE Development Kit 8u191 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html jdk-8u191-windows-x64.exe Android SDK Tools 安裝 SDK Tools https://developer.android.com/studio/ sdk-tools-windows-4333796.zip 解壓到:C:\AndroidSdk 使用command 安裝所需要的plaform 切換路徑:C:\AndroidSdk\tools\bin sdkmanager "platforms;android-20" Jenkins 設定 Global Tool Configuration/ 安裝Gradle Configure / 設定 Android Home SDK位置 此位置為上方Android SDK Tool解壓縮的位置 建置apk:Invoke Grdle Scrpt 只建置 Release clean assembleRelease  加上Flavor=assemblePrdRelease  or assembleQasRelease  使用Pipleine  stage ('Build') { steps { bat 'gradlew clean assembleRelease'   } } 安裝外掛:File Operation 複製apk到部署主機 建置錯誤排解 Lint found errors in the project; aborting build. 解決方式:在grdl...

Jenkins - AzureDevOps簽入後觸發工作-git

圖片
闗於在Azure DevOps簽入即觸發建置,之前有寫過一篇是使用TFS的方式。最近公司要改成使用git的方式,所以再來演練記錄一下。 Azure DevOps設定 1.Clone repository 取得https的網址 2.建立Personal Access Token 此Token為Jenkins checkout 所使用 3.新增Service hook-簽入及建置工作 Project Settings>Service hooks  選擇要Trigger的Repository及Branch 這邊的User Name 及API Token 使用的是在Jenkins上建立的 ps:Integration Level 要選 Build-in Jenkins API,這應該是自架Jenkins的選項 Jenkins設定 原始檔控制,選擇git並輸入網址及加入剛建立的git Credentials的帳號密碼 參考來源 https://docs.microsoft.com/en-us/azure/devops/service-hooks/services/jenkins?view=vsts

Jenkins- PowerShell 引用共用模組

圖片
在Jenkins上的工作,有一段Power Shell的Script會被多次引用,例: 向資料庫取得DataTable的共用方法。 若分別寫在多個Job上,日後會變得難以維護。針對此問題,找到了一個外掛可以解決。 安裝方式 1.安裝外掛-Managed Scripts 2.管理Jenkins的畫面,進入Managed files的設定連結 3.新增Script Config Name:此為使用時的識別名稱。 Content:執行的Script 使用方式 1.引用剛加入的config,Target:將config檔,輸出到工作目錄 2.執行Power Shell Import-Module 剛輸出到工作目錄的共用檔案,並呼叫裡面的Function,來執行SQL 取得筆數 參考來源 Managed Script Plugin https://wiki.jenkins.io/display/JENKINS/Managed+Script+Plugin Power Shell Sql Query http://mattslay.com/sql-server-queries-using-powershell-lesson-1/