jenkins的pipeline中实现git提交
一般场景,就是jenkins从git的代码库下载代码进行各种动作。但是,我们的场景会出现在jenkins中将自动生成的文件提交到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 "PowerCI@zte.com.cn"
git config --global url."ssh://powerci@gerrit".pushInsteadOf ssh://powerci@gerritro
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”)之前是工具生成新的头文件或国际化文件等。(在pipeline的withEnv部分,已经定义了”BRANCH=
{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/knownhosts里添加刚才的信任信息。由于gerrit.zte.com.cn是一个固定的主机,因此,手动完成上面的操作,生成的knownhosts,保存在代码库中,CI过程中,将它拷贝到
HOME/.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无法直接推导出
BRANCH的fullname,因此必须写全HEAD:refs/heads/
BRANCH)
6.一个易错点
sh中 \”””和”“”“”“是不一样的,这是groovy语法
\”””里面${xxx}会被直接显示,如果需要显示xxx这个变量的值,需要使用”“”“”“,这点很易错。
更多推荐
所有评论(0)