jenkins部署go-zero
jenkins部署go-zero
这里主要介绍部署到服务器,并不是文档中的部署到k8s中,其它都差不多,只有细节不同而已
下面介绍下具体的步骤
配置
- 创建流水线
- 参数配置,Dashboard—>voice_text_app—>Configurtion
服务类型
服务名称
git配置
动态级联选择参数由于部署测试和线上区别,所以要上传到不同的服务器
流水线脚本
环境变量设置
部署
具体脚本类型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') } } } } } }
部署选择参数
查看部署结果
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 协议》,转载必须注明作者和本文链接
docker 模板主要修改了拷贝配置文件,由于部署区分测试
user.test.yaml
和线上user.online.yaml
, 所以部署时根据参数来生成Dockerfile
。