jenkins+golang+gitlab/github私有仓库+docker自动化发布

前言

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

  1. 添加目标部署服务器 SSH 登录账户(Username with password)


    ssh 账户配置
  2. gitlab私有仓库账户配置(Username with password,用于拉取仓库代码)
  3. gitlab api token 配置


    gitlab api token

3. 系统设置

  1. SSH remote hosts

添加ssh账户,port为22


部署服务器账户配置
  1. gitLab

添加gitlab api token绑定私有仓库地址,credentials为步骤3.3的添加项


image.png

4. 全局工具配置

  • go 版本配置


    image.png
  • Docker 配置


    image.png

5. 新建部署任务

  1. 选择自由风格软件项目


    image.png
  2. General => GitLab Connection 选择之前添加的api token账户


    image.png
  3. 添加参数化构建

一般docker image 都需要添加tag标记版本号,所以这里我们添加一个VERSION支持构建传参


image.png
  1. 添加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 为 检出本地分支

image.png

  1. 使用账户密码(如果之后编写的shell中涉及了仓库的操作,需要添加)


    image.png


  1. 添加部署服务器的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
image.png
  1. 选的go版本


    image.png
  2. 添加执行shell

以下为执行脚本,这里需要在仓库中编写好dockerfile,并且已经部署好docker registry

cd $WORKSPACE
# 以下为需要处理git私有仓库的权限的指令,因为下面我们将会拉取其他的私有仓库
git config --global url."https://gitlab.xx.com/".insteadOf "ssh://[email protected]:"
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 ./xx/demo
# 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"

你可能感兴趣的:(jenkins+golang+gitlab/github私有仓库+docker自动化发布)