iT邦幫忙

2022 iThome 鐵人賽

DAY 20
1
DevOps

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

第二十天 Jenkins 之旅:Multibranch Pipeline (2)

  • 分享至 

  • xImage
  •  

在昨天簡單介紹完 Docker Pipeline 後我們來重新改寫 Jenkinsfile。

pipeline{
    agent {
            label 'gcp-agent-1'
        }

    environment {
        IMAGE_REFERENCE = "docker.pkg.github.com/ben4932042/ithome-crawler/scrapy:${env.BRANCH_NAME}"
    }

    stages{
        stage("Setup registry auth"){
            steps{
                withCredentials([usernamePassword(credentialsId: 'github-registry-secret', usernameVariable: 'USER', passwordVariable: 'TOKEN')]){
                    script{
                        sh "docker login docker.pkg.github.com -u ${USER} -p ${TOKEN}"
                    }
                }
            }
        }

        stage("build and test the project") {
            agent {
                docker { 
                        image "python:3.7-slim"
                        args '-u root'
                    }
            }
            stages {
               stage("Setup requirements") {
                   steps {
                       sh """
                        pip3 install -r requirements.txt
                        pip3 install pylint
                        pip3 install pytest
                       """
                   }
               }

               stage("Lint") {
                    steps{
                        sh """
                            export PYTHONPATH=${WORKSPACE}
                            pylint --fail-under=10 src
                        """
                    }
               }

               stage("Test") {
                   steps {
                       sh """              
                        export PYTHONPATH=${WORKSPACE}
                        pytest tests
                        """
                   }
               }
            }
        }

        stage("Build"){
            when {
                branch "main"
            }
            steps{
                sh "docker build -t ${IMAGE_REFERENCE} ."
            }
        }

        stage("Push"){
            when {
                branch "main"
            }
            steps{
                sh "docker push ${IMAGE_REFERENCE}"
            }
        }
    }
    post{
        always{
            cleanWs()
        }
    }
}

https://ithelp.ithome.com.tw/upload/images/20220920/20151613kCotnRMAOt.png
我們用 docker agent 取代本來的 virtualenv 的部分,當我們需要做 python 版本更動時,只需要修改 Dockerfile 以及 Jenkinsfile 中 docker agent 的版本號即可。

需要特別注意,在 docker pipeline 執行時,在 container 內登入的 User ID 為 1000 而不是 root,故如有碰到需要在 docker 安裝套件時等需要 sudo 的需求時,可以有以下兩種方式:
https://ithelp.ithome.com.tw/upload/images/20220920/20151613pNSwygJ3LX.png

  1. 將 docker agent 使用的 image 改為使用 Dockerfile 建立的 image
agent { dockerfile true }
  1. 強制 docker agent 的 user 為 root
agent {
    docker { 
            image "python:3.7-slim"
            args '-u root'
        }
}

專案連結

https://github.com/ben4932042/ithome-crawler

參考資料

https://issues.jenkins.io/browse/JENKINS-54408
https://www.jenkins.io/doc/book/pipeline/docker/


上一篇
第十九天 Jenkins 之旅:Docker Pipeline
下一篇
第二十一天 Jenkins 之旅: 我的 BI 報表 Pipeline (1)
系列文
從零開始的 Jenkins 之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言