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/timezoneEXPOSE 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 = ipremote.host = ipremote.user = usernameremote.password = passwordremote.allowAnyHosts = truereturn remote
}pipeline {agent noneenvironment {_version = createVersion()}stages {stage('Git Checkout') {agent anysteps {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 anysteps {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 anysteps {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 mainimport ("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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/529516.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批量合并:一键操作,轻松将多个TXT文本合并为一个

在信息爆炸的时代,我们每天都面临着处理大量文本信息的挑战。无论是学习、工作还是生活中,TXT文件作为最基础的文本格式,承载着大量的重要信息。然而,传统的文本管理方式往往效率低下,难以满足我们的实际需求。那么&am…

优思学院|5S 应该由哪个部门负责推行?

很多人以为5S是生产部的事,负责的部门自然是生产部,事实上这是一个很严重的错误,那么,究竟5S 应该由哪个部门负责推行?我们今天就来讨论一下。如果你喜欢我们的文章,记得点赞和收藏。 5S是全员参与的活动&…

51单片机基础篇系列-LED灯点亮代码部分

&#x1f308;个人主页: 会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” #include<reg52.h> //包含单片机内部寄存器 void main() //&#xff08;&#xff09;{P10xfe;//1111 1110while(1); // } 上面是第一个 LED实验 #include<reg52.h>…

在 Python 中从键盘读取用户输入

文章目录 如何在 Python 中从键盘读取用户输入input 函数使用input读取键盘输入使用input读取特定类型的数据处理错误从用户输入中读取多个值 getpass 模块使用 PyInputPlus 自动执行用户输入评估总结 如何在 Python 中从键盘读取用户输入 原文《How to Read User Input From t…

vite vue3 路由配置@找不到文件问题描述

问题描述 在vite.config.js文件中配置路由的时候&#xff0c;添加路由界面&#xff0c;找不到指定的文件&#xff0c;提示错误&#xff0c;如图所示&#xff1a; 但是换成 ./ 或者 ../ 就正常了&#xff0c;也没有报错问题 解决办法 1.安装一个path的插件 npm install --sav…

《MySQL实战45讲》课程大纲

1MySQL实战45讲-01基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f;2MySQL实战45讲-02日志系统&#xff1a;一条SQL更新语句是如何执行的&#xff1f;3MySQL实战45讲-03事务隔离&#xff1a;为什么你改了我还看不见&#xff1f;4MySQL实战45讲-04深入浅出索引&…

Java后端八股文之Redis

文章目录 1. Redis是什么&#xff1f;2. Redis为什么这么快&#xff1f;3. 为什么要使用缓存&#xff1f;4. Redis几种使用场景&#xff1a;5. Redis的Zset底层为什么要使用跳表而不是平衡树、红黑树或者B树&#xff1f;6.Redis持久化6.1 什么是RDB持久化6.1.1RDB创建快照会阻塞…

探索AI时代“芯”路径 软通动力子公司鸿湖万联助阵第八届瑞芯微开发者大会

3月7日-8日&#xff0c;第八届瑞芯微开发者大会&#xff08;RKDC2024&#xff09;在福州成功举办&#xff0c;大会以“AI芯片AI应用AloT”为主题&#xff0c;通过芯片应用及生态伙伴的技术展示、产品和技术论坛等系列活动串联&#xff0c;吸引数千名开发者、合作伙伴以及行业专…

数据库(SQL sever)

本博客将主要讲述数据库&#xff08;SQL sever&#xff09; 1.数据库解决的数据问题&#xff1a; Data redundancy and inconsistency(数据冗余和不一致) Difficulty in accessing data Data isolation (数据孤立) Integrity problems (完整性问题) Atomicity of updates…

京东按关键字搜索商品 API 返回值说明

京东按关键字搜索商品的API返回值说明如下&#xff1a; 总记录数&#xff08;total_count&#xff09;&#xff1a;搜索结果的总数量。当前页码&#xff08;page_no&#xff09;&#xff1a;当前请求的页码。每页记录数&#xff08;page_size&#xff09;&#xff1a;每页显示…

渗透测试安全面试题

文章目录 某青红队面试-校招某奇红队-校招某安玄某实验室某恒实验室京东腾讯某星渗透测试实习某奇红队 某青红队面试-校招 专注于web漏洞挖掘、内网渗透、免杀和代码审计&#xff0c;感谢各位师傅的关注&#xff01;网安之路漫长&#xff0c;与君共勉&#xff01; 1面 1、说说…

App自动化测试之Appium 环境搭建保姆级教程(全网最全)

前言 APP自动化测试运行环境比较复杂&#xff0c;稍微不注意安装就会失败。我见过不少朋友&#xff0c;装了1个星期&#xff0c;Appium 的运行环境还没有搭好的。 搭建环境本身不是一个有难度的工作&#xff0c;但是 Appium 安装过程中确实存在不少隐藏的比较深的坑&#xff…