1. ホーム
  2. ジェンキンス

jenkinsのパイプラインにgitコミットを実装する

2022-02-27 17:15:09
<パス

背景

一般的なシナリオは、jenkins が git のコードベースからコードをダウンロードして、様々なアクションを起こすというものです。
しかし、今回のシナリオは、jenkins が自動生成されたファイルを git コードベースにコミットするときに発生します。
典型的なシナリオは、パースツールを使ってデータ辞書や設定ファイルをパースし、設定ファイルやヘッダーなどを生成することです。(ビジネス情報が豊富で、アプリケーションで使用される)。ドキュメントが更新されると、これらのファイルはコードベースで自動的に更新されますが、従来の手作業では見逃したり忘れたりすることになりかねません。

解決方法

jenkinsパイプラインの実装は以下の通りです。

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 the 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://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 ステップは no-fail プロンプトで終了します。

1. ファイルの生成
もし(" <スパン <スパン <スパン <スパン B R A N C H <スパン <スパン " ! = <スパン " n u l l " ) <スパン <スパン 以前 <スパン <スパン はい <スパン <スパン <スパン 仕事 <スパン <スパン <スパン なる <スパン <スパン 新規 <スパン <スパン <スパン <スパン ヘッド <スパン <スパン テキスト <スパン ピース <スパン または <スパン <スパン 国 <スパン <スパン インターナショナル <スパン <スパン ケミストリー <スパン <スパン テキスト <スパン ピース <スパン その他 <スパン . <スパン <スパン ( <スパン <スパン で p i p e l i n e <スパン <スパン w i t h E <スパン n v <スパン <スパン <スパン 所属部署 <スパン <スパン <スパン <スパン <スパン <スパン <スパン <スパン B R A N C H = {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后,会在 H O M E / . s s h / k n o w n h o s t s g e r r i t . z t e . c o m . c n k n o w n h o s t s C I 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无法直接推导出 B R A N C H f u l l n a m e H E A D : r e f s / h e a d s / BRANCH)

6.一个易错点
sh中 \”””和”“”“”“是不一样的,这是groovy语法
\”””里面${xxx}会被直接显示,如果需要显示xxx这个变量的值,需要使用”“”“”“,这点很易错。