乐趣区

Jenkins集群下的pipeline实战

关于 Jenkins 集群

在《快速搭建 Jenkins 集群》一文中,我们借助 docker 快速搭建了 Jenkins 集群,今天就在这个集群环境中创建 pipeline 任务,体验 Jenkins 集群下的并行任务;

环境信息

整个集群环境一共有三台电脑,信息如下:

主机名 IP 地址 作用
master 192.168.133.131 Jenkins 集群的 master 节点,提供 web 服务
agent1 192.168.133.132 Jenkins 集群的一号工作接节点,标签是 <font color=”blue”>maven</font>
agent2 192.168.133.133 Jenkins 集群的二号工作接节点,标签是 <font color=”blue”>gradle</font>

实战内容

本次实战要体验 Jenkins 集群同时执行两个任务,都是编译构建 GitHub 上的热门开源项目:

  1. 在 agent1 上编译和构建 spring-cloud-alibaba,再通过 scp 命令将构建结果传输到 master 电脑的 <font color=”blue”>/usr/local/build_result</font> 目录下;
  2. 在 agent2 编译和构建 spring-framework,再通过 scp 命令将构建结果传输到 master 电脑的 <font color=”blue”>/usr/local/build_result</font> 目录下;

准备工作

要做以下准备工作才能顺利执行后续的任务:

  1. 在 master 电脑上创建文件夹 <font color=”blue”>/usr/local/build_result</font>
  2. 配置 maven,在 Jenkins 网页上选择 <font color=”blue”>Global Tool Configuration</font>,如下图红框所示:

  1. 新增一个 maven 配置,名为 <font color=”blue”>mvn-3.6.2</font>,然后点击“保存”按钮,如下图:

  1. agent1 和 agent2 上用 scp 命令传输文件到 master 上的时候,第一次 ssh 要在控制台输入 ”yes”,为了避免执行任务的时候出现这个等待输入的操作,我们去手动执行一遍,后面就再也不用了,ssh 登录 agent1 之后,执行以下命令进入容器:
docker exec -it agent /bin/bash
  1. 执行命令 <font color=”blue”>ssh root@192.168.133.131</font>,这时候控制台提示输入 <font color=”blue”>yes</font> 或者 <font color=”blue”>no</font>,请您输入 <font color=”blue”>yes</font>,再根据提示输入 master 的密码,此时登录 master 成功:
[root@agent1 16]# docker exec -it agent /bin/bash
root@82eb8cfec0a6:/# ssh root@192.168.133.131
The authenticity of host '192.168.133.131 (192.168.133.131)' can't be established.
ECDSA key fingerprint is SHA256:DPE2nldWHiOhC4DB9doy7jPWNZVup6XFZ+sR2i1gqz8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.133.131' (ECDSA) to the list of known hosts.
root@192.168.133.131's password: 
Last login: Sat Nov 16 19:59:42 2019 from 192.168.133.132
  1. 此时您是在 agent1 的容器中 ssh 登录了 master,所以要连续输入两次 <font color=”blue”>exit</font> 命令才能返回到 agent1 的控制台;
  2. 在 agent2 电脑上也执行相同的操作;

至此,准备完毕,可以创建任务了;

编译构建 spring-cloud-alibaba 的任务

spring-cloud-alibaba 是个 maven 工程,要用 maven 来编译构建:

  1. 在 Jenkins 网页上,点击下图红框位置,创建一个任务:

  1. 如下图,创建名为 <font color=”blue”>spring-clolud-alibaba</font> 的 pipeline 任务:

  1. 下图红框位置就是输入 pipeline 脚本的地方:

  1. 在上图红框位置输入以下内容:
pipeline {
    agent {label 'maven'}
    tools {maven 'mvn-3.6.2'}
    stages {stage('Checkout') {
            steps {echo '从 GitHub 下载 spring-cloud-alibaba 工程的源码 (2.1.1.RELEASE 归档包)'
                sh 'wget https://github.com/alibaba/spring-cloud-alibaba/archive/v2.1.1.RELEASE.tar.gz'
                echo '下载结束,解压归档包'
                sh 'tar -zxf v2.1.1.RELEASE.tar.gz'
            }
        }        
        stage('Build') {
            steps {
                echo '开始编译构建'
                sh 'cd spring-cloud-alibaba-2.1.1.RELEASE && mvn clean package -U -DskipTests'
            }
        }
        stage('Save') {
            steps {
                echo '将构建结果传送到存储服务器'
                sh 'cd spring-cloud-alibaba-2.1.1.RELEASE/spring-cloud-alibaba-nacos-discovery/target && sshpass -p 888888 scp ./*.jar root@192.168.133.131:/usr/local/build_result'
                echo '传送完毕'
            }
        }
        stage('Clean') {
            steps {
                echo '清理 Maven 工程'
                sh 'cd spring-cloud-alibaba-2.1.1.RELEASE && mvn clean'
                echo '清理完毕'
            }
        }
    }
}
  1. 点击底部的 ” 保存 ” 按钮后,点击下图红框中的 ” 立即构建 ” 即可开始任务:

  1. 点击下图红框中的红色圆球,即可跳转到实时输出任务信息的页面:

  1. 页面实时输出构建信息:

  1. 主页面可以看到是 agent1 在执行任务,如下图红框所示,可见 pipeline 脚本中的标签已经生效了,将任务调度到标签为 <font color=”blue”>maven</font> 的节点去执行:


编译构建 spring-cloud-alibaba 工程是个费时的操作,我们现在去创建另一个任务:编译构建 spring-framework

编译构建 spring-framework 的任务

spring-framework 是个 gradle 工程,不需要准备 gradle 环境,在执行编译命令时会自动下载 gradle 工具:

  1. 创建名为 <font color=”blue”>spring-framework</font> 的 pipeline 任务:
  2. pipeline 脚本如下:
pipeline {
    agent {label 'gradle'}

    stages {stage('Checkout') {
            steps {echo '从 GitHub 下载 spring-framework 工程的源码 (master 分支)'
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/spring-projects/spring-framework.git']]])
            }
        }        
        stage('Build') {
            steps {
                echo '开始编译构建'
                sh './gradlew build'
            }
        }
        stage('传送构建结果') {
            steps {
                echo '将构建结果传送到存储服务器'
                sh 'cd spring-core/build/libs && sshpass -p 888888 scp ./*.jar root@192.168.133.131:/usr/local/build_result && cd ../../..'
                echo '传送完毕'
            }
        }
        stage('Clean') {
            steps {
                echo '清理 gradle 工程'
                sh './gradlew clean'
                echo '清理完毕'
            }
        }
    }
}
  1. 立即执行此任务,可见任务已经被调度到 agent2 上去执行了,此时的 agent1 和 agent2 正在同时执行任务,如下图:

查看构建结果

上述两个任务在构建成功后,都会通过 scp 命令将构建结果传送到 master 的 <font color=”blue”>/usr/local/build_result</font> 目录下:

[root@master build_result]# ls
agent.jar                      spring-cloud-alibaba-nacos-discovery-2.1.1.RELEASE.jar          spring-cloud-alibaba-nacos-discovery-2.1.1.RELEASE-sources.jar  spring-objenesis-repack-3.1.jar
spring-cglib-repack-3.3.0.jar  spring-cloud-alibaba-nacos-discovery-2.1.1.RELEASE-javadoc.jar  spring-core-5.2.2.BUILD-SNAPSHOT.jar

至此,Jenkins 集群下的 pipeline 实战就完成了,借助 pipeline 的标签参数可以控制任务的调度节点,实现多任务同时在多节点执行;

欢迎关注公众号:程序员欣宸

退出移动版