目前我们公司手动部署项目流程复杂,常常因为粗心,或者部署中断导致出现各种莫名其妙的问题,在部署项目上浪费了大量的时间。
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"