iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0
自我挑戰組

DevOps的下克上之旅( ° ∀ ° )ノ゙系列 第 20

Day 20 : Jenkins Pipeline與撰寫Jenkinsfile

  • 分享至 

  • xImage
  •  

Jenkins Pipeline介紹

如昨天的文章,我們將Code推上遠端倉庫後Jenkins會自動獲取並開始接下來的動作。接下來會是一段持續交付(CD)的自動化過程,Code通常會經過Build、Test、Deploy,這幾道過程就像是一個水管,我們稱作是Jenkins Pipeline。 這個Pipeline要如何定義呢? Jenkins有一個方便的文字檔 Jenkinsfile可以方便的定義Pipeline的過程。

接下來我們實作一下,如何將Day 14Day 13 自動在Jenkins上Build Image進該Jenkins Server內吧。

Jenkins設定

假如你的Jenkins是用Day 18的做法,也是用Docker來安裝的,確保你有掛載/var/run/docker.sock並給予足夠的全限,詳細看該篇文章:

  • sudo chmod 777 /var/run/docker.sock
  • docker run -v -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker jenkins/jenkins

/var/run/docker.sock是docker的Unix socket,平常Docker daemon會監聽他,對他送出請求就能操作Docker了。我們的目的就是希望在Jenkins內操作Docker。

檔案目錄

本次目的同樣是建立前端(Vue)、後端(Express)、資料庫(Postgres),Github
資料夾目錄為

project
│   README.md
│   Jenkinsfile
│
└───html (前端 Vue)
│   │   Dockerfile
│   │   package.json
│
└───app (後端 nodejs) 
    │   Dockerfile
    │   package.json

前端html、與後端app都有Dockerfile來Build Image,我們在根目錄下建立Jenkinsfile。

Jenkinsfile撰寫方式

Jenkinsfile大致撰寫如下

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                retry(3){
                    sh "command"
                }
                timeout(time:3,unit:"MINUTES"){
                    sh "some command"
                }
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
    
    post {
        failure {
            echo "Oh! No!"
        }
        success {
            echo "Oh! Yeah that Success"
        }
    }
}

一個Jenkins任務為一個pipeline,agent是設定為哪個端點執行,我們之後有機會講分散式Jenkins再詳細講。

  • stage pipeline的過程
  • steps stage內的執行流程,一個步驟一個命令,成功後接續下一個steps
  • retry與timeout 重式次數與最長執行時間,超過就失敗
  • post build完後要執行的動作,可以是寄一封信給你之類的。

參考自 Jenkins入門

部屬Jenkinsfile 來BuildImage

打開Jenkins > 新增作業 > pipeline。參考前一篇 GitHub hook trigger for GITScm polling,pipeline選擇pipeline scripe from SCM,SCM Git,輸入你的git repository URL: http:\\<token>@github.com/....git,選好你的branch,保存。

https://ithelp.ithome.com.tw/upload/images/20210922/20119044DHB7LAGGx3.png

在專案根目錄下撰寫Jenkinsfile。

pipeline{
pipeline{
  agent any

  stages{
    stage("Delete Old Container"){
      steps {
        catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
          echo "Delete the container"
          sh "docker rm -f run_mynode run_myweb"
        }
      }
    }
    stage("Building") {
      steps {
        echo "Building App"
        sh "cd ./app && docker build -t mynode:latest ."
        sh "docker run -d -p 3000:3000 --name run_mynode --link my_postgres:my_postgres mynode:latest"

        echo "Building FrontEnd"
        sh "cd ./html && docker build -t myweb:latest ."
        sh "docker run -d -p 8085:80 --name run_myweb --link run_mynode:run_mynode myweb:latest"
      }
    }

    stage("Test"){
      steps{
        echo "Testing begin testing2"
        sh "pwd"
      }
    }

    stage("Deploy"){
      steps{
        echo "deploy begin"
      }
    }
  }

  post {
    failure {
      echo "No!! it fail"
    }
    success {
      echo "Yes!! it work"
    }
  }
}

照上面字面上來說,會分別Building App與Front End,成功就會進入success、失敗則failure。
第一次建立任務後要Build完成一次才能根github取得聯繫,因此先按下馬上建置,立即建置。成功後如下:

https://ithelp.ithome.com.tw/upload/images/20210922/20119044uu2HdrTSRt.png

第一次建置完成後就能開始試著用github push來自動化建置過程。可以先嘗試將images刪除,來試試看有沒有正確build :

  • docker rmi mynode myweb
  • 改個東西後 git push 上github

打開Jenkins 任務內的Github Hook Log,發現確實有在pull。
https://ithelp.ithome.com.tw/upload/images/20210922/20119044Sp7b4IlPi4.png

進入該伺服器也能發現成功build起來了,這就是Jenkinsfile的自動化pipeline,之後慢慢講解更多功能。


上一篇
Day 19 : 建立新的Jenkins任務並與Github連結
下一篇
Day 21: 壓力測試Jmeter
系列文
DevOps的下克上之旅( ° ∀ ° )ノ゙30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言