如何通过 Jenkins 实现项目的自动构建与部署

Jenkins 官网是这么介绍这款产品的:“Jenkins 是开源 CI&CD 软件的佼佼者,提供超过 1000 个插件,支持构建、部署和自动化,满足各种项目的需求”。

就在上个月,我部署了自己的 XXL 任务调度平台(这是当时撰写的文章),并在其上运行了多项生产任务。每次任务有变动,我都需要手动登录 VPS、上传 jar 包并构建部署镜像,相当的原始人🤣。有了 Jenkins,我只需将代码提交到 github,再轻轻一点,便能自动完成构建部署流程,相当的 Beautiful~

Jenkins 的使用门槛很低,而且 官方文档 通俗易懂,所以本文不再详细阐述相关概念。接下来,让我们简要介绍一下如何安装 Jenkins 服务并进行项目运维。

1 配置 Jenkins 服务

首先,我们需要配置 Jenkins 服务。为了方便使用,这里选择使用 docker-compose 来安装 Jenkins,并通过 Nginx 进行反向代理。

关于安装 Docker & Compose、Nginx 证书自签的方法,可以参考我之前的文章,这里就不做赘述了。传送门如下:

1.1 部署 Jenkins

编写 docker-compose.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
version: '3.9'

services:
    jenkins:
        image: jenkins/jenkins:latest # 软件镜像
        container_name: jenkins
        privileged: true
        ports:  # 端口映射到宿主机,注意避免冲突
            - "127.0.0.1:18080:8080" # 控制台端口
            - "29090:50000" # 对外暴露的 TCP 通信端口,注意安全!
        volumes:
            - /opt/jenkins:/var/jenkins_home # 文件系统映射到宿主机(可选)
            - /opt/jdk1.8.0:/usr/local/jdk1.8.0 # 指向宿主机的 JDK 路径
            - /usr/bin/docker:/usr/local/bin/docker # 指向宿主机的 Docker 路径
            - /var/run/docker.sock:/var/run/docker.sock
        restart: unless-stopped
警告
如果选择将 /var/jenkins_home 映射到宿主机 /opt/jenkins,可能会报错 xxx Permission denied,此时修改 /opt/jenkins 的权限为 777 即可。

Jenkins Docker 服务启动后,完成 Nginx 的反向代理:

1
2
3
4
5
6
7
8
location / {
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:18080; # 为上述 docker 映射的控制台端口
}

1.2 初始化 Jenkins

Nginx 启动后,通过浏览器访问控制台,会提示解锁 Jenkins,根据提示我们需要去 /var/jenkins_home/secrets/initialAdminPassword 文件中获取解锁码。按照上述 docker-compose 的配置,该文件已经被映射到了宿主机 /opt/jenkins/secrets/ 下,可以直接访问到:

解锁 Jenkins

验证通过后,在“新手入门”页面,建议选择安装推荐插件,后续需要修改插件,可以到控制台中再处理:

安装推荐插件

接下来,按照提示创建管理员账户并成功登录,即可进入控制台:

jenkins 首页

1.3 插件安装

由于我的项目工程需要通过 Maven 编译,并通过 Docker 容器部署,所以还需要继续下载 Maven、Docker 插件。设置路径为 Dashboard > Manage Jenkins > 插件管理 > Available Plugins

补充插件

安装完成后,勾选“安装完成后重启 Jenkins(空闲时)”,使插件生效。

1.4 全局工具配置

插件安装成功后,进入 Dashboard > 系统管理 > 全局工具配置 完成 SpringBoot 项目的环境配置,url 地址为 https://{$jenkins-host}/manage/configureTools/

全局工具配置

1.5 Github 凭证添加

Jenkins 需要从 Git 仓库拉取代码,所以这里需要配置连接凭证。首先我们登录 Github Developer Settings,遵循最小权限原则,创建一个专供 Jenkins 使用的 Token:

Github Token

然后回到 Jenkins 控制台,创建一个 Username with password 类型的凭据:

Github 凭证添加
  • 用户名为 Github 用户名,密码为刚刚创建的 Token;
  • 设置路径为 Dashboard > 系统管理 > 凭据管理 > 全局凭据 (unrestricted)
  • url 地址为 https://{$jenkins-host}/manage/credentials/store/system/domain/_/

至此,Jenkins 的服务端就配置完成了,接下来开始正式运维项目。

2 新建任务

这里我们以 XXL-JOB 调度中心为例,讲解如何新建一个任务。

2.1 创建任务

在主页点击“新建任务”,选择 maven 项目类型:

新建任务

2.2 配置 Git 仓库

任务创建完成后,跳转到设置页面,配置 Git 仓库:

配置 Git 仓库

注意仓库地址类型选择 HTTPS 协议,否则容易被拒绝访问。

2.3 配置 Maven 构建指令

编译指令需要根据自己的项目填写。这里 XXL-JOB 的编译参数是 clean install -Dmaven.test.skip=true,编译时跳过测试用例:

配置 Maven 构建指令

2.4 配置项目部署指令

项目编译完成后,会在 /var/jenkins_home/workspace/{任务名称} 文件夹下生成镜像,具体的部署指令取决于你的项目部署方式。

由于我要通过 Docker 部署服务,因此我配置了一个在 Maven 编译完成后执行的 Shell 脚本,来完成 Docker 镜像的构建和运行:

配置项目部署指令

脚本内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 删除旧的容器与镜像
if [ "$(docker ps -a | grep xxl_job_app)" ]; then
docker stop xxl_job_app
docker rm xxl_job_app
fi
if [ "$(docker images -q xxl_job_app)" ]; then
docker rmi xxl_job_app
fi
# 构建新的镜像
cd /var/jenkins_home/workspace/XXL-JOB-ADMIN/xxl-job-admin
docker build -t maling/xxl_job_app .
# 部署 docker 镜像
docker run -itd -p 127.0.0.1:8080:8080 --name xxl_job_app maling/xxl_job_app

3 验证测试

配置完成后,到首页点击箭头部署项目,即可验证结果:

新建任务

把玩 Jenkins 期间,我也经历了多次部署失败,主要遇到了以下几个问题:

  • 通过 SSH Key 凭据拉取 GitHub 代码时,返回 Code 128。解决方法是改用 HTTPS 方式拉取代码。
  • 出现 java、docker 等可执行程序找不到的问题。这类问题的根本原因只有一个,即上文中配置的 JDK、Docker 等路径错误地填写为宿主机的路径(例如 /opt/xxx),因此需要更正为容器内的路径。

总之,遇到问题了去主页的“构建历史”查询具体的失败原因即可对症下药。


参考资料:


欢迎关注我的公众号,第一时间获取文章更新:

微信公众号

相关内容