Docker搭建Jenkins、mysql、分布式自动化、镜像制作,及遇到的坑

一、Docker搭建Jenkins

查看所有Linux环境变量

$ env

1. Docker搭建Jenkins

# 拉取jenkins镜像
$ docker pull jenkins/jenkins

# 强制删除容器
$ docker rm -f myjenkins

# 新建jenkins_home文件夹
$ mkdir /home/wyt/jenkins_home

# 设置权限
$ sudo chown -R 1000:1000 /home/wyt/jenkins_home/

# 运行容器
$ docker run --name myjenkins -itd --network host -v /home/wyt/jenkins_home:/var/jenkins_home --env JAVA_OPTS="-Xmx2048m" jenkins/jenkins

# 后台启动-d,-it当前bash启动
$ docker run --name myjenkins -d -p 8080:8080 -p 50000:50000 -v /home/wyt/jenkins_home:/var/jenkins_home jenkins/jenkins

# 注意实际内存不要超过物理内存的一半
$ docker run --name myjenkins -itd -p 8080:8080 -p 50000:50000 -v /home/wyt/jenkins_home:/var/jenkins_home --env JAVA_OPTS="-Xmx8192m" jenkins/jenkins

PS:注意挂载权限:sudo chown -R 1000:1000 /home/wyt/jenkins_home/
  • 需要修改下目录权限,因为当映射本地数据卷时,/home/wyt/jenkins_home目录的拥有者为root用户,而容器中jenkins user的uid为1000
  • sudo chown -R 1000:1000 /home/wyt/jenkins_home/

jenkins启动脚本

#! /bin/bash
docker rm -f myjenkins
# docker run --name myjenkins -p 5003:8080 -p 5004:50000 jenkins
# docker run --mame myjenkins -itd -p 5003:8080 -p 5004:50000 --env JAVA_OPTS="-Xmx8192m" -v /home/wyt/jenkins_home:/var/jenkins_home jenkins:2.60.3
docker run --name myjenkins \
-d -p 8080:8080 \
-p 50000:50000 \
-v /home/wyt/jenkins_home:/var/jenkins_home \
-v /usr/local/apache-maven-3.6.3:/usr/local/apache-maven-3.6.3 \
-v /usr/local/allure-2.17.2:/usr/local/allure-2.17.2 \
--env JAVA_OPTS="-Duser.timezone=GMT+08 -Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m" jenkins/jenkins

进入容器交互

docker exec -it myjenkins bash

2. 四种网络模式

官方文档:https://docs.docker.com/network/
在这里插入图片描述
在这里插入图片描述

  • container
    使用--network=container:NAME_or_ID指定。与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。
  • briage 默认
    使用--network=bridge指定,默认网络。Docker启动后创建一个docker0的网桥,默认创建的容器也是添加到这个网桥中。
  • host 不用启动端口映射
    使用--network=host指定。容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主机的,容器除了网络,其他都是隔离的。
  • none
    使用--network=none指定。获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。
  • 自定义网络
    与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信。
    在这里插入图片描述
    在这里插入图片描述
    host模式:不用配置网络环境,直接使用宿主机的网络环境,应用场景:编译容器,git、svn上拉代码进行编译,需要ssh鉴权
    在这里插入图片描述

案例:搭建测试环境常用模式,前端不变,只更换后端服务
https://gitee.com/WeiboGe2012/conan
https://gitee.com/WeiboGe2012/holmes
conan镜像文件制作在8.2
holmes镜像文件制作在8.3

#! /bin/hash
docker rm -f holmes conan
# 应用briage模式暴露前端的服务
docker run --name=conan -d -p 8999:4200 conan
# 应用contoiner模式,将后端服务挂在conan上面
docker run --name=holmes -d --network=contoiner:conan holmes

3. Docker搭建Mysql

# 强制删除容器
$ docker rm -f some-mysal

# 搭建并连接MYSQL服务
$ docker run --name some-mysal -v /home/wyt/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=qwer1234 -p 8081:3306 -d mysql

# 下面不知道是什么
$ docker run -d --name test_sleep_infinity --link some-mysql centos sleep infinity

4. 搭建TESTLINK

老版本两个服务在同一台电脑上可以使用link
通过testlink容器 访问mariadb容器

