jenkins部署go-zero

jenkins部署go-zero

这里主要介绍部署到服务器,并不是文档中的部署到k8s中,其它都差不多,只有细节不同而已

下面介绍下具体的步骤

配置

  1. 创建流水线

jenkins部署go-zero

  1. 参数配置,Dashboard—>voice_text_app—>Configurtion
    服务类型
    jenkins部署go-zero
    服务名称
    jenkins部署go-zero
    git配置
    jenkins部署go-zero
    动态级联选择参数

    由于部署测试和线上区别,所以要上传到不同的服务器
    jenkins部署go-zero
    jenkins部署go-zero
    jenkins部署go-zero
    jenkins部署go-zero

流水线脚本
jenkins部署go-zero

  1. 环境变量设置
    jenkins部署go-zero

  2. 部署
    jenkins部署go-zero
    具体脚本类型

    pipeline {
    agent any
    
    stages {
       stage('服务信息')    {
           steps {
               sh 'echo 分支:$branch'
               sh 'echo 构建服务类型:${JOB_NAME}-$type'
           }
       }
    
       stage('拉取代码') {
           steps {
               checkout([$class: 'GitSCM',
               branches: [[name: '$branch']],
               doGenerateSubmoduleConfigurations: false,
               extensions: [],
               submoduleCfg: [],
               userRemoteConfigs: [[credentialsId: 'gitlab-cert', url: 'git@172.15.7.16:chq/voice_text_app.git']]])
           }
       }
    
       stage('获取commit_id') {
           steps {
               echo '获取commit_id'
               script {
                   env.commit_id = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
               }
           }
       }
    
       stage('goctl版本检测') {
           steps{
               sh '/usr/local/bin/goctl -v'
           }
       }
    
       stage('Dockerfile Build') {
             steps{
                 sh 'echo 生成 ${JOB_NAME}/service/${name}/${type}/Dockerfile'
                 script {
                     docker_file = "service/${name}/${type}/Dockerfile"
                     if (!fileExists(docker_file)) {
                         sh 'echo Dockerfile not exists.'
                         sh 'cd service/${name}/${type} && /usr/local/bin/goctl docker -go ${name}.go'
                     }else {
                         sh 'rm -f service/${name}/${type}/Dockerfile'
                         echo '删除已存在的Dockerfile'
                         sh 'cd service/${name}/${type} && /usr/local/bin/goctl docker -go ${name}.go'
                     }
                     env.image = sh(returnStdout: true, script: 'echo ${name}-${type}:${commit_id}').trim()
                 }
                 sh 'echo Dockerfile exists.'
                 sh 'echo 镜像名称:${image}'
                 sh 'pwd && ls -l && docker build -t ${image} -f service/${name}/${type}/Dockerfile --build-arg NAME=${name} --build-arg ENV_NAME=${ENV_NAME} .'
             }
       }
    
       stage('上传到镜像仓库') {
           steps{
                 # docker login 这里要注意,参数在配置里预先环境变量配置好
               sh 'docker login --username=${docker_user} --password=${docker_pass} http://${docker_server}'
               sh 'docker tag  ${image} ${docker_server}/${JOB_NAME}/${image}'
               sh 'docker push ${docker_server}/${JOB_NAME}/${image}'
           }
       }
         stage('部署到服务器') {
             steps {
               sh """
                 ${SERVER_HOST} -tt  << EOF
                 docker ps -a |grep ${JOB_NAME}-${name}-${type} && docker stop ${JOB_NAME}-${name}-${type} && docker rm ${JOB_NAME}-${name}-${type}
                 docker login --username=${docker_user} --password=${docker_pass} http://${docker_server}
                 docker pull ${docker_server}/${JOB_NAME}/${image}
                 docker run -d --restart unless-stopped --name ${JOB_NAME}-${name}-${type} -v /tmp/logs:/app/logs --network src_default ${docker_server}/${JOB_NAME}/${image}
                 exit
                 EOF
               """
             }
         }
    
       stage('清空本地镜像') {
           steps{
               sh 'docker rmi -f ${image}'
               sh 'docker rmi -f ${docker_server}/${JOB_NAME}/${image}'
               script {
                   images = sh(returnStdout: true, script: 'docker images | grep none | awk \'{print $3}\'').trim()
                   if (images != "") {
                       sh('docker images | grep none | awk \'{print $3}\' | xargs docker rmi')
                   }
               }
           }
       }
     }
    }
  3. 部署选择参数
    jenkins部署go-zero

  4. 查看部署结果
    jenkins部署go-zero

  5. docker模板修改

    FROM golang:{{.Version}}alpine AS builder
    ARG ENV_NAME
    LABEL stage=gobuilder
    ENV CGO_ENABLED 0
    {{if .Chinese}}ENV GOPROXY https://goproxy.cn,direct
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
    {{end}}{{if .HasTimezone}}
    RUN apk update --no-cache && apk add --no-cache tzdata
    {{end}}
    WORKDIR /build
    ADD go.mod .
    ADD go.sum .
    RUN go mod download
    COPY . .
    #{{if .Argument}} COPY {{.GoRelPath}}/etc/${NAME}.${ENV_NAME}.yaml /app/etc/${NAME}.yaml
    COPY {{.GoRelPath}}/etc/{{.ExeFile}}.${ENV_NAME}.yaml /app/etc/{{.ExeFile}}.yaml
    RUN go build -ldflags="-s -w" -o /app/{{.ExeFile}} {{.GoMainFrom}}
    #{{end}}RUN go build -ldflags="-s -w" -o /app/{{.ExeFile}} {{.GoMainFrom}}
    FROM {{.BaseImage}}
    COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
    {{if .HasTimezone}}COPY --from=builder /usr/share/zoneinfo/{{.Timezone}} /usr/share/zoneinfo/{{.Timezone}}
    ENV TZ {{.Timezone}}
    {{end}}
    WORKDIR /app
    COPY --from=builder /app/{{.ExeFile}} /app/{{.ExeFile}}{{if .Argument}}
    COPY --from=builder /app/etc /app/etc{{end}}
    {{if .HasPort}}
    EXPOSE {{.Port}}
    {{end}}
    CMD ["./{{.ExeFile}}", "-f", "etc/{{.ExeFile}}.yaml"]
    #CMD ["./{{.ExeFile}}"{{.Argument}}]
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

docker 模板主要修改了拷贝配置文件,由于部署区分测试user.test.yaml和线上user.online.yaml, 所以部署时根据参数来生成Dockerfile

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
39
粉丝
9
喜欢
71
收藏
102
排名:462
访问:1.9 万
私信
所有博文
社区赞助商