前言
目前我们公司手动部署项目流程复杂,常常因为粗心,或者部署中断导致出现各种莫名其妙的问题,在部署项目上浪费了大量的时间。
jenkins是一种持续化集成的工具,可将部署过程标准化,配置完毕后,大大降低部署的繁杂度,一键搞定所有流程,这里我们将介绍jenkins+go mod + gitlab私有仓库+docker的项目自动发布配置流程(github及其他git私有仓库也适用)。
准备
- docker-registry搭建
- go mod私有仓库管理
- jenkins安装(需要配置jenkins docker.sock)
开始
目标部署服务器:192.168.0.1
构建服务器:192.168.0.2
# 这里先用docker安装jenkins,因为可以忽略不同环境带来的影响
docker run \
-u root \
-d \
-p 8080:8080 \
-p 50000:50000 \
-e TZ="Asia/Shanghai" \
--name jenkins \
-v /var/jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/usr/bin/docker \
jenkins/jenkins:lts
1. jenkins plugin 插件管理安装以下配置
- Docker_plugin
- GitLab
- GitLab API
- Go Plugin
- SSH plugin
2. jenkins 多类账户配置
-
添加目标部署服务器 SSH 登录账户(Username with password)
- gitlab私有仓库账户配置(Username with password,用于拉取仓库代码)
-
gitlab api token 配置
3. 系统设置
- SSH remote hosts
添加ssh账户,port为22
- gitLab
添加gitlab api token绑定私有仓库地址,credentials为步骤3.3的添加项
4. 全局工具配置
-
go 版本配置
-
Docker 配置
5. 新建部署任务
-
选择自由风格软件项目
-
General => GitLab Connection 选择之前添加的api token账户
- 添加参数化构建
一般docker image 都需要添加tag标记版本号,所以这里我们添加一个VERSION支持构建传参
- 添加git仓库
添加需要自动化部署的git仓库,这里选用3.2中添加的gitlab账户
Branches to build为选择仓库的分支,这里默认为master
Additional Behaviours中添加clean brfore checkout,check out to a sub-driectory(迁出的目录)
check out to specific local branch 为 检出本地分支
-
使用账户密码(如果之后编写的shell中涉及了仓库的操作,需要添加)
- 添加部署服务器的SSH 及脚本
以下为构建成功后执行的部署服务器脚本,之前配置的VERSION参数在这边是有效的,
部署服务器我们使用的docker-compose启动,docker-compose动态参数.env的概念自行查找,
这里不做赘述。
cd /xx/demo
echo TAG=$VERSION >> .env
docker-compose config
docker pull 192.168.9.129:5000/xx/demo:$VERSION
docker rm -f demoSrv
sleep 5
docker-compose up -d
-
选的go版本
- 添加执行shell
以下为执行脚本,这里需要在仓库中编写好dockerfile,并且已经部署好docker registry
cd $WORKSPACE
# 以下为需要处理git私有仓库的权限的指令,因为下面我们将会拉取其他的私有仓库
git config --global url."https://gitlab.xx.com/".insteadOf "ssh://git@gitlab.xx.com:"
git config --global credential.username $USER
git config --global credential.helper "!echo password=${PSWD}; echo"
# 因为我们使用的go mod管理,另外依赖了另外一个私有仓库“pbmanage”,该私有仓库依赖了"protobuf",
# 所以我们先用代理将"protobuf"库提前拉倒本地,这样才能将私有仓库在非代理的情况下go get到
# 否则将会因为一些国内无法直接拉取的仓库阻塞,致使构建失败
export GOPROXY=https://goproxy.io
go get -v `cat go.mod | grep "protobuf" | sed 's/ /@/'`
# 取消代理,拉取私有仓库,这里会使用到git config --global的配置,并且只拉一个私有仓库,
# 所以私有仓库的依赖最好不要太复杂,会增加构建脚本的编译难度
export GOPROXY=
go get -v `cat go.mod | grep "pbmanage" | sed 's/ /@/'`
# 私有依赖仓库拉完后,将开源仓库go mod tidy一下
export GOPROXY=https://goproxy.io
go mod tidy
# 打印依赖,部署成功后查看版本依赖是否如预期
cat ./go.mod
cd ./cmd/userSrv
# linux环境编译
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o myapp
# 构建docker镜像,项目中需要在当前目录下有dockerfile,否则构建失败
docker build -t 192.168.0.1:5000/xx/demo:$VERSION .
rm -rf myapp
# 将docker镜像推送到部署服务器的私有仓库
docker push 192.168.0.1:5000/xx/demo:$VERSION
git仓库中的dockerfile
FROM golang:1.12.4
WORKDIR /app
COPY myapp /app/
#需要暴露的端口,需要根据自己情况定制
#EXPOSE 80
# 启动执行的命令,需要根据自己情况定制
ENTRYPOINT ["./myapp"]
目标服务器指定目录的docker-compose
version: '3'
services:
driver:
image: 192.168.0.1:5000/xx/demo:${TAG}
container_name: demoSrv
ports:
- "80:80"
有疑问加站长微信联系(非本文作者)