背景和需求
社區(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í)行失??!"
}
}
}