使用 Jenkins 部署 Golang 程序


说明

  • 单机部署 Jenkins 和服务。

部署 Jenkins

注意事项

  1. 需要先安装 Java 运行环境

在 Github 创建仓库并上传 Golang 程序

示例仓库:https://github.com/sincerefly/simple-web-server 代码来自 Echo 的 Demo,启动服务后访问 1325 端口能输出 "Hello, World!"

func main() {
  // Echo instance
  e := echo.New()

  // Middleware
  e.Use(middleware.Logger())
  e.Use(middleware.Recover())

  // Routes
  e.GET("/", hello)

  // Start server
  e.Logger.Fatal(e.Start(":1325"))
}

// Handler
func hello(c echo.Context) error {
  return c.String(http.StatusOK, "Hello, World!")
}

新增一个 Makefile,便于更统一的管理构建命令。

bl_linux:
    CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -o bin/bark-send-linux

创建 supervisor 任务(非必须) 使用 supervisor 管理机器上运行的服务,服务管理会很方便

# 启动
sudo supervisorctl start simple-web

# 停止
sudo supervisorctl stop simple-web

新增配置

/etc/supervisord.d/simple-web.ini

[program:simple-web]
process_name=%(program_name)s
command=/opt/simple-web/simple-web-linux
directory = /opt/simple-web
autostart=true
autorestart=true
user=opc
redirect_stderr=true
stdout_logfile=/opt/simple-web/app.log
stopwaitsecs=3600

现在还不能启动服务,手动将程序放置在 /opt/simple-web/simple-web-linux

此时我们查看一下可执行程序的 sha256sum 摘要信息

然后加载 supervisor 的配置,接着会启动。

sudo supervisorctl update

现在简易的 web 服务跑起来了,接着配置 Jenlins,使其通过 Jenkins 进行 build 和部署。

配置 Jenkins Go 插件

使用 Jenkins 编译 Golang 程序,需要安装 Go 插件,在 “系统管理” - “插件管理”,搜索 golang 插件进行安装,安装后等待 Jenkins 重启

而后到 “系统管理” - “🔧全局工具配置” 配置 Go 插件

注意到这里的别名 go1.18,后续 Jenkins 脚本会用到。

创建 Jenkins 任务

创建了一个名为 “simple-web” 的多分支流水线,简单填写描述等信息

分支源填写刚刚的 Github 仓库地址:https://github.com/sincerefly/simple-web-server

因为是 public 仓库,所以不用配置权限,通过 HTTPS 的地址直接能拉取

保存后会触发检测,提示没有在仓库中发现 Jenkinsfile,这个文件定义 Jenkins 的行为(可以简单理解为执行各种命令)

编写 Jenkinsfile

这是一个简单的 Jenkinsfile 配置,将它提交到 simple-web-server 仓库的根目录下。

pipeline {
    // install golang 1.18 on Jenkins node
    agent any
    tools {
        go 'go1.18'
    }
    environment {
        GO114MODULE = 'on'
        CGO_ENABLED = 0
        GOPATH = "${JENKINS_HOME}/jobs/${JOB_NAME}/builds/${BUILD_ID}"
    }
    stages {
        stage("Build") {
            steps {
                echo 'BUILD EXECUTION STARTED'
                sh 'go version'
                // 执行 Makefile 中的命令
                sh 'make bl_linux'
                // 将 build 后的文件保存
                archiveArtifacts artifacts: 'bin/*', fingerprint: true
                sh 'sudo supervisorctl stop simple-web'
                sh 'sudo cp bin/simple-web-linux /opt/simple-web/simple-web-linux'
                sh 'sudo supervisorctl start simple-web'
            }
        }
    }
}

补充

手动触发 Jenkins 构建

在 Github 仓库提交 Jenkinsfile 后,点击项目下的 “立刻扫描仓库”,查看日志会看到

‘Jenkinsfile’ found

同时,为了便于查看构建的程序替换了原有程序,将返回值修改为 “Hello, World! -- 2”,提交代码。

接着回到流水线任务的首页

点击绿色的按钮开始构建,页面左侧的构建任务,点击可以查看进度

构建完成后,在服务器上查看程序文件的 sha256sum,发生了变化。

同时,返回值也是最新的提交

归档的文件

Jenkinsfile 中的 archiveArtifacts 指令可以将 build 后的文件保存

archiveArtifacts artifacts: 'bin/*', fingerprint: true

后续

本篇文章对 Jenkins 使用做了简单的梳理,后续会学习汇总如下内容

  1. Jenkins 手动选择分支、Tag 进行部署。
  2. 设置 Jenkins 指定分支,当提交代码后自动触发构建部署。