案例:需求
在Docker容器中部署Jenkins,并通过外部机器访问Jenkins。
案例:实现步骤
1.搜索jenkins镜像 docker search jenkins/jenkins:2.426.2-lts
2.拉取jenkins镜像 docker pull jenkins/jenkins:2.426.2-lts
3.创建容器,设置端口映射
docker run -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /home/myjenkins/jenkins_home/:/var/jenkins_home -u root -d --name jenkins -p 8090:8080 jenkins/jenkins:2.426.2-lts
或者 vim docker-compose.yml
version: "3.1"
services:
jenkins:
image: jenkins/jenkins:2.426.2-lts
container_name: jenkins_2.426.2
ports:
- 8090:8080
- 50000:50000
volumes:
- /usr/bin/docker:/usr/bin/docker
- /var/run/docker.sock:/var/run/docker.sock
- /home/myjenkins/jenkins_home/:/var/jenkins_home
通过
docker-compose up -d
启动容器
可能报错:cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
原因: /home/myjenkins/jenkins_home/目录没有写入权限
解决方法:
chmod -R 777 /home/myjenkins/jenkins_home
- 参数 -d:表示后台运行,容器不会因为退出而停止。
- 参数 -u:表示以什么用户启动容器,这里是以root用户启动容器,这样后期操作容器不会出现权限不足的问题(笔者碰到过)。
- 参数 -p:表示端口映射,冒号左边是宿主机端口,右边是容器端口。端口映射后访问宿主机这个端口就相当于访问容器的这个端口。
- 参数 -v:表示文件/目录共享,专业来说叫数据卷。冒号左边是宿主机的目录,右边是容器目录,通过这种共享在容器启动后容器内的目录下的内容都会共享到宿主机的目录下,这样我们想要查询信息就会比较方便,就不需要再进入容器了。
- 参数 –-name:表示为容器起个名字,在容器比较多时使用名称可以很快的区分各个容器,注意这个参数是两个间隔符,不是一个。
这里执行的命令很简单,就是一个查看容器信息的ps命令,与linux中的ps差不多。那就解释下8080端口和50000端口吧。8080端口是管理控制台的端口,我们访问jenkins的控制台页面就是通过这个端口。至于50000端口也是必须的,50000端口是jnpl的端口,这要从jenkins是java实现的说起,我们可能会发现jenkins既然是java实现为什么安装jenkins后可以直接通过浏览器访问呢?而不需要tomcat等web服务器呢?这就是因为jnlp。jnlp可以让java程序直接通过浏览器来进行访问,就是访问web服务器一样。而这个50000端口就是因为这个开的。
创建完容器后可以使用这个命令查看初始密码
docker logs 容器名/id
docker logs -f jenkins_2.426.2
39ee08c9d44d3bccaecc41e70ebc65dd.png
中间那一串就是初始密码
若是隔了很久,用上面的命令可能看不到密码信息,我们还可以直接使用这个命令查看
cat /home/jenkins/secrets/initialAdminPassword
4.测试访问
http://192.168.8.109:8090/ (服务器IP:8090)
5.重新启动Jenkins容器后,由于Jenkins需要下载大量内容,但是由于默认下载地址下载速度较慢,需要重新设置下载地址为国内镜像站并修改数据卷中的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>
将下载地替换为http://mirror.esuni.jp/jenkins/updates/update-center.json
<?xml version='1.1encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<urI>http://mirror.esuni.jp/jenkins/updates/update-center.json</url》
</site>
</sites>
6.docker -> 宿主机 > jenkins 配合工作实现思路
思路整理
jenkins 通过docker进行部署
jenkins中使用docker
docker run 已经 docker-compse 完成测试
测试后生成allure,在Jenkins中展示
难点:
1.如何在jenkin执行docker
-v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock
2.容器中测试结果取回到Jenkins
-v /home/myjenkins/jenkins_home/:/var/jenkins_home
1.利用docker一键部署Jenkins
vim docker-compose.yml
version: "3.1"
services:
jenkins:
image: jenkins/jenkins:2.426.2-lts
container_name: jenkins_2.426.2
ports:
- 8090:8080
- 50000:50000
volumes:
- /usr/bin/docker:/usr/bin/docker
- /var/run/docker.sock:/var/run/docker.sock
- /home/myjenkins/jenkins_home/:/var/jenkins_home
2.在jenkins中执行docker
1.思路
1.Jenkins中安装docker客户端,使用第三方的docker --> 需要付费
2.Jenkins中安装docker客户端,另一个容器中安装docker服务 --> docker-in-docker,需要特权模式,或者第三方的工具
3.Jenkins中什么都不装,直接使用宿主机的docker服务
2.实现第三种
优点:简单、方便、直观
缺点: jenkins可以全权的管理所有的容器(包括Jenkins自己),有隐含安全风险
docker凭什么来运行?
docker-cli (客户端)
docker.scok (类似socket请求)
docker-server (服务端)
1.列出依赖文件的路径
which docker
/usr/bin/docker
ls /var/run/docker.sock
/var/run/docker.sock
2.为Jenkins添加启动参数,实现文件的挂载
docker run -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /home/myjenkins/jenkins_home/:/var/jenkins_home -u root -d --name jenkins -p 8090:8080 jenkins/jenkins:2.426.2-lts
进入到jenkins容器内部 docker exec -it jenkins bash
输入 docker --hello 验证此时的 jenkins 已经可以执行宿主机的 docker 了。
3.基于docker的Web自动化测试
pytest+selenium +allure Web自动化测试
docker run --shm-size 2G ccr.ccs.tencentyun.com/beifan/ui_framework:v1 # 启动一个容器,给容器分配2G的内存
4.生成allure报告
1.不知道allure测试结果在哪里
2.不知道allure测试结果权限是什么
目标:
自动化测试结束后,自动把测试结果放到指定的位置
docker -> host > jenkins
1.重启Jenkins,挂载host目录
-v /home/myjenkins/jenkins_home/:/var/jenkins_home # 为了拿到测试结果 --> allure测试报告
docker run -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /home/myjenkins/jenkins_home/:/var/jenkins_home -u root -d --name jenkins -p 8090:8080 jenkins/jenkins:2.426.2-lts
2.重启docker,挂载host目录
挂载前为目录设置好权限:sudo chmod 777 /home/myjenkins/jenkins_home/aaffox/ # 给共用数据卷目录aaffox 设置权限 允许任何人访问
-v /home/myjenkins/jenkins_home/aaffox/:/app/.allure_results # 挂载数据卷的方式 拿到项目测试最总结果文档 allure测试报告 这样jenkins也能拿到这个测试报告了
# 通过docker 启动自定义镜像 生成容器运行测试 生成测试报告
docker run -v /home/myjenkins/jenkins_home/aaffox/:/app/.allure_results --shm-size 2G ccr.ccs.tencentyun.com/aaffox/ui_framework:v1
1.在web自动化测试docker中生成了allure测试结果
2.在host中可以看到测试结果吗? /home/ubuntu/myjenkins/jenkins_home/aaffox/
3.在jenkins可以看到测试结果吗? /var/jenkins_home/aaffox
jenkins中新建任务,风格选自由的,build --> command:
mkdir -p allure-results && chmod 777 allure-results \
docker run -v /home/myjenkins/jenkins_home/workspace/$JOB_NAME/allure-results:/app/.allure_results --shm-size 2G ccr.ccs.tencentyun.com/aaffox/ui_framework:v1
启用allure报告:Post-build Actions --> Allure Report --> Results: --> path --> 填写 allure-results 保存即可
5.构建的触发自动化
两种方式:
定时:隔多长时间执行一次 (这种方式太傻了!)
Build Triggers --> Build periodically --> Schedule -->
hook:主动触发构建 (这种就更灵活一些!)
1.开发更新代码
2.触发web hook
3.Jenkins收到web hook
4.开始执行构建
Source Code Management --> Git --> Repository URL 填写代码仓库地址
Build Triggers --> 勾选 GitHub hook Trigger for GITScm polling 之后 点保存
测试开发团队: 编写自动化测试框架->打包成镜像 ->托管到jenkins
业务开发团队: 编写业务代码 ->上传到git
Jenkins: 发现业务代码更新,执行自动化测试任务、生成allure测试报告
Jenkins插件安装
Git Parameter --> 用于从gitlab拉取代码
- 把 jdk1.8.0_371 和 apache-maven-3.9.4 都复制到 /home/myjenkins/jenkins_home 目录 并分别改名 jdk 和 maven
- 由于jenkins构建时 -v /home/myjenkins/jenkins_home/:/var/jenkins_home 做过数据卷映射 ,所以把 jdk 和 maven 放到这个目录下,
- 具体目录信息在jenkins中配置好之后(配置容器内的相对路径:/var/jenkins_home/jdk、/var/jenkins_home/maven)jenkins就可以调用他们工作了。。。
image.png
image.png
publish Over SSH --> 使jenkins可以连接上某个服务器去部署代码
Dashboard --> configuration --> SSH Servers 设置服务器别名、IP、用户名、远程服务器目录(后期jenkins要把代码部署到哪个目录去执行) --> 点高级选项 设置密码 --> 勾选 Use password authentication,or use a different key 设置密码 --> Test Configuration 测试配置是否正确 --> 应用保存








网友评论