Jenkins 自动化部署

简介:Java 编写的最广泛使用的开源持续集成工具,非常易用,广泛的第三方插件支持,以及分布式构建。

文章所演示的项目地址:

GitHub: https://github.com/greek-zzf/oh-my-jenkins.git
Gitee: https://gitee.com/geek-zzf/oh-my-jenkins.git

安装

War 包方式

优点:安装启动非常方便。

缺点:与环境强绑定,服务器要为 Jenkins 提供部署项目所需要的环境,例如:Node、Java 等。 部署成服务需要使用对应平台的命令。

安装步骤:

  1. 访问 Jenkins 官网,找到安装方式,下载 War 包。或者直接点击这里下载。

  2. 下载完成运行命令 java -jar jenkins.war ,等待几分钟。

  3. 在浏览器中访问 http://localhost:8080,完成后续配置。

Docker 方式

优点:与宿主机环境隔离,不依赖宿主机环境。注册成服务非常方便,只需要启动时设置好参数 --restart=always 即可。

缺点:启动稍微复杂,需要配置好启动命令。

安装步骤:

  1. 访问 Jenkins 官网,找到 Docker 安装方式。或者直接点击这里访问。

  2. 运行 Docker 命令如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    step1: docker network create jenkins

    step2: docker run --name jenkins-docker --rm --detach \
    --privileged --network jenkins --network-alias docker \
    --env DOCKER_TLS_CERTDIR=/certs \
    --volume jenkins-docker-certs:/certs/client \
    --volume jenkins-data:/var/jenkins_home \
    --publish 2376:2376 \
    docker:dind --storage-driver overlay2 --insecure-registry 47.107.74.10:5000


    step3: 创建 Dockerfile 文件,并把如下内容复制进去

    FROM jenkins/jenkins:2.332.2-jdk11
    USER root
    RUN apt-get update && apt-get install -y lsb-release
    RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
    https://download.docker.com/linux/debian/gpg
    RUN echo "deb [arch=$(dpkg --print-architecture) \
    signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
    https://download.docker.com/linux/debian \
    $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
    RUN apt-get update && apt-get install -y docker-ce-cli
    USER jenkins
    RUN jenkins-plugin-cli --plugins "blueocean:1.25.3 docker-workflow:1.28"

    step4: docker build -t myjenkins-blueocean:2.332.2-1 .

    step5: docker run --name jenkins-blueocean --rm --detach \
    --network jenkins --env DOCKER_HOST=tcp://docker:2376 \
    --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \
    --publish 8080:8080 --publish 50000:50000 \
    --volume jenkins-data:/var/jenkins_home \
    --volume jenkins-docker-certs:/certs/client:ro \
    myjenkins-blueocean:2.332.2-1
  3. 等待一会,在浏览器中访问 http://localhost:8080,完成后续配置。

注意:步骤4构建失败,可能是由于 Docker 权限问题,解决方案可参考这里

配置

  • 解锁 Jenkins:浏览器中提示输入管理员密码。War 在启动的控制台中会打印密码,或者页面提示的文件中。Docker 方式使用命令,查看容器日志信息即可看到 docker logs jenkins-blueocean

  • 插件下载镜像设置:为了部署和运行项目,需要安装一些插件。首先需要给插件站点设置一个镜像,不然访问速度感人。配置路径 “Manager Jenkins -> Manager Plugins -> Advanced”,在底部的 Update Site 中把地址进行替换。这里提供一个国内可访问的镜像地址:https://updates.jenkins-zh.cn/update-center.json。

  • 设置好插件镜像源之后,去搜索对应的插件,下载安装即可。

  • 下载并安装插件:由于项目是用 Git 来管理的,并且使用的是 Maven,因此需要下载这两个插件。

使用

创建 Job 之前,需要先了解一个 Job 任务涉及到哪些流程。Jenkins 给我们提供了以下几个模块:

  • General Job 描述,可选。

  • Source Code Management 源代码管理,有多个版本工具选择:Git、Svn 等。

  • Build Triggers 构建触发器,选择构建代码的时机

    • Trigger builds remotely,手动去触发。
    • Build after other project are built,在其他项目构建完成后触发。
    • Build periodically,周期的进行构建
    • GitHub Hooks,当有代码更新到 GitHub,GitHub 会触发一个 Hooks,并通知 Jenkins 服务开始构建,这个需要在 GitHub 中配置推送地址信息。
    • Poll SCM 定时任务轮询,填写 Cron 表达式指定轮询的时机。例如:每 10 分钟去检查 GitHub 仓库是否有代码更新。
  • Build Environment构建环境,配置项目构建的环境,可以在构建的时候传递环境变量信息。

  • Build 可以选择构建所需步骤。

  • Post-build Actions可以指定项目完成构建之后的行为。

手动创建 Job

在 Jenkins 中添加两个任务,一个用于拉取代码运行测试、打包任务,另一个可以手动选择版本的部署任务。

创建测试打包任务

  1. 填写创建的 Job 信息

image.png

  1. 选择 Git 作为代码管理工具,配置对应的仓库地址。如果是私密仓库,需要填写对应的账号密码。这里使用了 ssh 方式,并提前配置好了私钥信息。

