Jenkins Pipeline(或簡稱為 "Pipeline")是一套插件,將持續交付的實現和實施集成到 Jenkins 中。
Jenkins Pipeline 提供了一套可擴展的工具,用於將“簡單到復雜”的交付流程實現為“持續交付即代碼”。Jenkins Pipeline 的定義通常被寫入到一個文本文件(稱為Jenkinsfile)中,該文件可以被放入項目的源代碼控制庫中。
Jenkinsfile 能使用兩種語法進行編寫 - 聲明式和腳本化。
- 相比腳本化的流水線語法,他提供更豐富的語法特性。
- 是為了使編寫和讀取流水線代碼更容易而設計的。
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
//
}
}
stage('Test') {
steps {
//
}
}
stage('Deploy') {
steps {
//
}
}
}
}
Jenkinsfile (Scripted Pipeline)
node {
stage('Build') {
//
}
stage('Test') {
//
}
stage('Deploy') {
//
}
}
下面將以聲明式腳本為例,介紹jenkinsfile:
設置運行的agent
pipeline {
agent {label 'jenkins-slave'} // 配置構建項目在標簽為jenkins-slave的機器上運行
.....
}
使用多個agent
pipeline {
agent none
stages {
stage('Build') {
agent any
steps {
echo "build..."
}
}
stage('Test on Linux') {
agent {
label 'linux'
}
steps {
echo "test..."
}
}
.....
}
配置可選參數
agent any
options{
disableConcurrentBuilds() //不允許同時執行流水線
skipDefaultCheckout() //默認跳過來自源代碼控制的代碼
timeout(time: 10, unit: 'MINUTES') //設置流水線運行的超時時間
timestamps() //預定義由Pipeline生成的所有控制台輸出時間
}
.....
配置全局變量
environment {
service="java"
}
.....
配置局部變量
stage('Deploy'){
steps {
withEnv(['service=java']){
echo '$service'
}}}
.....
配置可選參數
parameters{
string(name: 'branch', defaultValue: 'dev', description: 'which branch do you want to build?')
choice(name: 'service',choices:"java\nnodejs",description: "服務名")
}
.....
配置機密文本、用戶名和密碼
stage('Deploy'){
steps {
withCredentials([usernamePassword(credentialsId: 'aliyun_oss_upload', passwordVariable: 'aliyun_sceret', usernameVariable: 'aliyun_key')]) {
sh '~/ossutil config -e ${endpoint} -i ${aliyun_key} -k ${aliyun_sceret};~/ossutil cp -r -f dist "oss://${name}"'
}}}
注:需先在jenkins添加用戶憑據
拉取代碼
stage('Checkout') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '3', url: 'ssh://git@giturl/javacode.git']]])
}
}
#在job中點擊Pipline Syntax ,選擇checkout out from version control ,選擇git輸入倉庫地址,生成拉取代碼配置
定義構建完成后執行動作
post {
success {
echo '構建成功'
}
failure {
echo '構建失敗'
}
unstable {
echo '該任務被標記為不穩定任務'
}
aborted {
echo '該任務被終止'
}
}
條件判斷
stage('Build'){
steps {
script {
if ("${gitrepo}" == "java") {
echo "java"
}
else if ("${gitrepo}" == "python"){
echo "python"
} else {
echo "nodejs"
}
}
}
}
#if 需定義在script{}內
獲取命令返回值
stage('Push'){
steps {
script{
def pid = sh returnStatus: true, script: " ps -ef|grep tomcat|awk '{print \$2}'"
echo '$pid'
}
}
}