# 强制删除
$ docker rm -f mariadb testlink

$ docker volume create --name mariadb_data
$ docker run -d --name mariadb \
-e ALLOW_EMPTY_PASSWORD=yes \
-e MARIADB_USER=bn_testlink \
-e MARIADB_PASSWORD=bitnami \
-e MARIADB_DATABASE=bitnami_testlink \
-v mariadb_data:/bitnami/mariadb \
-p 8081:3306 bitnami/mariadb:latest

# 使用--link的方式将mariadb注入,或者使用-e的方式将mariadb的环境变量注入
$ docker volume create --name testlink_data
$ docker run -d --name testlink \
-p 8082:8080 -p 8083:443 \
-e ALLOW_EMPTY_PASSWORD=yes \
-e TESTLINK_DATABASE_USER=bn_testlink \
-e TESTLINK_DATABASE_PASSWORD=bitnami \
-e TESTLINK_DATABASE_NAME=bitnami_testlink \
-v testlink_data:/bitnami/testlink \
--link mariadb bitnami/testlink:latest

访问http://localhost:8082
在这里插入图片描述

新版本两个服务不在同一台电脑上不可以使用link
通过testlink容器 访问mariadb容器
官方文档 https://registry.hub.docker.com/r/bitnami/testlink
第 1 步:创建网络

$ docker network create testlink-network

第 2 步:为 MariaDB 持久化创建一个卷并创建一个 MariaDB 容器

$ docker volume create --name mariadb_data
$ docker run -d --name mariadb \
  --env ALLOW_EMPTY_PASSWORD=yes \
  --env MARIADB_USER=bn_testlink \
  --env MARIADB_PASSWORD=bitnami \
  --env MARIADB_DATABASE=bitnami_testlink \
  --network testlink-network \
  --volume mariadb_data:/bitnami/mariadb \
  bitnami/mariadb:latest

第 3 步:为 TestLink 持久性创建卷并启动容器

$ docker volume create --name testlink_data
$ docker run -d --name testlink \
  -p 8082:8080 -p 8083:8443 \
  --env ALLOW_EMPTY_PASSWORD=yes \
  --env TESTLINK_DATABASE_USER=bn_testlink \
  --env TESTLINK_DATABASE_PASSWORD=bitnami \
  --env TESTLINK_DATABASE_NAME=bitnami_testlink \
  --network testlink-network \
  --volume testlink_data:/bitnami/testlink \
  bitnami/testlink:latest

在这里插入图片描述
https://localhost:8082
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 使用SELENIUM DOCKER(拉镜像)

https://registry.hub.docker.com/搜索对应版本的镜像

  • docker pull selenium/node-chrome-debug:3.141.59
  • docker pull selenium/hub:3.141.59

命令启动

$ docker rm -f hub chrome1 chrome2
$ docker run --name=hub \
-p 8081:4444 \
-e GRID_TIMEOUT=0 \
-e GRID_THROW_ON_CAPABILITY_NOT_PRESENT=true \
-e GRID_NEW_SESSION_WAIT_TIMEOUT=-1 \
-e GRID_BROWSER_TIMEOUT=15000 \
-e GRID_TIMEOUT=30000 \
-e GRID_CLEAN_UP_CYCLE=30000 \
-d selenium/hub:3.141.59

# 图形界面
# NODE_MAX_INSTANCES、NODE_MAX_SESSION,能够启动多少个浏览器
$ docker run --name=chrome1 \
-p 8082:5900 \
-e NODE_MAX_INSTANCES=6 \
-e NODE_MAX_SESSION=6 \
-e NODE_REGISTER_CYCLE=5000 \
-e DBUS_SESSION_BUS_ADDRESS=/dev/null \
-v /dev/shm:/dev/shm \
--link hub \
-d selenium/node-chrome-debug:3.141.59

VNC密码是:secret

访问http://localhost:8081
在这里插入图片描述
点击console
在这里插入图片描述
再添加10个

# 图形界面
# NODE_MAX_INSTANCES、NODE_MAX_SESSION,能够启动多少个浏览器
$ docker run --name=chrome2 \
-p 8083:5900 \
-e NODE_MAX_INSTANCES=10 \
-e NODE_MAX_SESSION=10 \
-e NODE_REGISTER_CYCLE=5000 \
-e DBUS_SESSION_BUS_ADDRESS=/dev/null \
-v /dev/shm:/dev/shm \
--link hub \
-d selenium/node-chrome-debug:3.141.59

