1. 程式人生 > >jenkins的pipeline中實現git提交

jenkins的pipeline中實現git提交

背景

一般場景,就是jenkins從git的程式碼庫下載程式碼進行各種動作。
但是,我們的場景會出現在jenkins中將自動生成的檔案提交到git程式碼庫中。
典型場景是:我用解析工具將資料字典、配置檔案進行解析,生成配置檔案和標頭檔案等(富含業務資訊,程式使用)。當文件更新時,這些檔案就會自動在程式碼庫更新,傳統的人工操作一定會遺漏或忘記的。

解決方法

jenkins的pipeline實現如下:

stage('Document') {
    //conf2bin output headers
    sh 'python ${CONF2BIN}/conf2bin.py'
    //generate international mo files from po files which are written by conf2bin.py
    sh 'cd platform/tools && bash get_mo_file.sh'
    //CI commit
header files automatically if ("$BRANCH" != "null") { //powerci credentials id in power ci server sshagent(['2f64a97f-0358-xxx-8863-bd2e16928e1d']) { //you must use this way, or else you can not get the shell result //trim() is necessary to get rid of the \n in shell result def uid = sh(script: 'id -u'
, returnStdout: true).trim() // the name can be anything sh "useradd jenkins -u ${uid} -m -s /bin/bash" // withouth known_hosts you can not git push automatically sh "cp -r .ssh /home/jenkins/.ssh" //change push url, or else you will push to gerritro //if
nothing is added, this commit will fail //you can not remove HEAD:refs/heads/ or else it fails //language includes po and mo files // and you can not put the above comments in following """""" sh """ git add ${INCLUDE_PATH} git add platform/power/data/language git config --global user.name "powerci" git config --global user.email "[email protected]" git config --global url."ssh://[email protected]".pushInsteadOf ssh://[email protected] git clean -df git commit -m "header changed. ci commit automatically" || true git push origin HEAD:refs/heads/$BRANCH """ } } }

關鍵地方,上面都有註釋。
這裡用中文再詳細說明一下。

0.jenkins安裝必要外掛sshagent
pipeline目前需要依賴其他外掛來實現git的提交,因此,需要安裝sshagent外掛,否則,sshagent那步會出現無故障提示的退出

1.生成檔案
在if (“BRANCH!=null)pipelinewithEnvBRANCH={env.BRANCH_NAME}”)

2.找到credentials id
在jenkins的credentials中找到具有提交git庫許可權的賬號對應的credentials id

3.為docker的使用者id建立一個名字
由於我們的gerrit是基於ssh提交的,ssh中是不允許沒有使用者名稱的操作的。pipeline的docker操作,只會分配一個使用者id(uid),沒有使用者名稱,因此,需要useradd一個使用者名稱(任意皆可),才能完成後面的ssh提交程式碼操作。
提示:useradd要加-m,才能生成它的home目錄,下一步操作需要home目錄。

4.新增known_hosts
ssh第一次連線新的主機時,為了安全,都會詢問是否信任它,這是一個手動操作的過程。點選yes後,會在HOME/.ssh/knownhostsgerrit.zte.com.cnknownhostsCIHOME/.ssh資料夾即可生效
(中興gerrit主機真是不變的嗎?)

5.git提交
git config這步。CI的docker裡一般不會沒有.gitconfig檔案,因此,需要git config這幾步。注意,一定要有pushInsteadOf那一步,否則會push到gerritro(只讀庫)。
git commit這步,當沒有檔案可以提交時(業務文件沒有改變,和程式碼庫相比輸出物不變),會出錯,因此,需要加上“ || true”
git push這步,需要加上“HEAD:refs/heads/”這個字首,否則會出錯。
(git branch可以發現處於HEAD detached狀態,這種狀態下,git push無法直接推匯出BRANCHfullnameHEAD:refs/heads/BRANCH)

6.一個易錯點
sh中 \”””和”“”“”“是不一樣的,這是groovy語法
\”””裡面${xxx}會被直接顯示,如果需要顯示xxx這個變數的值,需要使用”“”“”“,這點很易錯。