Day 20 : Jenkins Pipeline与撰写Jenkinsfile

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,之後慢慢讲解更多功能。


<<:  22.移转 Aras PLM大小事-流程签核动态指派(1)

>>:  kbars API测试

简报版-第四章-认识弱密码,不只123456、1234qwer

其实原本最初规画想要做Index方式的纪录,然後多增加一些没写到的面向 不过,总是计画赶不上变化 ...

我朋友最近跟我阐述了一个惨痛的系统购买经验(一)

我朋友最近跟我阐述了一个惨痛的系统购买经验,我觉得很有价值,特以第一人称观点描述记录下来,本故事内容...

新新新手阅读 Angular 文件 - ngFor(2) - Day20

本文内容 将 ngIf 和 ngFor 彼此之间怎麽搭配使用的方法记录下来。 structural ...

使用Lucene.Net达成全文检索!基础解说(一)

Lucene.Net是一套C#开源全文索引库,其主要包含了: · Index : 提供索引的管理与词...

Html表单&表单元素(DAY5)

Html表单是用来与使用者互动的,例如在网路上的购物网站中的会员注册、选购商品按钮、基本资料填写或是...