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 等。 部署成服务需要使用对应平台的命令。
安装步骤:
访问 Jenkins 官网,找到安装方式,下载 War 包。或者直接点击这里下载。
下载完成运行命令
java -jar jenkins.war
,等待几分钟。在浏览器中访问 http://localhost:8080,完成后续配置。
Docker 方式
优点:与宿主机环境隔离,不依赖宿主机环境。注册成服务非常方便,只需要启动时设置好参数 --restart=always
即可。
缺点:启动稍微复杂,需要配置好启动命令。
安装步骤:
访问 Jenkins 官网,找到 Docker 安装方式。或者直接点击这里访问。
运行 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
35step1: 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等待一会,在浏览器中访问 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 中添加两个任务,一个用于拉取代码运行测试、打包任务,另一个可以手动选择版本的部署任务。
创建测试打包任务
- 填写创建的 Job 信息
- 选择 Git 作为代码管理工具,配置对应的仓库地址。如果是私密仓库,需要填写对应的账号密码。这里使用了 ssh 方式,并提前配置好了私钥信息。
- 选择一个构建方式,这里我们选择 SCM,填写一个每 10 分钟轮询一次的 corn 表达式。
- 构建的时候选择
Execute shell
并在文本框中填写要执行的脚本信息,这里我们填写mvn clean package
,该命令会执行清理、测试、打包操作,在 target 目录下生成 jar 包。
- 保存任务,回到页面。等待 10 分钟或者手动点击立即构建,即可开始构建。 控制台最终打印了文件夹下所有项目版本信息。
创建部署任务
- 创建 deploy 任务,在页面中填写描述,并勾选
This project is parameterized
,选择 String 参数,这里定义一个变量 version。
- 由于部署任务和打包任务是分开,此处无需在使用 Git 去拉取代码,也无需定义构建触发器,直接手动构建即可。
- build 环节还是去执行一个 shell,这里我们配置一个 java 程序启动命令
java -Dserver.port=5000 -jar /c/Users/Administrator/Desktop/jenkins/${version}.jar
指定 5000 端口,并且根据输入的版本号,去执行对应的 jar 包。
- 根据上个任务构建的输出,我们执行部署任务的构建。Jenkins 会弹出提示,此时输入对应的项目版本号,点击开始构建,等待构建完成项目就启动成功了。
使用 Jenkinsfile 创建 Job
图形化页面创建一个 Job 很方便,但是当 Jenkins 需要为多个项目创建 Job 时,一个一个手动创建就会很繁琐,并且 Job 信息也没办法进行版本管理。
Jenkinsfile 就是来解决这个问题的,他将 Job 的配置信息用脚本语言来表示,这样只需要维护这个脚本即可。Jenkinsfile 就像是一份说明书,指导 Jenkins 的工作,让他自动帮我们完成配置。编写 Jenkinsfile 的脚本语言是 Groovy,推荐学习。
整个流程如图:
创建流程:
为项目编写 Dockerfile。
创建 Jenkinsfile。
使用 pipleline 语法编写脚本:使用 Dockerfile 文件 build 一个镜像,并上传到 Docker 私服。
使用一个新的 Job,用来获取 Docker 私服所有项目版本信息,支持选择对应版本部署。
为项目编写 Dockerfile
1 |
|
在 master 分支创建 Jenkinsfile 并编写对应的脚本
1 |
|
该脚本定义了轮询任务,在 docker 中使用 java 环境运行 mvn clean package
打包,并把它暂存。之后使用一个 docker build 构建镜像并推送到 docker 私服。由于私服地址和 Jenkins 都在同一个服务器,因此直接使用内网 ip。
在 deploy 分支创建 Jenkinsfile 并编写部署脚本
1 |
|
该脚本获取 Docker 私服的oh-my-jenkins
镜像,部署我们选择的版本。
在 Jenkins 创建多分支流水线任务
然后只需要配置仓库地址就好了,由于 GitHub 抽风,所以使用 Gitee 仓库地址。
创建完流水线任务,他会自动扫描仓库上的所有分支,并读取 Jenkinsfile 文件,执行命令。
选择版本部署
当流水线分支创建完成之后,deploy 分支会等待我们选择版本,选择需要部署的版本,deploy 即可完成部署。