docker+jenkins+gitlab 自动化部署
一、什么是Jenkins?
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成( CI/CD)。
二、安装前说明
1、本次安装Jenkins和gitlab是基于docker,
2、需要安装docker环境、maven环境和jdk8。
三、Jenkins安装,配置也是基于docker
1、docker search jenkins
2、选择需要的Jenkins的版本
docker pull jenkins/jenkins
3、创建jenkins的挂载目录并授权
docker的实现实际上是创造了一个独立的容器环境,Jenkins在这个容器内运行,所以配置Jenkins时,需进入容器内,
虽然可以使用docker exec -it 【容器id】bash,命令进入容器内进行配置,但很多容器内不能用vi和vim命令。
如果我们在启动镜像时指定挂载目录,那麽在服务器本机与容器之间可以创建一个映射。
所以我们在服务器上先创建一个jenkins工作目录, /var/jenkins_mount,赋予相应权限,稍后我们将jenkins容器目录挂载到这个目录上,这样我们就可以很方便地对容器内的配置文件进行修改。
mkdir -p /var/jenkins_mount
chmod 777 /var/jenkins_mount
4、创建并启动Jenkins容器
docker run \
--privileged=true \
--restart=on-failure \
-itd \
-e JENKINS_OPTS='--prefix=/jenkins' \
-e TZ='Asia/Shanghai' \
-e JENKINS_ARGS='--prefix=/jenkins' \
-d -p 10240:8080 \
-p 50000:50000 \
-v /var/jenkins_mount:/var/jenkins_home \
-v /home/apache-maven-3.8.6:/usr/local/maven \
-v /etc/localtime:/etc/localtime \
--restart=always \
--name=jenkins \
jenkins/jenkins
下面是直定对应参数的意义:
-d 后台运行镜像
-p 10240:8080 意义: 将镜像的8080端口映射到服务器的10240端口。
-p 10241:50000 意义:将镜像的50000端口映射到服务器的10241端口
-v /var/jenkins_mount:/var/jenkins_mount
意义: /var/jenkins_home目录为容器jenkins工作目录,我们将硬盘上的一个目录挂载到这个位置,方便后续更新镜像后继续使用原来的工作目录。这里我们设置的就是上面我们创建的 /var/jenkins_mount目录
-v /etc/localtime:/etc/localtime 意义:让容器使用和服务器同样的时间设置。
-v /root/apache-maven-3.8.4:/usr/local/maven
意义:挂载本地maven,前面是服务器上的,后面是挂载到容器上的目录
–name myjenkins 意义:给容器起一个别名
问题记录:
1、我在docker run jenkins时未设置开机自动动,所以在第二次开机要重启jenkins
docker start 【容器名或者容器id】
2、新增设置开机自启动
docker update --restart=always 【容器名或容器id】
或者
docker container update --restart=容器名或容器id】
然后使用docker在后台启动jenkins镜像,注意maven一定要挂载,不然后面在容器里找不到maven。如何挂载请看上面注释,路径也要注意,我安装到了/home/apache-maven-3.8.4,根据自己的安装修改路径。
这里我没有挂载jdk,是因为centos自带jdk,所以在容器中使用自带的jdk。
3、可以通过docker ps 看看jenkins是否启动,如果未启动使用docker ps -a 查询所有的容器,找到对应jenkins的容器id,使用docker rm [容器ID]删除,再重新检查命令是否正确、端口等等问题,并启动镜像创建容器。
4、可以通过docker logs myjenkins命令查看日志,可以看到Jenkins就是一个Spring项目。
5、进入容器,检查一下maven是否挂载成功,进入容器的命令是docker exec -it 【容器ID】 bash,进入到我们刚才指定的Maven目录,也就是/usr/local/maven,可以看到确实有maven。
问题记录:
1、jenkins启动时出现如下问题:因为镜像源的问题超时,
docker logs -f jenkins #查看日志
2、进入Jenkins容器修改镜像源:
docker exec -it jenkins bash
这里发现进入容器用户改变了不是root,切换root用户后,输入密码不对,这里我没明白root的密码为什么不对,所以在进入容器时设置了用户参数:
docker exec -it -u root 容器id或容器名称
3、进入容器后没有vi和vim命令:
在网上查找了尝试了很多安装方式:
# 正常步骤:网上的很多这种方式都成功了,我的还是报错这里忘记截图了
1:apt-get update
2: apt-get install -y vim
然后更换镜像源:
# Aliyun Apt Source 阿里云镜像源
echo "deb http://mirrors.aliyun.com/debian/ bullseye main contrib" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/debian/ bullseye main contrib" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main contrib" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main contrib" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/debian/ bullseye-backports main contrib" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main contrib" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/debian/ bullseye-proposed-updates main contrib" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-proposed-updates main contrib" >> /etc/apt/sources.list
3、执行:apt-get update
4、如果不行则执行:apt-get upgrade
5、执行:apt-get install -y vim
6、apt-get install aptitude
7、成功以后使用: sudo aptitude install vim
这里的顺序可能写的有点问题,最后是安装成功了。
替换下载源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
这里还有一个问题:有的Jenkins镜像不用更换这里的下载源,也是可以的,我的这里遇到了这个问题
8、修改完后重启jenkins容器,因为我这里是用docker安装的,
所以用命令:docker restart jenkins
如果你不是用docker安装
用命令:systemctl restart jenkins
9、Docker ps 查看Jenkins服务正常。
四、配置Jenkins服务
1、启动好镜像我们就可以进行配置了,Jenkins是一个web服务,所以我们直接使用web端口访问即可。
由于我上面docker配置的是10240端口,直接访问10240端口即可,如果是云服务器,记得打开安全组的10240端口。
这里显示的是jenkins_home路径,前面我设定的目录是jenkins_mounts,所以我的密码放置目录是/var/jenkins_mount,在initialAdminPassword文件下可以看到密码。
2、使用“安装推荐的插件”,并创建账户.。
3、将信息输入对应输入框内,点击保存并完成,进入如下图所示
4、至此Jenkins搭建完成
5、点击保存,进入Jenkins。
6、设置Jenkins时区为北京时间,点击系统管理——脚本命令行
输入脚本并运行:
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
如图显示Result表示成功:
7、安装自动化构建和部署所需的插件
8、安装Maven插件:点击可选插件——过滤MavenIntegration插件——勾选Maven Integration和Pipeline Maven Integration——点击直接安装,
我这里已经安装好了,如图:
9、安装Gitlab插件:点击可选插件——过滤Gitlab插件——勾选Gitlab和Gitlab hook——点击直接安装
gitlab的插件我这里也已经安装好了
10、安装SSH插件和Publish Over SSH插件:点击可选插件——过滤SSH插件——勾选SSH和Publish Over SSH——点击直接安装
安装Publish Over SSH插件的原因:因为本方式是使用docker启动jenkin服务,所以在jenkins后续执行构建任务时候,需要在build成功后,将服务的jar包[以spring boot]服务为例,需要将jar包拷贝到Dockerfile所在服务器的指定目录,进行微服务的启动;所以,此处需要配置SSH服务器的连接,意思就是在jenkins的任务结束后,去执行指定的服务器上的shell命令,做spring boot或cloud服务的镜像的构建,容器的运行
11\、
插件全部安装完成后,重启Jenkins。
11、Jenkins全局工具配置
# Jenkins JDK默认位置
/opt/java/openjdk
# 也可以进入容器查看JDK位置
docker exec -it jenkins /bin/bash
which java
配置结果如下,若没有安装Maven可以到官网下载
# 根据需要下载对应版本
wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.8.4-bin.tar.gz
# 解压
tar -vxf apache-maven-3.8.4-bin.tar.gz
# 修改文件名
mv apache-maven-3.8.4 maven
# 将解压文件复制到容器内(jenkins只需要指定maven目录,不需要配置环境变量)
docker cp /home/docker/jenkins/maven docker-jenkins:/opt/
12、Jenkins添加服务器:
在这里插入图片描述
13、Jenkins添加凭证这里连接的是GitHub,因为我这里搭建的是gitlab,所以就没配置,还是记录一下这里的配置过程
Github主页头像 ⇢ setting Settings ⇢ Developer Settings ⇢ Personal access tokens (classic),因为我现在连接不上GitHub,所以这里也没截图。
五、Jenkins添加项目
1、我这里是下载了一套别人文档中的小霸王小游戏的代码
小霸王游戏项目下载链接:https://pan.baidu.com/s/1eDZoMkwq87gnmQ5Q5OyKJA?pwd=3vhb
和前面配置GitHub一样,我这里没配置:
现在保存,在Jenkins里面点击立即构建
接下来访问gitlab,进入到项目里面
点击高级,拉下来找到Generate并点击,生成一串Secret Token:54c55a6fa30f0cd64646ce68f3f48c9c
点击增加web钩子,如图成功添加了web钩子
测试push事件触发自动化构建和部署
前往gitlab,刚我们新增的webhook,点击test下拉选择push events,出现HTTP 200表示成功了。
我这里是简单测试下载部署了一个前端小霸王小游戏,这里再安装一个nginx,配置一下前端访问就可以了。
后记:
Jenkins JDK默认位置
/opt/java/openjdk
也可以进入容器查看JDK位置
docker exec -it docker-jenkins /bin/bash
which java
命令总结:
#查看某个镜像版本信息
docker search 镜像
#拉取镜像
docker pull 镜像
#列出已有镜像
docker images
#导出镜像
docker save REPOSITORY:TAG/镜像ID > /镜像路径/镜像.tar.gz
举例:docker save centos7:latest > /root/centos7.tar.gz
#导入镜像
docker load < /镜像路径/镜像.tar.gz
举例:docker load < /root/centos7.tar.gz
#移除镜像
docker rmi REPOSITORY:TAG/镜像ID
#运行容器方法一(守护进程)
docker run -d --name 容器取名 -p 宿主机端口:容器端口 --privileged=true REPOSITORY:TAG/镜像ID
#运行容器方法二(交互)
docker run -it --name 容器取名 -p 宿主机端口:容器端口 --privileged=true REPOSITORY:TAG/镜像ID /bin/bash
#查看容器正在启动情况
docker ps
#查看容器所有启动情况
docker ps -a
#进入容器
docker exec -it 容器名 /bin/bash
#退出容器
exit
#复制文件到容器中
docker cp /文件路径/文件 容器名:/存储路径
举例:docker cp /usr/local/setting.xml jenkins:/usr/local/apache-maven-3.3.9/conf
#启动容器
docker start 容器名/容器ID
#暂停容器
docker stop 容器名/容器ID
#移除容器
docker rm 容器名/容器ID
#一键启动、移除、暂停所有容器
docker start `docker ps -qa`
docker rm `docker ps -qa`
docker stop `docker ps -qa`
#批量删除tag为"<none>"镜像
docker rmi $(docker images | egrep '<none>' | awk '{print $3}')
#挂载 /opt/etc 前需要将目录下的文件复制到宿主机下,将 /opt/emqx/etc 目录下的文件复制到宿主机下
docker run --rm emqx/emqx:5.2.1 sh -c 'cd /opt/emqx && tar -c etc' | tar -C $PWD -x
#执行容器内部命令,检查nginx配置文件
docker exec -it nginx:latest nginx -t
#查询容器日志
docker logs -f -t --tail=500 容器名
#查看运行容器的挂载详细信息(-A:后面指定显示行数)
docker inspect 容器名 |grep Mounts -A 20
#dokcer开机自启某个容器
docker update --restart=always 容器名
#前提Docker服务开机自启
sudo systemctl enable docker.service
#创建文件
mkdir 文件名
#复制粘切文件
mv 原文件目录 目标文件目标
#删除文件
rm 删除文件目录
#删除文件夹
rm -rf 删除文件夹目录
#查看防火墙状态
systemctl status firewalld
#暂停防火墙状态
systemctl stop firewalld
#启动防火墙状态
systemctl start firewalld
#永久关闭防火墙(关机重启才会生效)
systemctl disable firewalld
#开放端口号
firewall-cmd --zone=public --add-port=端口号/tcp --permanent
firewall-cmd --reload
#移除端口号
firewall-cmd --zone=public --remove-port=端口号/tcp --permanen
#查看所有开放端口列表
firewall-cmd --zone=public --list-ports
#查看某应用进程
ps -ef | grep 应用名
#查看某端口
netstat -lnp|grep 端口名
#查找所有yum包
yum list all
#根据关键字查询
yum list all|grep 关键字
#安装基本依赖,wget 网页下载 lrzsz上传下载 bash-completion tab补全 vim 编辑器
yum install wget lrzsz bash-completion vim -y
#设置服务开机启动
chkconfig 服务名 on
#查找文件 /:从根目录开始找
find / -name 文件名
#安装zip解压
yum install unzip -y
#解压zip包
unzip 包名.zip
#查看内存占用情况
free -g
#查看硬盘内存
df -h