返回在进入console
在这里插入图片描述

5. 分布式自动化demo

selenium/hub和selenium/node-chrome-debug在同一台电脑部署,可使用selenium.sh脚本

docker rm -f hub chrome1
docker run --name=hub \
-p 8081:4444 \
-e GRID_TIMEOUT=0 \
-e GRID_THROW_ON_CAPABILITY_NOT_PRESENT=true \
-e GRID_NEW_SESSION_WAIT_TIMEOUT=-1 \
-e GRID_BROWSER_TIMEOUT=15000 \
-e GRID_TIMEOUT=30000 \
-e GRID_CLEAN_UP_CYCLE=30000 \
-d selenium/hub:3.141.59

# 图形界面
# NODE_MAX_INSTANCES、NODE_MAX_SESSION,能够启动多少个浏览器
docker run --name=chrome1 \
-p 8082:5900 \
-e NODE_MAX_INSTANCES=6 \
-e NODE_MAX_SESSION=6 \
-e NODE_REGISTER_CYCLE=5000 \
-e DBUS_SESSION_BUS_ADDRESS=/dev/null \
-v /dev/shm:/dev/shm \
--link hub \
-d selenium/node-chrome-debug:3.141.59

selenium/hub和selenium/node-chrome-debug不在同一台电脑部署,可使用selenium.sh脚本
解决办法:
进入hub:docker exec -it hub bash
查看信息:env | grep HUB 或 env | grep GRID
把buh信息以-e的形式注入到chrome1启动

源码 https://gitee.com/WeiboGe2012/techUI
下载VNC viewer地址 https://www.realvnc.com/de/connect/download/viewer/

  • 安装VNC-Viewer-6.21.1109-Windows.exe
  • 打开VNC-Viewer
    在这里插入图片描述
  • 直接连接chrome端口
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 输入密码:secret
    在这里插入图片描述
  • 这就是连接好的图形界面,如果连接超时,需重启chrome1
    在这里插入图片描述
  • selenium/hub:3.141.59selenium/node-chrome-debug:3.141.59selenium-support:3.141.59(pom.xml文件)、selenide:5.24.2(pom.xml文件)版本对应,可查看maven中央仓库
  • 演示单个浏览器执行过程
    在这里插入图片描述
    在这里插入图片描述
  • 演示多个浏览器同时运行,以tests为单位,启动三个线程
    在这里插入图片描述
    在这里插入图片描述

6. 持续自动化集成(此版本jenkins不是docker版)

前提:
1、已安装maven环境
2、已安装allure环境
全局工具配置:maven
在这里插入图片描述
全局工具配置:allure
在这里插入图片描述
添加Allure插件
在这里插入图片描述
添加Maven Integration
在这里插入图片描述
添加git或gitee插件
在这里插入图片描述
创建techUI任务
在这里插入图片描述
在这里插入图片描述
下面这步有两种方式实现
方式一:走shell命令
在这里插入图片描述

#! /bin/bash

mvn clean test -DsuiteXmlFile=testng-parallel.xml

方式二:走maven命令
在这里插入图片描述
配置allure路径,就是项目target目录
在这里插入图片描述
保存,立即执行,查看VNC-Viewer有三个浏览器同时执行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三个浏览器执行时间
在这里插入图片描述

7. 持续自动化集成(此版本jenkins是docker版)

前提:
1、已安装maven环境
2、已安装allure环境
全局工具配置:maven
在这里插入图片描述
全局工具配置:allure
在这里插入图片描述
添加Allure插件
在这里插入图片描述
添加Maven Integration
在这里插入图片描述
添加git或gitee插件
在这里插入图片描述
创建techUI任务
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置allure路径,就是项目target目录
在这里插入图片描述
保存,立即执行,遇到问题:不执行测试用例,尚未解决,有解决的请留言
在这里插入图片描述

8. docker镜像制作

官方文档:https://docs.docker.com/engine/reference/builder/

8.1 创建dockerfile/Dockerfile文件

目录

