流水线实践


Jenkins 流水线实践

一、大致目标

预期目标:开发人员提交代码后,自动触发预定义的 Webhook,Jenkins 收到请求后,解析请求体,处理构建任务,主要包括以下逻辑:

  1. 分支自动匹配:获取提交分支,自动切换拉取对应分支的最新代码,并且过滤特殊场景产生的 Push,如创建分支
  2. 优化回显信息:优化左下区域流水线构建实例信息,补充完善 “分支”、“提交用户” 信息
  3. 构建结果回评:构建执行后,将结果回评到 Git 服务器(Gitee 没搞定
  4. 构建失败通知:当构建出现异常后,自动将构建失败信息发送到 “提交代码用户” 相关的邮箱
  5. 合并准入排查:当进行分支合并是,主动检查最近一次构建是否异常,健康,允许合并,异常,不允许合并

二、分支自动匹配

2.1 项目结构

项目仓库:https://gitee.com/l0tusch1ng/simple-java-maven-app

目录结构:

$ tree .
.
├── Dockerfile
├── Jenkinsfile
├── pom.xml
├── README.md
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── mycompany
    │               └── app
    │                   └── App.java
    └── test
        └── java
            └── com
                └── mycompany
                    └── app
                        └── AppTest.java
11 directories, 6 files

属于纯 Java Demo 项目,主要看下几个主要的文件

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.1-SNAPSHOT</version>
  <name>my-app</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <!-- 最终生成的 jar 文件名 -->   
    <finalName>${project.artifactId}</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>   
          <version>3.1</version>
          <!-- JDK 版本:尽量保证要和环境所匹配  -->
          <configuration>   
            <source>11</source>
            <target>11</target>   
          </configuration>   
      </plugin> 
      <plugin>
        <!-- Build an executable JAR -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.0.2</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
              <mainClass>com.mycompany.app.App</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Jenkinsfile

@Library('shareLibraryDemo') _
def util_tools = new org.devops.utils()
def toemail = new org.devops.toemail()

String branch_name = "${branch}".split('/')[-1]


currentBuild.description = "Trigger by ${committer_name} ${branch_name}"

pipeline {
  agent {
    node {
      label "build-server-aliyun-ecs-01"
    }
  }
  tools {
    jdk 'Openjdk 11.0.13'
    maven 'M2'
  }
  options {
    timestamps()
  }
  stages {
    stage('拉取代码') {
      steps {
        // branches 只拉取特定仓库的分支
        // branches: [[name: '*/master'],]:
        //     当远程仓库 master  分支提交时,触发 pipeline 拉取 master 分支
        //     当远程仓库 develop 分支提交时,仍然触发 pipeline 拉取 master 分支
        checkout([$class: 'GitSCM', branches: [
            [name: "${branch}"],
        ], extensions   : [], userRemoteConfigs: [
            [credentialsId: 'gitee', url: "${env.GIT_URL}"]
        ]])
      }
    }
    stage("打包应用") {
      steps {
        script {
          util_tools.PrintColorMsg("我在编译打包最新代码.", "blue")
          sh "mvn package"
        }
      }
    }
  }
  post {
    success {
      script {
        util_tools.PrintColorMsg("构建成功!", "green")
        toemail.Email("流水线构建成功了!", committer_email, branch_name)
      }
    }
    failure {
      script {
        util_tools.PrintColorMsg("构建失败!", "red")
        toemail.Email("流水线执行失败了!", committer_email, branch_name)
      }
    }
    aborted {
      script {
        util_tools.PrintColorMsg("构建取消!", "red")
        toemail.Email("流水线被取消了!", committer_email, branch_name)
      }
    }
    always {
      script {
        util_tools.PrintColorMsg("清理临时产物.", "green")
        sh "mvn clean"
      }
    }
  }
}

2.2 创建流水线

创建一个类型为 Pipeline 类型的 job,如图所示:

2.3 安装插件

首先安装插件,Generic Webhook Trigger,它主要是用来 生成、解析 Webhook 请求,相比于其他的插件来讲灵活度更高些

顺便,邮件的插件也安上

2.4 插件配置

通用 Webhook 插件,该插件会生成一条路由,Git 服务 http://jenkins-server/generic_trigger_webhook/invoke

邮件配置

2.5 执行效果

流水线构建历史

邮件通知


文章作者: Da
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Da !
  目录