day19 持续集成-jenkins
docker篇:
- 基础篇 | 各平台搭建docker环境 | 快速上手(容器、镜像、网络、数据卷) | docker-compose
- 搭建Selenium Grid hub分布式UI测试框架 | docker安装MySQL | docker安装redis | docker配置httpbin项目 | docker配置Tomcat并添加Java web项目 | docker部署Django项目 | 容器迁移 | 搭建FTP服务器 |
- 常见报错 | 解决拉取镜像慢的问题
Jenkins篇:
- 初始Jenkins | Docker关于Jenkins镜像的那些事儿 | 各平台配置Jenkins环境 | Jenkins配置Python环境 | 插件管理
- Jenkins环境配置allure-commandline | jenkins邮件配置 | Jenkins构建接口自动化脚本 | Jenkins构建Djando项目
- 常用配置 | 凭据管理 | 用户管理
- 常见报错处理 | Jenkins容器迁移
什么是持续集成
持续集成
持续集成是一种软件开发实践经验,采用持续集成时,开发人员会定期将他们的代码变更合并到一个中央存储库中,之后系统会自动运行构建和测试操作。持续集成的主要目标是更快发现并解决错误,提高软件质量,并缩短验证和发布新软件更新所需的时间。
持续交付
持续交付是一种软件开发实践。通过持续交付,系统可以自动构建和测试代码更改,并为将其发布到生产环境做好准备。持续交付可以在构建阶段后将所有代码变更都部署到测试环境和/或生产环境中,从而实现对持续集成的扩展。当持续交付得以正确实施时,开发人员将始终能够获得一个已通过标准化测试流程的部署就绪型构建工件。
参考:
- https://aws.amazon.com/cn/devops/what-is-devops/
- https://www.jianshu.com/p/5643b1cf9e3f
- https://www.cnblogs.com/Neeo/p/10428714.html
关于jenkins
Jenkins是一个开源项目,是基于Java开发的集成工具。Jenkins是一款开源CI&CD软件,用于自动化各种任务,包括构建、测试和部署软件.
Jenkins支持各种运行方式,可通过系统包,Docker或者通过一个独立的Java程序。
文档:https://www.jenkins.io/zh/doc/
jenkins安装
前提:有java 环境
支持各种的平台:
- Windows,有msi
- Tomcat环境,可以部署到Windows、Mac OS、linux
- docker,Windows、Mac OS、linux
最低推荐配置:
- 256MB可用内存
- 1GB可用磁盘空间(作为一个Docker容器运行jenkins的话推荐10GB)
为小团队推荐的硬件配置:
- 1GB+可用内存
- 50 GB+ 可用磁盘空间
软件配置:
- Java 8—无论是Java运行时环境(JRE)还是Java开发工具包(JDK)都可以。
jenkins for docker
本次安装环境:阿里云服务器(centos7.4) + docker 19.03.8
常用的镜像有两个:
docker pull jenkins:latest
docker pull jenkinsci/blueocean:latest
- 下载jenkins镜像
[root@r ~]# docker pull jenkinsci/blueocean:latest
[root@r ~]# docker images |grep jenkins
jenkinsci/blueocean latest 789f2766377f 15 hours ago 567MB
- 启动docker容器
docker run \
-u root \
--name myjenkins \
--restart=always \
-d \
-p 6010:8080 \
-p 50000:50000 \
--env JAVA_OPTS="-Xmx512m" \
-e JAVA_OPTS=-Duser.timezone=Asia/Shanghai \
-v /etc/localtime:/etc/localtime \
-v /tmp/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean:latest
- 启动后,会默认的创建一个admin用户(只有基于jenkinsci/blueocean:latest镜像的jenkins容器会创建一个admin用户),并且生成一个初始密码:
# 查看密码,仅除此使用
[root@r ~]# docker logs -t -f --tail 40 myjenkins
# 查看密码,推荐
[root@r ~]# docker exec -it -u root s267 bash
bash-5.1# cat /var/jenkins_home/secrets/initialAdminPassword
e2be0a4bd7db42dca7c47c60fcdc636a
- 使用初始密码解锁jenkins。
- 新手入门之,安装推荐的插件:
- 新手入门之创建初始管理员用户,如果在这一步手动创建了管理员用户,默认创建的admin用户将会被注销。
- 新手入门之实例配置,配置jenkins url
- 新手入门结束
- 欢迎来到jenkins
常用的操作
手动重启jenkins
- 前台访问:
http://47.52.72.214:6010/restart
- 安装完插件之后,可以选择重启jenkins,使插件安装生效。
- docker命令来重启jenkins
docker restart myjenkins
插件管理
安装插件
方式1:
管理jenkins ---> manges plugins ---> 可选插件,搜索要安装的插件,可选择,安装并且重启jenkins
由于下载地址是插件官网,可能会导致下载失败,然后安装失败.....
如果安装失败,就采用第二种方式。
方式2:
然后手动将下载到本地的hpi插件,上传到jenkins。
管理jenkins ---> manges plugins ---> 高级选项,下拉选择上传插件。点击本地文件上传
完事之后,重启jenkins,插件生效。
卸载插件
管理jenkins ---> manges plugins ---> 已安装,搜索要卸载的插件,并且勾选然后点击卸载。
解决:插件下载慢的问题
修改/var/jenkins_home/hudson.model.UpdateCenter.xml
文件,换国内源:
bash-4.4# cat /var/jenkins_home/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://updates.jenkins.io/update-center.json</url>
</site>
</sites>
bash-4.4# vi /var/jenkins_home/hudson.model.UpdateCenter.xml
bash-4.4# cat /var/jenkins_home/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
常用的国内源地址:函数的返回值
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.esuni.jp/jenkins/updates/update-center.json
http://mirror.xmission.com/jenkins/updates/update-.json
用户管理
常用的操作:
- 创建用户
- 修改密码
必要的配置
管理jenkins ---> 全局安全配置,勾选允许用户注册,完事点击保存。
修改密码
- manage jenkins ---> mange user ,用户列表,选择用户id。
- 选择设置,下拉重新输入新的密码,然后下拉点击确认按钮。
创建用户
管理jenkins ---> 管理用户
点击新建用户
创建成功后的用户列表:
删除用户
这里只能删除普通的用户。
管理jenkins ---> 管理用户,点击红色按钮进行删除。
确认删除:
凭据管理
由于jenkins要和别的软件或者平台打交道,那么就要拿着先关凭据去做认证。
- 添加凭据
- 修改凭据
- 删除凭据
添加凭据
jenkins主页 ---> 凭据 ---> 全局凭据
此时进入到了全局的凭据列表,列出了所有的凭据。
如何添加凭据呢?
点击左侧的添加凭据按钮。
创建成功,会在凭据列表展示出来,可以点击右侧按钮编辑该凭据。
修改凭据
在凭据列表中,点击指定凭据后的小三角或者右侧的更新按钮,来修改凭据。
来修改相关内容。
删除凭据
凭据列表,选择指定凭据后的小三角,选择删除选项。
确认删除。
问题
在上述的配置GitHub账号密码的凭据中,有的时候会遇到如下问题:
如何解决:
可以使用ssh形式来解决:
配置github公钥私钥凭据
生成公钥私钥
github对SSH密钥做了升级,原来的SHA-1,rsa等一些已经不支持了,由于我使用的是rsa,可能和大部分用户一样,所以今天在push代码时候遇到了这个问题,记录以下。
在本机使用git来生成公钥私钥:
ssh-keygen -t ed25519 -C "your-email"
# 示例,一路回车
$ ssh-keygen -t ed25519 -C "your-email"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Anthony/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/Anthony/.ssh/id_rsa.
Your public key has been saved in /c/Users/Anthony/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:IpMirm5XMasMF74a2ti1RSXZyiu35hORaYTYfkoWIz0 [email protected]
The key's randomart image is:
+---[RSA 2048]----+
| + . |
| o E .o |
| o =ooo |
| .+=*+ |
|. oo=+O.S |
|.o +.*.o |
| o+ * +. |
|o=.* =o. |
|*o= .oo. |
+----[SHA256]-----+
在本机(windows)的用户,你的用户下面有个.ssh
目录,生成了公钥私钥两个文件。
配置公钥
- 在GitHub的settings中,添加ssh key
- 将本地的公钥添加进去
添加成功。
配置私钥
在jenkins中,凭据管理下的凭据列表,添加一个凭据。
添加成功后的凭据列表:
使用凭据
如在job中:
错误参考:https://www.cnblogs.com/my_captain/p/11020381.html
配置python环境
不同的镜像依赖的基础镜像不同,导致容器内容的包管理工具也不同,如何查看以来的基础镜像:
[root@r docker_data]# docker exec -it -u root myjenkins bash
bash-4.4# cat /etc/issue
Welcome to Alpine Linux 3.9
Kernel \r on an \m (\l)
常见的基础镜像的包管理工具有:
- Alpine Linux 3.9:apk
- Debian:apt-get
- centos:yum
常用的apk的操作:
# 更新源列表
apk update # 更新最新镜像源列表
apk upgrade # 升级所有软件
apk upgrade openssh # 升级指定软件
apk upgrade openssh vim bash nginx # 升级多个软件
apk add --upgrade busybox # 指定升级部分软件包
# 搜索包
apk search # 查找所有可用软件包
apk search -v # 查找所用可用软件包及其描述内容
apk search -v ‘包名’ # 通过软件包名称查找软件包
apk search -v -d ‘docker’ # 通过描述文件查找特定的软件包
# 安装包
apk add 包名
apk add python3
apk add openssh # 安装一个软件
apk add openssh vim bash nginx # 安装多个软件
apk add --no-cache mysql-client # 不使用本地镜像源缓存,相当于先执行update,再执行add
apk add python3=3.6.9-r2
apk add python2=2.7.18-r0
# 查看包信息
apk info # 列出所有已安装的软件包
apk info -a zlib # 显示完整的软件包信息
apk info --who-owns /usr/sbin/nginx # 显示指定文件属于的包
# 删除包
apk del 包名
apk del openssh # 删除一个软件
apk del nginx mysql # 删除多个软件
# 配置源的方法
localhost:/etc/apk# vim /etc/apk/repositories
//阿里云源
http://mirrors.aliyun.com/alpine/v3.15/main
http://mirrors.aliyun.com/alpine/v3.15/community
# Alpine Linux服务管理
rc-update # 主要用于不同运行级增加或者删除服务。
rc-status # 主要用于运行级的状态管理。
rc-service # 主用于管理服务的状态
openrc # 主要用于管理不同的运行级。
# 重启网络服务: rc-service networking restart
# 列出所有服务: rc-status -a
更多参考:https://zhuanlan.zhihu.com/p/466105234
安装python3.6
- 更新源列表和安装依赖
bash-4.4# apk update -y
bash-4.4# apk add gcc
bash-4.4# apk add build-base
bash-4.4# apk add zlib-dev
- 安装python3
apk search python3
apk add python3=3.6.9-r2
- 测试安装成功:
bash-4.4# python3 -V
Python 3.6.9
bash-4.4# pip3 -V
pip 18.1 from /usr/lib/python3.6/site-packages/pip (python 3.6)
- 升级pip
pip3 install --upgrade pip
参考:
配置邮箱
能配置基础的邮箱和扩展邮箱
基础邮箱配置
在系统配置选项,下拉选择邮件通知选项:
如何配置?
- 在系统配置选项,配置系统管理员邮箱
- 配置邮件通知,按下图配置。
- 点击高级后,按下图配置
- 在项目中的构建后操作,选择
- 填写收件人列表,然后点击保存。
后续的构建中,在构建后的操作中,就会自动发邮件。
配置邮箱升级版
参考博客:https://www.cnblogs.com/Neeo/articles/12805815.html
邮箱HTML模板,后续会用到:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</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>
<td>
<h2>
<b>来自Jenkins的邮件通知</b>
</h2>
</td>
</tr>
<tr>
<td>
<br/>
<b style="color:#0B610B;">构建信息:</b>
<hr size="2" width="100%" align="center"/>
</td>
</tr>
<tr>
<td>
<ul>
<li>项目名称 : ${PROJECT_NAME}</li>
<li>触发原因 :${CAUSE}</li>
<li>构建日志 : <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>单元测试报告 :<a href="${BUILD_URL}allure/">${BUILD_URL}allureReport/</a></li>
<li>工作目录 : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
<li>测试报告下载 : <a href="${PROJECT_URL}">${PROJECT_URL}lastSuccessfulBuild/artifact/allure-report.zip</a></li>
</ul>
</td>
</tr>
<tr>
<td><b style="color:#0B610B;">构建日志:</b>
<hr size="2" width="100%" align="center"/>
</td>
</tr>
<tr>
<td><textarea cols="80" rows="30" readonly="readonly"
style="font-family: Courier New;width: 500px;max-width: 1000px;">${BUILD_LOG}</textarea>
</td>
</tr>
</table>
</body>
</html>
上面模板的含义参考可用变量列表:
- 首先要保证
Email Extension Plugin
已下载。
- 确认管理员邮件地址
- 填写smtp等信息,点击高级
- 按照下图配置
-
点击保存。
-
在项目构建后操作,选择高级邮箱配置
- 按照下图,点击高级设置
- 如下图,点击高级
- 如下图
- 点击保存即可。
注意,上述6~9
都是针对于该项目的特殊配置,如果没有特殊的配置,就是用系统配置中的相关参数。
配置java jdk/git/Allure Commandline
配置java jdk
-
找到容器内容的
JAVA_HOME
bash-4.4# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin
bash-4.4#
- 将
/usr/lib/jvm/java-1.8-openjdk
添加到管理 jenkins
--->全局工具配置
中的JDK选项中。
- 完事之后,下拉点击保存即可。
配置git
- 容器环境从软件中过滤出Git
bash-4.4# ls /usr/bin/git*
/usr/bin/git /usr/bin/git-lfs /usr/bin/git-receive-pack /usr/bin/git-shell /usr/bin/git-upload-archive /usr/bin/git-upload-pack
- 将
/usr/bin/git
软连添加到管理 jenkins
--->全局工具配置
中的git选项中。
- 下拉保存即可。
配置Allure Commandline
- 保证已经在插件中心下载了allure插件。
管理 jenkins
--->全局工具配置
中的Allure Commandline选项,点击添加 allure commandline。
- 按照下图配置即可。
部署一个自由风格的job
常用的操作:
- general,项目的描述信息,和基本的一些参数
- 源码管理,如何管理你的代码,从哪拉取,如何配置凭据。
- 构建触发器,你的项目如何运行?
- 执行一次
- 轮循执行
- 每一周,每一天,每一个月
- 构建环境,选择你的项目构建环境是,如ant
- 构建,如何执行你的项目,如何运行你的代码
- 执行shell
- Windows 终端
- .....
- 构建后的操作,当项目构建完毕后,要做什么事情
- 生成相关报告
- 发送相关的邮件
general
配置构建环境中的参数,后续再构建中,能直接是用的参数。
构建触发器
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
分 时 日 月 周
示例:
# 每天8:30分执行一次
30 08 * * *
# #每小时的3,15分组执行
3,15 * * * *
# 在上午8-11点的第3和第15分钟执行
3,15 8-11 * * *
更多参考:https://www.cnblogs.com/pyyu/articles/9355477.html
构建
点击添加构建步骤:
常用的有:
- linux:执行shell
- Windows:执行Windows批处理命令
构建后的操作
配置allure报告
allure commandline会自动从$ALLURE_HOME
目录读取json数据,生成allure报告。
注意,json数据目录在项目根目录下的allure-results
目录;生成的报告在项目根目录下的allure-report
目录中。我们可以通过在项目目录下看到。
邮件配置
如果在系统管理中,配置了邮件进阶版的相关参数,这里都选择默认即可。
项目的配置一览图
就差左下角的保存按钮了。
关于jenkins容器迁移
我已经将制作好的镜像上传到了docker hub上,咱们直接拉取即可:
docker pull wangzhangkai/jenkins:1.0
然后启动:
docker run \
-u root \
--name myjenkins \
--restart=always \
-d \
-p 6010:8080 \
-p 50000:50000 \
--env JAVA_OPTS="-Xmx1024m" \
-e JAVA_OPTS=-Duser.timezone=Asia/Shanghai \
-v /etc/localtime:/etc/localtime \
-v /tmp/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
wangzhangkai/jenkins:1.0
参考上述命令启动即可。
问题
HTTP ERROR 403 No valid crumb was included in the request
一般在提交的时候,遇到该问题。
解决,管理jenkins ----> 全局安全配置,下拉选择扩展请求保护,勾选启用代理兼容,下拉保存。
这么解决之后,可能会引发一个新的问题,匿名用户可以登录。
docker run \
-u root \
--name myjenkins \
--restart=always \
-d \
-p 6010:8080 \
-p 50000:50000 \
--env JAVA_OPTS="-Xmx512m" \
-e JAVA_OPTS=-Duser.timezone=Asia/Shanghai \
-v /etc/localtime:/etc/localtime \
-v /docker_data/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
wangzhangkai/jenkins:1.0