我的docker随笔35:jenkins服务部署

本文涉及一种在容器中部署 jenkins 服务的方法,后续将其与 gitlab 配合以实现 CICD 功能。其目的是为了在实际工作中使用代码托管及自动化操作。

一、引言

因工作需要,需部署 jenkins 服务器进行测试。与网上几分钟即可部署的文章相比,本文更注重个人的实践记录。本文与前面的 gitlab 有一定的关联。

二、技术小结

  • gitlab 有官方的 Docker 镜像。本文直接使用之。
  • 使用 docker-compose 部署,指定端口。注意挂载 docker.socket文件。
  • 首次登录会提示输入随机文件,一旦输入并设置成功后,不再提示。
  • 各种配置慢慢补充。

三、部署gitlab服务

3.1 部署脚本

本文使用 docker-compose 部署,在测试阶段,使用了多个版本。此处是比较简单的版本,用于初次使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '2'
services:
jenkins:
image: jenkins/jenkins:centos7
container_name: lljenkins
restart: always
volumes:
# 使用主机的docker服务(因为要在jenkins容器中运行docker)
- /var/run/docker.sock:/var/run/docker.sock
# 使用数据盘的目录作为jenkins的工作目录
- $PWD/jenkins_home:/var/jenkins_home
ports:
# 端口映射
- "9999:8080"
- "50000:50000"
networks:
- llgitlab-net

networks:
llgitlab-net:
driver: bridge

注意几点:

  • 脚本中指定了docker.sock的路径,后续可以在jenkins用docker构建。
  • jenkins 数据目录在本目录下的jenkins_home目录,其权限修改为1000,命令为sudo chown -R 1000 jenkins_home
  • 根据实际环境,选择了 centos7 版本的 jenkins。

3.2 运行

运行命令如下:

1
docker-compose up -d

注:jenkins 的启动比 gitlab 快很多。

停止命令如下:

1
docker-compose down

运行过程中会出现初始密码:

1
2
3
4
5
6
7
8
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

c4365f900e554ff5b8885d8c2975929b

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************

四、初次配置

服务启动后,需要进行必要的配置,因此在本文一并给出。

4.1 登录

初次登录时,会提示输入管理员密码,如图1所示:

image-20210804094456510

在 docker 启动时出现有密码,也可以直接在页面所示文件中找到。

4.2 安装插件:

image-20210804094542706
选右侧自定义安装,注:默认也勾选了部分插件。

安装过程图示:

image-20210804094924177

注:笔者在实践中,遇到不可抗拒因素,导致网络不稳定,经常安装不成功,如果尝试多次失败,可以跳过不安装。

五、一些配置

5.1 git 仓库地址问题

配置了项目,构建,提示:

1
stderr: error: RPC failed; result=22, HTTP code = 404

原因及解决:

1
在设置项目git地址时,必须添加`.git`后缀,否则地址不认。

5.2 Publish over SSH

在插件管理界面中搜索Publish Over SSH,并安装之。

在配置界面中进行配置。如下:

image-20210829112839117

注:需测试是否能正常连接。

在具体项目构建后操作添加Send build artifacts over SSH。源文件如果带路径的话,默认情况目标目录也带有。比如源文件为taget/a.out,目标目录为/tmp,则目标文件路径为/tmp/target/a.out`。

5.3 邮件通知

本节使用腾讯企业邮件测试(感谢腾讯为个人域名提供免费的邮箱服务)。此为前提。

使用插件Email Extension Plugin,在插件管理页面搜索,确认是否安装:

image-20210916003759787

系统管理->系统配置。

设置系统管理员邮件地址:

image-20210916085303466

第三方邮件通知插件

image-20210916090427313

触发条件:

image-20210916091126192

再设置邮件模板。

修改默认标题(Default Subject),示例:

1
2
3
$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!
$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS:
$PROJECT_NAME 项目第 # $BUILD_NUMBER 次构建 - $BUILD_STATUS

修改默认内容(Default Content),根据网上资料修改的示例:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
$PROJECT_NAME 项目第 # $BUILD_NUMBER 次构建 - $BUILD_STATUS

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>PROJECT_NAME 第 # $BUILD_NUMBER 次构建 - $BUILD_STATUS</title>
</head>

<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
本邮件由系统自动发出,无需回复!<br/>
${PROJECT_NAME } 项目构建信息如下</br>
<td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>
</tr>

<tr>
<td><br />
<b><font color="#0B610B">构建信息</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>项目名称 : ${PROJECT_NAME}</li>
<li>构建编号 : 第${BUILD_NUMBER}次构建</li>
<li>触发原因: ${CAUSE}</li>
<li>构建状态: ${BUILD_STATUS}</li>
<li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
<li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
</ul>

<font color="#0B610B">最近提交(#$SVN_REVISION)</font>
<hr size="2" width="100%" />
<ul>
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
</ul>
详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>

</td>
</tr>
</table>
</body>
</html>

构建日志:${BUILD_LOG, maxLines=100}

自带邮件通知插件

在“邮件通知”处添加 SMTP 服务器,此处为smtp.exmail.qq.com。点击高级,设置邮件账号和密码,勾选”SSL协议“、”使用 TLS“,端口设置为465。

image-20210916085725950

最后进行邮件发送的测试,输入接收者邮箱,点击测试即可。提示Email was successfully sent表示发送成功。

image-20210916085826846

邮件接收:

image-20210916090144129

注:#10表示是第10次发送,表示点击测试的次数——包括失败的。

发送测试邮件出错及解决方法:

1
2
3
4
5
6
7
8
提示:
com.sun.mail.smtp.SMTPSenderFailedException: 501 mail from address must be same as authorization user
解决:
Jenkins管理员邮箱与此处设置的发送者邮箱保持一致。

提示:
javax.mail.MessagingException: Got bad greeting from SMTP host: smtp.exmail.qq.com, port: 465, response: [EOF]
原因:勾选`使用SSL协议`。

某次发送提示:

1
2
3
Sending email for trigger: Always
Not sending mail to unregistered user li@latelee.org because your SCM claimed this was associated with a user ID ?li' which your security realm does not recognize; you may need changes in your SCM plugin
Sending email to: li@latelee.org

结论:看信息是发送不成功,但能接收邮件,暂时不管。

MORE TODO……