iT邦幫忙

2022 iThome 鐵人賽

DAY 16
2
DevOps

從零開始的 Jenkins 之旅系列 第 16

第十六天 Jenkins 之旅:CI / CD Pipeline (1)

  • 分享至 

  • xImage
  •  

前言

今天開始我會用幾天的時間,用 Jenkins 示範一個完整的 CI Pipeline 和 CD Pipeline。

在開始之前

這邊已經事先準備了一個範例用的 web crawler,主要用來爬取鐵人賽的文章列表以及相關資訊(like 留言 瀏覽 ......)
https://ithelp.ithome.com.tw/upload/images/20220916/20151613neVjNL8Ngl.png

scrapy crawl ithome

我們的目標是以下列的 stage 組出一個 CI Pipeline,並讓他順利的 Run 在 Jenkins 上。

https://ithelp.ithome.com.tw/users/20151613/ironman/5333

撰寫 CI script

Lint

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

https://ithelp.ithome.com.tw/upload/images/20220916/20151613iLxiBu05TY.png

Test

Test 在 Python 中主要有兩種框架,unittest 跟 pytest,這邊我們以 pytest 作為我們 unit test 的框架。
https://ithelp.ithome.com.tw/upload/images/20220916/201516132HBP2PZkHE.png

Build

在此範例,我們最終將以 k8s 作為我們 deploy 的目標,因此在 build 階段,我們需要製作出一個 docker image。
Basic

我們可以寫出下列的 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 ."
                }
            }
        }
    }
}

Github 專案連結

ithome-jenkins

小結

今天簡單寫出 CI pipeline,但如果直接拿這個交差的話,後果不堪設想 XD
目前 script 當中有許多的壞味道包含

  1. workspace 的 house keeping
  2. container registry 的權限管理
  3. 測試環境的切割
  4. Git Branch

讓我在這邊賣個關子,明天我們再來按照順序的來優化吧。


上一篇
第十五天 Jenkins 之旅:Recap 基本語法
下一篇
第十七天 Jenkins 之旅:CI / CD Pipeline (2)
系列文
從零開始的 Jenkins 之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言