docker 搭建jenkins 拉去gitlab代码 部署golang 到服务器运行
docker pull jenkins/jenkins:2.409
docker run --name jenkins -u root -d -p 8080:8080 -p 50000:50000 -v /home/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins
#上面 拉取镜像和启动jenksin , 指定拉取2.409版本的 不然可能git插件会装不上
# 然后运行http://192.168.80.128:8080/ 就可以进入jenkins界面了 一路ok就行(不清楚这里可以百度下 可以参考docker安装jenkins - 知乎 (zhihu.com))
# 上面步骤没问题后 进入jenkins容器 安装go环境 用于后面go打包等go相关操作
#
#
# jenkins容器自动部署主要原理:jenkins容器从git拉取代码到容器指定目录 然后运行jenkins里面的shell脚本(进入代码目录进行打包等操作),然后发送命令到宿主机执行宿主机上的shell (把容器里面打包好的go可执行代码 运行起来)
#
#
配置jenkins实现部署
零、
安装相关插件 第一个是为了部署时可以选择git多分支 第二个是为了配置git仓库的 (下面都会用到)
一、
新增一个任务
二、这一步是为了后面部署git代码的时候可以选择不同的分支,“branch” 这个值随便取一个名字就行,第四步会用到。按照下面步骤操作就行
三、上一步添加完“git参数后”又选择“选项参数”继续操作,这一步是为了后面部署git代码的时候可以选择不同的环境,”ENV“也是随便取名 shell脚本会用到(比如发布到正式环境或者测试环境,这一步的原理就是执行的shell的命令不一样,结合后面的shell就能看懂了)
四、这一步添加git仓库地址(需要先安装git插件 可以看第零步)。需要选添加凭证,这里的用户和密码是登录gitlab的用户名和密码。这里仓库地址使用http格式。
五、下拉选择 "执行shell" 这一步是jenkins拉取代码后 需要执行的shell脚本(脚本放在最后)
*BUILD_ID=DontKillMe (这一行必须加上 不然会不成功 - 用于解决构建完自动杀掉衍生进程问题)
*图中第二行是可以把下面那些shell脚本放到容器里面.sh文件里面 执行看着简洁一点
六、上面配置完保存 点击Build with Parameters 就可以选择不同环境和不同分支构建部署代码了
七、构建失败可以点进去看 控制台输出
八、需要对不同用户进行权限控制可以使用 ”Role-based Authorization Strategy“ 插件 自行百度,可以控制一些用户只能看见某些项目和只有查看和构建权限 不能进行修改配置等操作
九、
jenkins的sh脚本 上面配置的ENV变量 在这里面用来判断是发布到正式环境还是测试环境(本shell都是一个服务器 只是执行的sh变了 用作测试 实际应该是不同的服务器)
BUILD_ID=DontKillMe #sh /var/jenkins_home/workspace/tml/test.sh # *********** 这个sh脚本是在docker容器里面执行的 *********** # #!/bin/bash # 当前sh脚本是 jenkins从git拉取代码到/var/jenkins_home/workspace(这是容器里面的路径 宿主机具体看映射) 工作台后 才会执行的 # /var/jenkins_home/workspace:这是容器里面的路径.宿主机具体看映射,本例是/home/jenkins_home/workspace go_bin_path="/var/jenkins_home/go/go/bin" # 进入对应项目 cd /var/jenkins_home/workspace/tml # 设置环境变量 go mod会快一点 $go_bin_path/go env -w GOPROXY=https://goproxy.cn # 设置环境变量 go mod 拉去库 $go_bin_path/go mod tidy # 设置环境变量 库同步到项目的vendor $go_bin_path/go mod vendor # 删除go的旧包 rm -rf /var/jenkins_home/tml/tml-linux # 打包go到指定文件夹 $go_bin_path/go build -o /var/jenkins_home/tml/tml-linux /var/jenkins_home/workspace/tml/main.go # 给新包赋值权限 chmod -R 775 /var/jenkins_home/tml/tml-linux if [ $ENV = "pro" ] then # 让宿主机执行某一个sh脚本 (这个sh脚本是在宿主机上 主要功能在下面) echo "执行pro 操作 " nohup sshpass -p root ssh root@192.168.80.128 "sh /home/work/tml/commands.sh" >> /var/jenkins_home/tml/output.log & else # 让宿主机执行某一个sh脚本 (这个sh脚本是在宿主机上 主要功能在下面) echo "执行test 操作 " nohup sshpass -p root ssh root@192.168.80.128 "sh /home/work/tml/commands_test.sh" >> /var/jenkins_home/tml/output.log & fi
宿主机的sh脚本 (上面sh脚本里的commands.sh的内容 主要是重启golang代码)
# *********** 这个sh脚本是在宿主机上执行的 *********** # #!/bin/bash # 杀死旧的go进程 pkill -9 tml-linux # 删除宿主机上的旧包 rm -rf /home/work/tml/tml-linux # 复制jenkins容量里面脚本打出的新包 到指定地点 (这里复制的源文件是宿主机上的 因为容器映射了文件夹出来/var/jenkins_home:/home/jenkins_home) cp /home/jenkins_home/tml/tml-linux /home/work/tml/ # 执行 cd /home/work/tml/ && ./tml-linux