jenkinsのパイプラインにgitコミットを実装する
背景
一般的なシナリオは、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这个变量的值,需要使用”“”“”“,这点很易错。
関連
-
[解決済み] ジェンキンスはシャットダウンする
-
[解決済み] Jenkinsです。Jenkins ファイルにコメントを追加できますか?
-
[解決済み] ジェンキンス・マルチマスター
-
[解決済み] jenkinsのmultibranch pipelineにビルドパラメータを追加するには?
-
Jenkins のビルドステップ 'Execute shell' はビルドを失敗とマークしました。
-
jenkins がシェルコマンドを実行すると、時々 "Command not found" というプロンプトが表示される ---- 解決策を処理する。
-
jenkinsがシェルコマンドを実行すると、"Command not found "というプロンプトが表示されます。
-
[解決済み] [Solved] groovy.lang.MissingPropertyException: No such property: buildJobArray for class: groovy.lang.Binding
-
[解決済み] Jenkinsがジョブを実行しない(ペンディング - 次の実行者を待っている状態)
-
[解決済み] jenkinsとcloudbees jenkinsの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Jenkins:403 リクエストに有効なクラムが含まれていません。
-
[解決済み] AnsibleとRundeckを連携させるのは良いアイデアですか、それともどちらか一方を使えば十分ですか?
-
Jenkins java.io.IOException。CreateProcess error=2, The system could not find the specified file.
-
ビルドステップ「シェルの実行」でビルドが失敗と判定された
-
Jenkins上級シリーズ - 16 JENKINSのもとで完結するANT BUILD.XMLファイル
-
[解決済み] Jenkinsパイプラインの実行時に「script returned exit code 1」を修正する方法
-
[解決済み] Jenkinsプロジェクトのアーティファクトとワークスペース