1 喜欢

Jenkins+Docker实现Golang应用的构建与部署

admin
admin
2021-12-19 15:13:01 阅读 1421

环境搭建

项目初始化

初始化开发目录

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 仓库

init_github.jpg

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,截图如下

web_test.jpg

Jenkins 构建配置

新建 jenkins 任务

任务类型选择流水线(Pipeline)

配置 Jenkinsfile

jenkins_config.jpg

如果您不熟悉 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 仓库,执行构建

如果不出意外,您将会看到下面的执行结果

jenkins_build.jpg

服务器端配置 Docker 容器

链接您的服务器,进入 go-web-jenkins 工作目录,您将看到打包的 app 可执行文件

build_app.jpg

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可执行文件

执行结果如下图

docker_run.jpg

浏览器访问测试

server_test.jpg

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 仓库,然后执行构建,构建成功访问测试地址
success.jpg


关于作者
admin
admin
admin@ifront.net
 获得点赞 51
 文章阅读量 68757
文章标签