承接上文,本文使用jenkins和gitlab来实现Go项目的自动化部署。

安装Go

因为国内网络原因,无法直接通过jenkins从golang.org上直接下载安装go,这里使用自定义下载go安装包。

首先在jenkins安装go插件 Go Plugin

然后去全局工具配置,配置go。选择

Untitled

别名这里选择填go,也可以别的。

标签可以不填。

压缩包(二进制)的下载URL填了:https://golang.google.cn/dl/go1.17.1.linux-amd64.tar.gz,这是go国内的下载方式。

解压目录选择了默认目录:/var/jenkins_home/tools/org.jenkinsci.plugins.golang.GolangInstallation

最后go会安装在 解压目录/go/别名/ 下。

Untitled

项目配置

配置好之后,新建一个构建一个自由风格的软件项目

Untitled

然后在源码管理配置git

Untitled

设置构建触发器,当push事件发生时,gitlab通过webhook触发jenkins进行构建

Untitled

Untitled

在构建环境中设置go

Untitled

在构建中,新建执行shell,用户编译go

执行命令为:

export GOROOT=$JENKINS_HOME/tools/org.jenkinsci.plugins.golang.GolangInstallation/go/go
export GOPATH=$WORKSPACE
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOROOT/bin
export PATH=$PATH:$GOPATH/bin
export GOPROXY=https://goproxy.cn,direct
cd $WORKSPACE/go_test
go build -o ./go_test main.go

export设置go的环境变量,不然找不到go命令。 GOROOT=$JENKINS_HOME/tools/org.jenkinsci.plugins.golang.GolangInstallation/go/go为go的安装目录,这里使用了jenkins插件安装go的默认路径,$JENKINS_HOME为jenkins存储数据的绝对路径,docker中为 /var/jenkins_home$WORKSPACE为当前的工作目录的绝对路径 /var/jenkins_home/workspace/任务名

Untitled

在构建中新增一个Send files or execute commands over SSH。将编译好的包发送到部署服务器,并执行命令。

Remote directory填入/root/,表示把编译好的go程序发送到该目录。

在Exec command处填入:

systemctl stop go_test && cd  /home/go_test  && cp /root/go_test ./  && systemctl start go_test

但是需要注意的是,go编译好的可执行文件需要有可执行的权限,但是从jenkins发送过去的可执行文件是没有可执行的权限,所以如果直接用mv移动覆盖的话,新包会保留自己的权限,所以可以用cp复制的方式,新包就会保留原包的权限。

到此步就配置好了。

参考

掘金

Gitlab + Jenkins 构建,发布一个基于Go的Gin测试项目