1 喜欢

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

admin
admin
2022-05-26 16:46:46 阅读 2710

环境搭建

项目初始化

初始化开发目录

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

传输构建文件

通常情况下,打包服务器构建成功后,需要把构建结果远程传输到生产服务器部署,这里可以使用 Publish over SSH 插件来实现。

安装与配置 Publish over SSH 插件

  1. 系统管理 -> 插件管理 -> 搜索安装 Publish over SSH
  2. 系统管理 -> 系统配置 -> Publish over SSH 配置项

生成 SSH key 登录远程服务器

参考链接

配置 ssh key

pos_01.jpg

配置 ssh server

pos_02.jpg

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
            )
          ]
        )
      }
    }
  }
}

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