到昨天為止,我們已經大致完成我們的 CI/CD pipeline,接下來來說一下是如何串接他們的,這邊要再多介紹一個 Jenkins 的 Plugin Pipeline: Build Step,這個 plugin 可以讓我們在 Jenkinsfile 中藉由 function build
來讓兩個 pipeline 之間做串接。以我們這次的 CI/CD pipeline 為例子:
pipeline{
......
stages{
stage("Setup registry auth"){
......
}
stage("build and test the project") {
......
}
stage("Build"){
......
}
stage("Push"){
......
}
stage("Update Latest image"){
......
}
stage("Deploy to kubernetes"){
when {
tag "*"
}
steps{
build(
job: 'ithome-crawler-cd',
parameters: [
string(name: 'K8S_NAMESPACE', value: 'prod')
string(name: 'IMAGE_TAG', value: ${env.BRANCH_NAME}),
string(name: 'K8S_CRONJOB', value: '0 16 * * *'),
]
)
}
}
}
......
}
我在最後新增了一個 stage - Deploy to kubernetes
。宣告說當 branch 為 tag 時,會自動觸發 CD pipeline (ithome-crawler-cd) 執行,並且同時宣告此次觸發時的參數,包含 k8s_namespace (K8S_NAMESPACE)、此次 release 的 pod 要使用的 image tag (IMAGE_TAG) 以及 cronjob 執行頻率(K8S_CRONJOB)
再來,我們也同時在 CD pipeline 修改部分內容,將本來 K8S_NAMESPACE 是由 env 決定改為由 parameters 決定。
parameters {
string(name: 'IMAGE_TAG')
string(name: 'K8S_CRONJOB')
string(name: 'K8S_NAMESPACE')
}
為了讓我們可以在每次的部署時,更簡易的在 UI 觀察部署資訊,這邊我們在 CD pipeline 執行時,新增一個 stage - Tag job
來更新 currentBuild.description
的內容:
stage("Tag job"){
steps {
script{
currentBuild.description = """
<ul>
<li>Release tag @ ${params.IMAGE_TAG}</li>
<li>Deploy namespace @ ${params.K8S_NAMESPACE}</li>
<li>Cronjob @ ${params.K8S_CRONJOB}</li>
</ul>
"""
}
}
}
這邊我已經將 Markup Formatter 由預設的 Plain text 改為 Safe HTML,所以在 currentBuild.description
中我寫的會是 html 的 tag。
可以到 Manage Jenkins >> Configure Global Security >> Markup Formatter 做更改。
實際效果,可以在執行結果下方的 description 看到部署相關資訊,亦可依照實際需求新增修改 description 的資訊。個人認為這是一個非常有幫助的功能,非常推薦大家在自己的 pipeline 中使用。
此次的 CI/CD pipeline 其實還有很多需要優化的地方,但是因為時間有限,所以就先寫到這邊,剩下有興趣的人可以到 Github 持續追蹤,我有空的時候還是會持續更新...... 大概吧?
目前已基本完成 CI/CD 的自動化,我們也預留了當發生個什麼萬一需要手動更版的時候,也可以在 CD Pipline 中藉由 paramters 的傳入實現更版,並且在每次執行後,留下 description 以作為後續追查時使用。
https://www.w3schools.com/html/html_lists.asp
https://opensource.triology.de/jenkins/pipeline-syntax/globals