Jenkins Pipeline实现Golang项目的CI/CD

Jenkins Pipeline实现Golang项目的CI/CD

背景

最近新增了一个Golang实现的项目,需要接入到现有的流水线架构中。

流程图

这边流程和之前我写过的一篇《基于Jenkins实现的CI/CD方案》差不多,不一样的是构建现在是手动触发的,没有配置webhook。因为不是业务主干代码,部署的频率比较低。
在这里插入图片描述

项目目录结构

在这里插入图片描述
Dockerfile文件

FROM alpine:3.19.1
WORKDIR /data
COPY go-pipline /data/go-pipline

# 设置阿里云仓库
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# 设置时区和安装bash
RUN apk add -U tzdata && \
    apk add -U bash && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone

EXPOSE 8080
ENTRYPOINT ["/data/go-pipline"]

Jenkinsfile文件

import java.text.SimpleDateFormat
import java.util.TimeZone

// 构建版本
def createVersion() {
    def simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss")
    simpleDateFormat.timeZone = TimeZone.getTimeZone("Asia/Shanghai")
    return simpleDateFormat.format(new Date()) + "_${env.branch}"
}

// 获取ssh连接
def GetRemoteServer(ip, username, password) {
    def remote = [:]
    remote.name = ip
    remote.host = ip
    remote.user = username
    remote.password = password
    remote.allowAnyHosts = true
    return remote
}

pipeline {
    agent none
    environment {
        _version = createVersion()
    }
    stages {
        stage('Git Checkout') {
            agent any
            steps {
                checkout([
	                $class: 'GitSCM',
	                branches: [[name: "${branch}"]],
	                doGenerateSubmoduleConfigurations: false,
	                extensions: [],
	                gitTool: 'Default',
	                submoduleCfg: [],
	                userRemoteConfigs: [[url: 'xxx.git',credentialsId: 'xxx',]]
                ])
            }
        }
        stage('Source Package') {
            agent {
                docker {
                    image 'golang:1.21.0'
                    args '-v go-cache:/go/pkg/mod'
                }
            }
            steps {
                sh 'go env -w GO111MODULE=on'
                sh 'go env -w GOPROXY=https://goproxy.cn,direct'
                sh 'go mod download'
                sh 'CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o go-pipeline'
            }
        }

        stage('Image Build') {
            agent any
            steps {
                sh 'docker build -f $WORKSPACE/Dockerfile -t {{harbor}}/common/go-pipeline:${_version} $WORKSPACE'
                sh 'rm -f $WORKSPACE/go-pipeline'
                sh 'docker push {{harbor}}/common/go-pipeline:${_version}'
                sh 'docker rmi {{harbor}}/common/go-pipeline:${_version}'
            }
        }

        stage('Publish To Env') {
            agent any
            steps {
                script {
                    def remote = GetRemoteServer('127.0.0.1', 'root', 'root')
                    sshCommand remote: remote, command: "docker stop go-pipeline; docker rm go-pipeline"
                    sshCommand remote: remote, command: "docker run -it  --name go-pipeline -d -p 8080:8080  {{harbor}}/common/go-pipeline:${_version}"
                }
            }
        }
    }
}

有一个需要注意的地方,Source Package 源码编译阶段,除了指定构建的容器以外,我还挂载了一个go-cache的volume,这边是为了缓存go的依赖。这边是为了提高构建的速度,或者也可以解决构建机器连接不了外网的情况。具体volume创建命令:

docker volume create go-cache

main方法中只提供了一个接口

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() {
	r := gin.Default()
	r.GET("/ping", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	r.Run()
}

流水线配置

新增一个pipeline类型的流水线
在这里插入图片描述
新增一个参数branch,将构建的分支参数开出来

选择Pipeline script from SCM,配置如下图
在这里插入图片描述
这边需要注意,把最后Lightweight checkout去掉勾选,不然branch参数会不生效

选择构建,结果验证ok
在这里插入图片描述

结语

代码地址:https://github.com/yzh19961031/blogDemo/tree/master/go-pipeline

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Jenkins和Docker可以结合使用来实现CI/CD(持续集成/持续交付)流程。下面是一种常见的实现方式: 1. 安装和配置Jenkins:首先,你需要在你的服务器或本地机器上安装和配置Jenkins。你可以按照Jenkins官方文档提供的步骤进行安装和配置。 2. 安装Docker:接下来,你需要安装Docker,并确保Docker服务正在运行。你可以根据你的操作系统在Docker官方网站上找到相应的安装说明。 3. 创建JenkinsCI/CD Pipeline:在Jenkins中,你可以创建一个Pipeline来定义你的CI/CD流程。Pipeline是一种将多个步骤组合在一起的方式,可以通过代码进行定义和版本控制。你可以使用JenkinsPipeline语法或者使用Jenkins插件来定义你的Pipeline。 4. 定义Jenkins Pipeline中的步骤:在你的Pipeline中,你可以定义多个步骤来完成CI/CD流程。以下是一个可能的步骤示例: - 从代码仓库拉取代码 - 构建Docker镜像 - 运行单元测试 - 部署到测试环境 - 运行集成测试 - 部署到生产环境 5. 使用Docker构建和管理镜像:在上述步骤中,使用Docker构建和管理镜像是关键。你可以使用Dockerfile来定义镜像的构建过程,并使用Jenkins Pipeline中的相关步骤来执行构建。 6. 集成其他工具:你可以通过Jenkins插件或其他方式集成其他工具,如代码质量检查工具、部署工具等,以实现更完整的CI/CD流程。 这只是一个简单的概述,实际的CI/CD流程可以根据你的项目需求和团队实践进行定制和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值