目前我们公司手动部署项目流程复杂,常常因为粗心,或者部署中断导致出现各种莫名其妙的问题,在部署项目上浪费了大量的时间。
jenkins是一种持续化集成的工具,可将部署过程标准化,配置完毕后,大大降低部署的繁杂度,一键搞定所有流程,这里我们将介绍jenkins+go mod + gitlab私有仓库+docker的项目自动发布配置流程(github及其他git私有仓库也适用)。
目标部署服务器: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
添加目标部署服务器 SSH 登录账户(Username with password)
ssh 账户配置
gitlab api token 配置
gitlab api token
添加ssh账户,port为22
部署服务器账户配置
添加gitlab api token绑定私有仓库地址,credentials为步骤3.3的添加项
image.png
go 版本配置
image.png
Docker 配置
image.png
选择自由风格软件项目
image.png
General => GitLab Connection 选择之前添加的api token账户
image.png
一般docker image 都需要添加tag标记版本号,所以这里我们添加一个VERSION支持构建传参
image.png
添加需要自动化部署的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 为 检出本地分支
image.png
使用账户密码(如果之后编写的shell中涉及了仓库的操作,需要添加)
image.png
以下为构建成功后执行的部署服务器脚本,之前配置的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
image.png
选的go版本
image.png
以下为执行脚本,这里需要在仓库中编写好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
FROM golang:1.12.4 WORKDIR /app COPY myapp /app/ #需要暴露的端口,需要根据自己情况定制 #EXPOSE 80 # 启动执行的命令,需要根据自己情况定制 ENTRYPOINT ["./myapp"]
version: '3'
services:
driver:
image: 192.168.0.1:5000/xx/demo:${TAG}
container_name: demoSrv
ports:
- "80:80"