今天開始我會用幾天的時間,用 Jenkins 示範一個完整的 CI Pipeline 和 CD Pipeline。
這邊已經事先準備了一個範例用的 web crawler,主要用來爬取鐵人賽的文章列表以及相關資訊(like 留言 瀏覽 ......)
scrapy crawl ithome
我們的目標是以下列的 stage 組出一個 CI Pipeline,並讓他順利的 Run 在 Jenkins 上。
https://ithelp.ithome.com.tw/users/20151613/ironman/5333
Lint 我們的 source code 可以幫助開發者在前期發現一些基本錯誤(像是 import error),也提供一些 coding style 的建議 (像是變數命名規則),並會以上述的狀況給出一個評分(滿分為 10 )。在 Python 中做 Lint 的工具主要有 flake8 與 Pylint,這邊選用我們選用 Pylint 做為 lint 的工具。
pylint --fail-under=10 {{ MODULE_PATH }}
當我們的 source code 有任何問題,則 exit code != 0
Test 在 Python 中主要有兩種框架,unittest 跟 pytest,這邊我們以 pytest 作為我們 unit test 的框架。
在此範例,我們最終將以 k8s 作為我們 deploy 的目標,因此在 build 階段,我們需要製作出一個 docker image。
我們可以寫出下列的 Jenkinsfile
pipeline{
agent any
environment {
IMAGE_REFERENCE = "ghcr.io/ben4932042/ithome-crawler:latest"
}
stages{
stage("Pull github project"){
steps{
sh "git clone https://github.com/ben4932042/jenkins-ithome.git"
sh "cd jenkins-ithome && git checkout -f day16"
sh "mv jenkins-ithome/jobs/ithome-iron-post-check-cronjob/* ."
}
}
stage("Lint"){
steps{
sh "pylint --fail-under=10 src"
}
}
stage("Test"){
steps{
sh "pytest tests"
}
}
stage("Build"){
steps{
echo "docker build -t ${IMAGE_REFERENCE} ."
}
}
stage("Push"){
steps{
sh "docker push ${IMAGE_REFERENCE}"
}
}
}
stage("House keeping"){
steps{
sh "rm -rf ."
}
}
}
}
}
今天簡單寫出 CI pipeline,但如果直接拿這個交差的話,後果不堪設想 XD
目前 script 當中有許多的壞味道包含
讓我在這邊賣個關子,明天我們再來按照順序的來優化吧。