说明
- 单机部署 Jenkins 和服务。
部署 Jenkins
- Ubuntu 20.04 参考 how-to-install-jenkins-on-ubuntu-20-04
- Centos 7 参考 how-to-install-jenkins-on-centos-7-or-rhel-7
注意事项
- 需要先安装 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'
}
}
}
}
补充
- 最上边儿指定的 Go 版本是在配置插件时指定的。
- archiveArtifacts 非必须,设置后可以在构建后保存下文件,以便下载。
- 脚本中通过 supervisor 停止服务,将二进制可执行程序替换后重启启动。
- 脚本中执行了原生的 linux 命令,sudo 命令 Jenkins 直接执行会报错,参考 Jenkins 执行sudo 无法输入密码no tty present and no askpass program specified解决方法 修改。
手动触发 Jenkins 构建
在 Github 仓库提交 Jenkinsfile 后,点击项目下的 “立刻扫描仓库”,查看日志会看到
‘Jenkinsfile’ found
同时,为了便于查看构建的程序替换了原有程序,将返回值修改为 “Hello, World! -- 2”,提交代码。
接着回到流水线任务的首页
点击绿色的按钮开始构建,页面左侧的构建任务,点击可以查看进度
构建完成后,在服务器上查看程序文件的 sha256sum,发生了变化。
同时,返回值也是最新的提交
归档的文件
Jenkinsfile 中的 archiveArtifacts 指令可以将 build 后的文件保存
archiveArtifacts artifacts: 'bin/*', fingerprint: true
后续
本篇文章对 Jenkins 使用做了简单的梳理,后续会学习汇总如下内容
- Jenkins 手动选择分支、Tag 进行部署。
- 设置 Jenkins 指定分支,当提交代码后自动触发构建部署。