$ cd dockerfile
$ ll
Dockerfile
entrypoint.sh

Dockerfile文件

# 继承centos镜像
FROM centos
# 将entrypoint.sh打入到镜像内root目录下面
ADD entrypoint.sh /root
# 只有在容器启动时生效,在容器内env查询不到
ENV JAVA_HOME=/usr/local/jdk1.8.0_231
ENV PATH=$JAVA_HOME:$PATH
# 安装git、vim,注意有多个都写在一个RUN指令里面,写多个RUN指令会有多个镜像层(例如在pull jenkins镜像时下载多少行就有多少层),实在不行才写多个RUN指令;/root/.bashrc环境变量,在容器内env可以查看到
# RUN yum install -y vim
RUN yum install -y git vim \
	&& echo "export JAVA_HOME=/usr/local/jdk1.8.0_231" >> /root/.bashrc \
	&& echo "export PATH=$JAVA_HOME:$PATH" >> /root/.bashrc
	
# 指定镜像启动时的脚本
ENTRYPOINT ["/bin/bash","/root/entrypoint.sh"]

entrypoint.sh保证进程不结束

#! /bin/bash

ping www.baidu.com
# 或
#/usr/sbin/sshd -0
#while true
#do
#	sleep 10
#done

执行命令制作镜像

$ cd dockerfile
# -f 
docker build -t 镜像名称 .

8.2 conan镜像制作

FROM centos:7

ADD entrypoint.sh /root

WORKDIR /root
USER root
	RUN yum install -y wget git \
	&& wget https://nodejs.org/dist/v16.13.1/node-v16.13.1-linux-x64.tar.xz \
	&& tar xvJf node-v16.13.1-linux-x64.tar.xz \
	&& cd node-v16.13.1-linux-x64 \
	&& ln -s /root/node-v16.13.1-linux-x64/bin/npm /usr/bin/ \
	&& ln -s /root/node-v16.13.1-linux-x64/bin/node /usr/bin/ \
	&& chmod 777 -R /root/node-v16.13.1-linux-x64 \
#	&& alias cnpm="npm --registry=https://registry.npm.taobao.org --cache=$HOME/.npm/.cache/cnpm --disturl=https://npm.taobao.org/dist --usrconfig=$HOME/.cnpmrc" \
#	&& npm --registry=https:.//registry.npm.taobao.org --cache=$HOME/.npm/.cache/cnpm --disturl=https://npm.taobao.org/dist --userconfig=$HOME/.cnpmrc i -g @angular/cli
	&& npm install -g cnpm --registry=https://registry.npm.taobao.org \
	&& export PATH=$(npm prefix -g)/bin:$PATH \
	&& echo "$(npm prefix -g)" \
	&& cnpm i -g @angular/cli
	
ENV PATH=/root/node-v16.13.1-linux-x64/bin:$PATH
ENTRYPOINTr ["/root/entrypoint.sh"]

8.3 holmes镜像制作

requirements.txt文件不确定是什么

FROM centos:7

ADD entrypoint.sh /root
ADD requirements.txt /root

WORKDIR /root
USER root
RUN yum install -y epel-release \
	&& yum install -y python34 git python34-setuptools python34-devel.x86_64 \
	&& easy_install-3.4 pip \
	&& yum install -y gcc \
	&& yum install -y soci-mysql-devel.x86_64 \
	&& ln -s /usr/local/mysql/bin/mysql /usr/bin \
	&& pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/


ENTRYPOINT ["/root/entrypoint.sh"]

遇到问题1

访问http://localhost:8080,报错:An error occurred during installation: No such plugin: cloudbees-folder
在这里插入图片描述
解决办法:
https://blog.csdn.net/DDJ_TEST/article/details/122210331

遇到问题2

在这里插入图片描述
重新启动连接的服务

遇到问题3

在这里插入图片描述
解决办法:
https://blog.csdn.net/DDJ_TEST/article/details/122133095

遇到问题4

在这里插入图片描述

解决办法:
https://blog.csdn.net/DDJ_TEST/article/details/122132581

遇到问题5

在这里插入图片描述
解决办法:
https://blog.csdn.net/DDJ_TEST/article/details/122164927

遇到问题6

在这里插入图片描述
解决办法:

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值