环境搭建
项目初始化
初始化开发目录
cd $GOPATH/src
mkdir go-web-docker
cd go-web-docker
go mod init github.com/YOUR_GITHUB_USER/YOUR_REPOSITORY_NAME
# (example: go mod init github.com/pdslly/go-web-docker)
初始化 GITHUB 仓库
git init
git branch -M main
git remote add origin git@github.com:YOUR_GITHUB_USER/YOUR_REPOSITORY_NAME
# (example: git remote add origin git@github.com:pdslly/go-web-docker)
编写主程序文件
main.go 主程序文件
package main
import (
"net/http"
"os"
"github.com/gin-gonic/gin"
_ "github.com/joho/godotenv/autoload" //自动加载env文件
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "hello world"})
})
r.Run(os.Getenv("APP_PORT"))
}
.env 环境配置
APP_PORT=:8080
执行本地测试
go run .
浏览器访问 http://localost:8080
,截图如下
Jenkins 构建配置
新建 jenkins 任务
任务类型选择流水线(Pipeline)
配置 Jenkinsfile
如果您不熟悉 Jenkins 流水线配置,可以访问 流水线语法参考
pipeline {
agent none
stages {
stage('Build') {
agent {
docker {
image 'golang:1.14.2' // 构建镜像
args '-e GOPROXY=https://goproxy.io -e GO111MODULE=on -e CGO_ENABLED=0 -e GOOS=linux -e GOARCH=amd64 -v /var/jenkins_home/workspace/go-web-docker:/go/src/app'
}
}
steps {
sh 'go build -o app' // 构建app可执行程序
}
}
}
}
提交代码到 GITHUB 仓库,执行构建
如果不出意外,您将会看到下面的执行结果
服务器端配置 Docker 容器
链接您的服务器,进入 go-web-jenkins 工作目录,您将看到打包的 app 可执行文件
docker run \
-d \ # 设置后台运行
--name webapp --rm \ # 设置容器名称webapp
-p 8000:8080 \ # 端口映射,宿主端口8000 容器端口8080
-v $(pwd):/home/go-web-docker # 挂载数据卷
-w /home/go-web-docker \ # 设置工作目录
-e GIN_MODE=release # 声明环境变量
busybox /home/go-web-docker/app # 镜像为busybox 执行app可执行文件
执行结果如下图
浏览器访问测试
Jenkins 部署配置
添加如下脚本到 Jenkinsfile
stage('Deploy') {
agent any
steps {
sh 'docker restart webapp' // 重启name为webapp的容器
}
}
完整 Jenkinsfile 配置如下
pipeline {
agent none
stages {
stage('Build') {
agent {
docker {
image 'golang:1.14.2' // 构建镜像
args '-e GOPROXY=https://goproxy.io -e GO111MODULE=on -e CGO_ENABLED=0 -e GOOS=linux -e GOARCH=amd64 -v /var/jenkins_home/workspace/go-web-docker:/go/src/app'
}
}
steps {
sh 'go build -o app' // 构建app可执行程序
}
}
stage('Deploy') {
agent any
steps {
sh 'docker restart webapp' // 重启name为webapp的容器
}
}
}
}
修改 main.go 代码测试
package main
import (
"net/http"
"os"
"github.com/gin-gonic/gin"
_ "github.com/joho/godotenv/autoload" //自动加载env文件
)
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "hello xiang"}) //这里做了改动
})
r.Run(os.Getenv("APP_PORT"))
}
保存提交 GITHUB 仓库,然后执行构建,构建成功访问测试地址
传输构建文件
通常情况下,打包服务器构建成功后,需要把构建结果远程传输到生产服务器部署,这里可以使用 Publish over SSH 插件来实现。
安装与配置 Publish over SSH 插件
- 系统管理 -> 插件管理 -> 搜索安装 Publish over SSH
- 系统管理 -> 系统配置 -> Publish over SSH 配置项
生成 SSH key 登录远程服务器
配置 ssh key
配置 ssh server
Jenkinsfile 配置
pipeline {
agent none
stages {
stage('Build') {
agent {
docker {
image 'golang:1.18.2' // 构建镜像
args '-e GOPROXY=https://goproxy.io -e GO111MODULE=on -e CGO_ENABLED=0 -e GOOS=linux -e GOARCH=amd64 -v /var/jenkins_home/workspace/wallet:/go/src/app'
}
}
steps {
sh 'go build -o app'
sshPublisher(
continueOnError: false,
failOnError: true,
publishers: [
sshPublisherDesc(
configName: "tencent_hk_01",
transfers: [sshTransfer(sourceFiles: 'app,config.json', remoteDirectory: 'proxy')],
verbose: true
)
]
)
}
}
}
}