image.png

  1. 选择一个构建方式,这里我们选择 SCM,填写一个每 10 分钟轮询一次的 corn 表达式。

image.png

  1. 构建的时候选择 Execute shell 并在文本框中填写要执行的脚本信息,这里我们填写 mvn clean package,该命令会执行清理、测试、打包操作,在 target 目录下生成 jar 包。

image.png

  1. 保存任务,回到页面。等待 10 分钟或者手动点击立即构建,即可开始构建。 控制台最终打印了文件夹下所有项目版本信息。

image.png

创建部署任务

  1. 创建 deploy 任务,在页面中填写描述,并勾选 This project is parameterized,选择 String 参数,这里定义一个变量 version。

image.png

  1. 由于部署任务和打包任务是分开,此处无需在使用 Git 去拉取代码,也无需定义构建触发器,直接手动构建即可。

image.png

  1. build 环节还是去执行一个 shell,这里我们配置一个 java 程序启动命令 java -Dserver.port=5000 -jar /c/Users/Administrator/Desktop/jenkins/${version}.jar指定 5000 端口,并且根据输入的版本号,去执行对应的 jar 包。

image.png

  1. 根据上个任务构建的输出,我们执行部署任务的构建。Jenkins 会弹出提示,此时输入对应的项目版本号,点击开始构建,等待构建完成项目就启动成功了。

image.png

使用 Jenkinsfile 创建 Job

图形化页面创建一个 Job 很方便,但是当 Jenkins 需要为多个项目创建 Job 时,一个一个手动创建就会很繁琐,并且 Job 信息也没办法进行版本管理。

Jenkinsfile 就是来解决这个问题的,他将 Job 的配置信息用脚本语言来表示,这样只需要维护这个脚本即可。Jenkinsfile 就像是一份说明书,指导 Jenkins 的工作,让他自动帮我们完成配置。编写 Jenkinsfile 的脚本语言是 Groovy,推荐学习。

整个流程如图:
image.png

创建流程

  • 为项目编写 Dockerfile。

  • 创建 Jenkinsfile。

  • 使用 pipleline 语法编写脚本:使用 Dockerfile 文件 build 一个镜像,并上传到 Docker 私服。

  • 使用一个新的 Job,用来获取 Docker 私服所有项目版本信息,支持选择对应版本部署。

为项目编写 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
FROM java:openjdk-8u111-alpine

RUN mkdir /app

WORKDIR /app

COPY target/oh-my-jenkins-0.0.1-SNAPSHOT.jar /app

EXPOSE 8080

CMD [ "java", "-jar", "oh-my-jenkins-0.0.1-SNAPSHOT.jar" ]

在 master 分支创建 Jenkinsfile 并编写对应的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
pipeline {
agent any
triggers {
pollSCM('* * * * *')
}
stages {
stage('Test') {
agent { docker {
image "circleci/openjdk:8u212-jdk-stretch"
args '-v /usr/local/docker-cache:/root/.m2'
}
}
steps {
sh 'mvn clean package'
stash includes: '**/target/*.jar', name: 'app'
}
}

stage('Docker Build') {
steps {
echo 'Starting to build docker image'

unstash 'app'
script {
def customImage = docker.build("172.29.145.109:5000/on-my-jenkins:${new Date().format('yyyy-MM-dd-HH-mm-ss')}")
customImage.push()
}
}
}
}
}

该脚本定义了轮询任务,在 docker 中使用 java 环境运行 mvn clean package打包,并把它暂存。之后使用一个 docker build 构建镜像并推送到 docker 私服。由于私服地址和 Jenkins 都在同一个服务器,因此直接使用内网 ip。

在 deploy 分支创建 Jenkinsfile 并编写部署脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def responseJson = new URL("http://172.29.145.109:5000/v2/oh-my-jenkins/tags/list")
.getText(requestProperties: ['Content-Type': "application/json"]);

println(responseJson)

Map response = new groovy.json.JsonSlurperClassic().parseText(responseJson) as Map;

def versionsStr = response.tags.join('\n');

pipeline {
agent any

stages {
stage('Test') {
input {
message "Choose a version"
ok "Deploy"
parameters {
choice(choices: versionsStr, description: 'version', name: 'version')
}
}
steps {
sh "ssh [email protected] 'docker rm -f oh-my-jenkins' || true"
sh "ssh [email protected] 'docker run --name oh-my-jenkins -p 8081:8080 -d 172.29.145.109:5000/oh-my-jenkins:${version}'"
}
}
}
}

该脚本获取 Docker 私服的oh-my-jenkins镜像,部署我们选择的版本。

在 Jenkins 创建多分支流水线任务

image.png

然后只需要配置仓库地址就好了,由于 GitHub 抽风,所以使用 Gitee 仓库地址。
image.png
创建完流水线任务,他会自动扫描仓库上的所有分支,并读取 Jenkinsfile 文件,执行命令。

选择版本部署

image.png
当流水线分支创建完成之后,deploy 分支会等待我们选择版本,选择需要部署的版本,deploy 即可完成部署。


Jenkins 自动化部署
http://wszzf.top/2022/04/30/Jenkins 自动化部署/
作者
Greek
发布于
2022年4月30日
许可协议