之前做了个qq机器人,添加新功能之后老是需要手动重新部署,尽管写了shell脚本来rebuild,但是还是手动啊!
so,有没有嘛工具可以让我提交完代码自动打包,自动部署运行?
这就想起来之前用的jenkins,但可惜没用过几次,加上过去两三年基本忘光了,这回捡起来再实操一下。
本文主要围绕jenkins来说明如何实现自动化部署步骤,不会详细说明docker还有github操作以及相关代码。
整体思路:
docker run -d --restart=unless-stopped --name jenkins_954L -u root \
-v $(which docker):/usr/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/local/dockerinfo/jenkins:/var/jenkins_home \
-p 28080:8080 -p 50000:50000 jenkinszh/jenkins-zh
稍微解释一下上述的关键命令
-u root
# 使用root身份去运行,避免无法执行宿主机的docker命令
-v $(which docker):/usr/bin/docker
# 将宿主机的docker命令目录挂载到jenkins容器内部
# $(which docker):动态获取当前docker命令目录
-v /var/run/docker.sock:/var/run/docker.sock
# 挂载docker容器进程通信文件到容器内
# docker.sock文件官方解释:It’s the unix socket the Docker daemon listens on by default and it can be used to communicate with the daemon from within a container.
-v /usr/local/dockerinfo/jenkins:/var/jenkins_home
# 挂载jenkins的数据目录
jenkinszh/jenkins-zh
# 为什么没用jenkins镜像,而用jenkins-zh?
# 看这个-zh也很明白了,这是中文的意思。
# 主要目的不止这个,因为jenkins的插件默认下载地址是:https://www.google.com/,这个在国内无法访问的。
# 而jenkins中文社区提供的-zh的镜像默认的下载地址是国内镜像地址。
# 也有很多别人基于jenkins二次打包,这些坑都填好了,但是我个人比较喜欢用官方的东西,不喜欢别人二次打包的镜像。
# 主要里面可能加了作者认为你需要但你并不需要的插件或者其他服务在里头,我比较喜欢自己搞。
# jenkins中文社区地址:https://jenkins-zh.cn/
挂载docker目录到jenkins内部的原因是因为我需要在jenkins容器里打包项目为docker镜像运行在宿主机的docker中。也就是说在jenkins的docker容器里操作宿主机的docker命令实现部署项目
接下来可直接访问:http://ip:28080/
首次访问需要验证一下文件,直接进入容器然后查看文件,把内容copy到输入框后敲回车即可
[root@VM_16_14_centos ssl_key]# docker exec -it jenkins_954L bash
root@b9cf4ff1c921:/# cat /var/jenkins_home/secrets/initialAdminPassword
步骤:Manage Jenkins -> Manage Plugins -> filter搜索:Chinese
进入jenkins容器输出jdk安装目录进行配置
[root@VM_16_14_centos ~]# docker exec -it jenkins_954L bash
root@cd7ea7fed8f4:/# echo $JAVA_HOME
/usr/local/openjdk-8
步骤:Manage Jenkins -> Manage Plugins -> filter搜索:Maven Integration
步骤:系统管理 -> Manage Credentials -> 点击提供者(jenkins)-> 点击全局凭证 -> 添加凭据
注:用户名跟密码并不是github的登陆账号密码,而是拉取git的用户名密码。
至于ID就随便填就行,这个是jenkins的凭证标识
1.选择:构建一个Maven项目
2.配置项目git仓库
Credentials选择刚刚在全局凭证添加的git用户
3.配置构建触发器
5分钟检查一次源码,有差异则执行任务构建
SCM 格式说明
首先格式为:* * * * (五个星)
第一个表示分钟,取值0~59
第二个表示小时,取值0~23
第三个表示一个月的第几天,取值1~31
第四个表示第几月,取值1~12
第五个表示一周中的第几天,取值0~7,其中0和7代表的都是周日
使用举例:
每隔10分钟构建一次:H/5 * * * *
每隔1小时构建一次: H H/1 * * *
每月30号构建一次: H H 30 * *
4.配置构建命令
5.将Dockerfile文件拷贝到jenkins容器内部
docker cp Dockerfile jenkins_954L:/var/jenkins_home/workspace/robot-954L/
/var/jenkins_home/workspace/:是jenkins的工作目录,每个任务对应下面一个子目录
Dockerfile内容
FROM java:8-alpine
ADD target/qq-robot.jar qq-robot.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/qq-robot.jar"]
#!/bin/bash
echo "开始构建robot-954L"
CID=$(docker ps | grep "qq-robot-server_954L")
if [ "$CID" != "" ];then
echo "删除现有容器"
docker stop qq-robot-server_954L
docker rm qq-robot-server_954L
fi
docker rmi qq-robot-server
echo "执行Dockerfile"
cd /var/jenkins_home/workspace/robot-954L
docker build -t qq-robot-server .
echo "构建容器"
docker run -d --restart=on-failure:3 --name qq-robot-server_954L -p 18080:8080 qq-robot-server
echo "执行完成"
一切顺利。当然有些坑,我自己填了。
接下来提交一下代码,看触发器是否生效,自动打包部署…这里就不演示了