jenkins?pipeline學(xué)習(xí)筆記

背景和需求

社區(qū)廣場(chǎng)的自動(dòng)化用例中,需要執(zhí)行完用例,轉(zhuǎn)化測(cè)試報(bào)告格式,測(cè)試結(jié)果發(fā)送釘釘群,測(cè)試結(jié)果上報(bào)質(zhì)量平臺(tái)等多個(gè)流程,jenkins自由風(fēng)格不太好滿足這個(gè)需求,因此考慮用pipeline管線來實(shí)現(xiàn)。
手動(dòng)工作流程運(yùn)行(下面的流程需要依賴上面的流程):
流程1:npx playwright test
流程2:npx ts-node ci/report-converter.ts
流程3:npx ts-node ci/dingtalk-notifier.ts

介紹

Jenkins Pipeline 是一種用于定義CI/CD(持續(xù)集成/持續(xù)交付)流程的自動(dòng)化工具。它允許開發(fā)者通過代碼的形式定義構(gòu)建、測(cè)試和部署過程,從而實(shí)現(xiàn)高度的可維護(hù)性和靈活性。

主要概念

1. 聲明式Pipeline與腳本式Pipeline

  • 聲明式Pipeline:使用更簡潔的語法來定義Pipeline,適合大多數(shù)場(chǎng)景。

  • 腳本式Pipeline:基于Groovy語言,提供更大的靈活性,適用于復(fù)雜的邏輯處理。

2. Pipeline的參數(shù)說明

  • Stage:代表了Pipeline中的一個(gè)步驟,如編譯、測(cè)試等。

  • Step:在Stage內(nèi)執(zhí)行的具體操作。

  • Agent:指定運(yùn)行Pipeline或特定Stage的工作節(jié)點(diǎn)。

  • Post:定義Pipeline結(jié)束后的行為,比如發(fā)送通知或者清理環(huán)境。

創(chuàng)建你的第一個(gè)Pipeline

示例 - 簡單的聲明式Pipeline

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

解釋

  • agent any 表示這個(gè)Pipeline可以在任何可用的代理上運(yùn)行。

  • 每個(gè)stage定義了一個(gè)構(gòu)建階段,而每個(gè)階段包含若干steps來完成具體任務(wù)。

  • echo是Jenkins提供的一個(gè)簡單命令,用來輸出信息到控制臺(tái)。

高級(jí)特性

并行執(zhí)行

通過parallel參數(shù)可以并行執(zhí)行多個(gè)Stage以提高效率:

pipeline {
    agent any
    stages {
        stage('Parallel Stage') {
            parallel {
                stage('Build Web') {
                    steps {
                        echo 'Building Web...'
                    }
                }
                stage('Build Mobile') {
                    steps {
                        echo 'Building Mobile...'
                    }
                }
            }
        }
    }
}

參數(shù)化Pipeline

通過parameters參數(shù),用戶可以在觸發(fā)Pipeline時(shí)輸入?yún)?shù):

pipeline {
    agent any
    parameters {
        string(name: 'BRANCH_NAME', defaultValue: 'master', description: 'Branch to build')
    }
    stages {
        stage('Build') {
            steps {
                echo "Building ${params.BRANCH_NAME} branch..."
            }
        }
    }
}

項(xiàng)目代碼

pipeline {
    agent {
        label 'mobile-record-playback' ,//運(yùn)行的工作節(jié)點(diǎn)
    }
    
    stages {
        stage('Setup & Test') {
            steps {
                sh '''
                    cd ${WORKSPACE}
                    npm install
                    npx playwright install --with-deps
                    echo "? 依賴安裝完成"
                    npx playwright test || true
                    echo "? 測(cè)試運(yùn)行完成"
                '''
            }
        }
        
        stage('Report & Notify') {
            steps {
                sh '''
                    cd ${WORKSPACE}
                    npx ts-node ci/report-converter.ts 
                    echo "? 報(bào)告轉(zhuǎn)換完成"
                    npx ts-node ci/dingtalk-notifier.ts
                    echo "? 釘釘通知發(fā)送完成"
                '''
            }
        }
    }
    
    post {
        always {
            publishHTML([
                allowMissing: false,
                alwaysLinkToLastBuild: true,
                keepAll: true,
                reportDir: 'playwright-report',
                reportFiles: 'index.html',
                reportName: 'Playwright Test Report'
            ])
            publishHTML([
                allowMissing: false,
                alwaysLinkToLastBuild: true,
                keepAll: true,
                reportDir: 'playwright-report',
                reportFiles: 'report.json',
                reportName: 'Playwright Test Report JSON'
            ])
            script {
                echo '上報(bào)測(cè)試結(jié)果'
                sh(returnStdout: false, script: "(sleep 30 && curl -X GET --header 'Accept: application/json' '后端提供的接口?jobName=editor-test-qa-platform') &")
            }
        }
        
        success {
            echo "?? Pipeline執(zhí)行成功!"
        }
        
        failure {
            echo "? Pipeline執(zhí)行失??!"
        }
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容