Pipeline 使用

Pipeline 是以 Groovy Script 作為撰寫,為 Java 的動態語言。

第一個 Pipeline: Hello World

echo 'hello from Pipeline'

執行結果

Started by user anonymous
[Pipeline] echo
hello from Pipeline
[Pipeline] End of Pipeline
Finished: SUCCESS

以上面的例子來說,完整的語法為:

echo("hello from Pipeline");

我們可以省略 ;, () 並且 '', "" 皆可以使用。

建立簡單的 Pipeline

node {
  git url: 'https://github.com/agileworks-tw/spring-boot-sample.git'
  def mvnHome = tool 'M3'
  sh "${mvnHome}/bin/mvn test"
}

其中

git url: 'https://github.com/agileworks-tw/spring-boot-sample.git'

也可以指定 branch,指令如下

git url: 'https://github.com/agileworks-tw/spring-boot-sample.git', branch: 'master'

若沒有指定的話,預設為 Master,完整程式碼如下

git([url: 'https://github.com/agileworks-tw/spring-boot-sample.git', branch: 'master'])

tool 實際上是讀取 jenkins 中的 Global Tool Configuration 所設定的建置工具,如下圖:

def mvnHome = tool 'M3'

就是取得該 tool 定義的結果來進行專案建置。

而下面指令

sh "${mvnHome}/bin/mvn test"

則為使用該 tool 利用 mvn 進行專案 test,而實際指令為

sh([script: mvnHome + '/bin/mvn test'])

可以看到簡化不少

for windows 可以改為

bat "${mvnHome}\\bin\\mvn test"

管理環境變數

在 Pipeline 我們可以使用 env 來存取 jenkins 所設置的環境變數,我們也可以使用 env 來設置新的環境變數。

延續上一個範例:

node {
  git url: 'https://github.com/agileworks-tw/spring-boot-sample.git'
  def mvnHome = tool 'M3'
  env.PATH = "${mvnHome}/bin:${env.PATH}"
  sh 'mvn test'
}

透過 env 的使用,我們就不需要使用 ${mvnHome}/bin/mvn 這麼長的程式路徑。

上述的處理方式,只有當你使用但一 slave 時比較沒有問題,有時候我們需要指定某項建置需要特定的環境變數時,我們可以改為

node {
  git url: 'https://github.com/agileworks-tw/spring-boot-sample.git'
  withEnv(["PATH+MAVEN=${tool 'M3'}/bin"]) {
    sh 'mvn test'
  }
}

withEnv(["PATH+MAVEN=${tool 'M3'}/bin"]) { 得意思就是原有的 PATH 變數,加上新的 Maven 環境變數

如此就可以限制該環境變數限制在特定的 scope 一但執行完成,環境變數就會還原成原本的內容。

除此之外,一些 Jnekins 本來在建置過程中就會可用的變數也可以透過 env 直接存取,比如 env.BUILD_TAG 可在 groovy script 中使用,或是在 sh 時使用 $BUILD_TAG 進行該變數存取。

紀錄測試結果,以及建置封存

node {
  git url: 'https://github.com/agileworks-tw/spring-boot-sample.git'
  def mvnHome = tool 'M3'
  sh "${mvnHome}/bin/mvn test package"
  step([$class: 'ArtifactArchiver', artifacts: '**/target/*.jar', fingerprint: true])
  step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*.xml'])
}

其中 $class 為縮寫,以 JUnitResultArchiver 為例,完整路徑為 hudson.tasks.junit.JUnitResultArchiver

可以從 jenkins UI 找到一些線索,如下圖:

指定特定 Slave 進行建置

假設已經有設置 jenkins slave 節點

node('master') {
    // as before
}

我們可以透過上述方式指定特定的 node 進行建置,若沒有指定將由 jenkins 自行判斷

除了節點的 name,也可以指定特定的 label,如

node('unix && 64bit') {
    // as before
}

定義方式可參考下圖

若點選建置,你將可以看到下列訊息輸出

Running on <yourslavename> in /<slaveroot>/workspace/<jobname>

中途暫停

node('remote') {
  input 'Ready to go?'
  // rest as before
}

使用情境如:用於確認 QA 是否正確,若確認完成進行 production deploy,又或者輸入特定參數。

使用 try... catch... final

我們在進行建置時,就像在寫程式一樣,一定會有另外產生,同樣我們可以透過 try... catch... final 來定義,如:

try{
  stage 'Approve, go production'
  def url = 'http://localhost:8000/'
  input message: "Does staging at $url look good? ", ok: "Deploy to production"
}finally{
  sh "docker-compose stop server"
}

使用 docker 進行 QA 驗證,無論最後是否要要進行 production deploy 皆需要將 docker 停止。

stage 定義

stage 的定義,可以讓你的建置步驟更清楚,可讀性更好

node {
  stage 'setup'
  git url: 'https://github.com/agileworks-tw/spring-boot-sample.git'
  def mvnHome = tool 'M3'

  stage 'test'
  sh "${mvnHome}/bin/mvn test package"


  stage 'report'
  step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/TEST-*.xml'])

  stage 'Artifact'
  step([$class: 'ArtifactArchiver', artifacts: '**/target/*.jar', fingerprint: true])

}

且 jenkins 在 task 中 stage view 進度上可以看到每個 stage 的執行過程與結果,如下圖:

results matching ""

    No results matching ""