转载

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)

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

    ssh 账户配置

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

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

    gitlab api token

3. 系统设置

  1. SSH remote hosts

添加ssh账户,port为22

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

部署服务器账户配置

  1. gitLab

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

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

image.png

4. 全局工具配置

  • go 版本配置

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

    image.png

  • Docker 配置

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

    image.png

5. 新建部署任务

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

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

    image.png

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

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

    image.png

  3. 添加参数化构建

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

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

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 为 检出本地分支

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

image.png

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

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

    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
jenkins+golang+gitlab/github私有仓库+docker自动化发布

image.png

  1. 选的go版本

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

    image.png

  2. 添加执行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"
原文  https://studygolang.com/articles/23585
正文到此结束
Loading...