第 37 章 - Go 语言 持续集成与持续部署

第37章 - 持续集成与持续部署 (CI/CD) 是软件开发流程中的重要组成部分,它帮助团队提高代码质量、加快发布速度并减少手动错误。接下来,我将概述 CI/CD 的基本概念,并通过 Jenkins 和 GitHub Actions 两个工具来讲解如何配置它们以支持 Go 语言项目。最后,我会提供一个简单的案例及相应的源代码。

CI/CD 基本概念

持续集成 (Continuous Integration, CI) 是一种实践,其中团队成员频繁地将他们的工作成果(通常是小的增量变更)合并到主分支中。每次合并后,都会通过自动化构建和测试来验证这些变更,从而尽早发现集成问题。

持续交付 (Continuous Delivery, CD) 是指在软件开发过程中,确保代码可以随时被可靠地发布到生产环境的能力。这通常涉及自动化部署过程,但实际的发布决策仍然是手动控制的。

持续部署 (Continuous Deployment) 则更进一步,不仅要求能够随时部署,而且是自动化的,即一旦代码通过了所有的测试,就直接部署到生产环境中。

Jenkins 配置

Jenkins 是一个开源自动化服务器,用于实现 CI/CD 流程。以下是如何为 Go 项目设置 Jenkins 的简单步骤:

  1. 安装 Jenkins:首先需要在你的服务器上安装 Jenkins。
  2. 创建新 Job:登录 Jenkins 后,在首页点击“新建任务”。
  3. 选择自由风格项目:选择这个选项,然后给你的项目命名。
  4. 源码管理:选择 Git 并输入你的仓库地址。
  5. 构建触发器:设定何时执行构建,例如当代码推送到特定分支时。
  6. 构建环境:根据需要配置环境变量等。
  7. 构建步骤:添加执行 shell 脚本或使用插件来编译 Go 代码。
  8. Post-build Actions:如果构建成功,可以定义一些后续操作,比如发送通知。

示例脚本可能如下:

# 安装依赖
go get -v -t -d ./...
# 编译
go build -o myapp
# 运行测试
go test -v ./...

GitHub Actions 结合 Go 语言

GitHub Actions 允许你在 GitHub 仓库中直接定义 CI/CD 工作流。对于 Go 项目,你可以创建一个 .github/workflows/ci.yml 文件来定义工作流。

这里是一个基础的 ci.yml 示例文件:

name: Go
on: [push]
jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Gouses: actions/setup-go@v2with:go-version: '1.14'- name: Buildrun: go build -v ./...- name: Testrun: go test -v ./...

这段 YAML 文件定义了一个工作流,该工作流会在每次推送代码到仓库时运行。它会检查代码,设置 Go 环境,然后执行构建和测试命令。

以上就是关于如何使用 Jenkins 和 GitHub Actions 来支持 Go 语言项目的 CI/CD 实践的基本介绍。

当然,我们可以在现有基础上进一步探讨如何在实际项目中更详细地配置 Jenkins 和 GitHub Actions 以支持 Go 语言的应用。这包括更加详细的步骤和最佳实践。

更详细的 Jenkins 配置

假设你已经安装了 Jenkins 并且可以访问它,接下来我们将深入到更具体的配置细节:

  1. 设置环境:确保你的 Jenkins 服务器上安装了 Go 环境。你可以通过全局工具配置来指定 Go 的安装路径。

  2. 创建流水线 Job:使用 Jenkins Pipeline 来定义 CI/CD 流程。Pipelines 是用 Groovy 脚本编写的,可以存储在 Jenkinsfile 中,并直接提交到源码仓库。

  3. Jenkinsfile 示例

    pipeline {agent anyenvironment {GO_VERSION = '1.15'}stages {stage('Checkout') {steps {git branch: 'main', url: 'https://github.com/yourusername/your-go-repo.git'}}stage('Setup') {steps {sh 'go env -w GO111MODULE=on'sh "curl -O https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz"sh "sudo tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz"sh "export PATH=$PATH:/usr/local/go/bin"}}stage('Build') {steps {sh 'go build -o myapp ./cmd/myapp'}}stage('Test') {steps {sh 'go test -v ./...'}}stage('Deploy') {when {branch 'main'}steps {// 这里添加部署步骤echo 'Deploying to production server...'}}}
    }
    
  4. 发布与部署:根据您的部署策略,您可能需要添加额外的步骤来将构建好的二进制文件部署到生产环境或测试环境。

GitHub Actions 的高级配置

对于 GitHub Actions,除了基本的构建和测试外,还可以加入缓存、依赖管理以及更复杂的部署流程。

  1. 缓存依赖:为了加快构建速度,可以通过缓存 Go 模块来避免每次运行时都下载相同的依赖。

  2. 示例 ci.yml 文件(含缓存)

    name: Go CI
    on:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Gouses: actions/setup-go@v2with:go-version: '1.15'- name: Cache Go modulesuses: actions/cache@v2with:path: ~/go/pkg/modkey: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}restore-keys: |${{ runner.os }}-go-- name: Buildrun: go build -v ./...- name: Testrun: go test -v ./...- name: Run Linterrun: go vet ./...
    
  3. 部署阶段:如果您想要在 GitHub Actions 中实现部署,可以利用特定的 Action 或者自定义脚本来完成。例如,可以使用 AWS CLI 或 Docker 来部署应用。

这些配置提供了更全面的 CI/CD 流水线示例,涵盖了从代码拉取、构建、测试直到部署的全过程。每个项目的具体需求可能会有所不同,因此请根据实际情况调整上述示例。

Jenkins 高级配置

环境变量管理
  • 定义全局环境变量:在 Jenkins 的“全局属性”中设置环境变量,这样可以在所有 Job 中使用。
  • Job 特定的环境变量:在具体的 Job 配置中定义环境变量,这些变量只对该 Job 有效。
多阶段构建
  • 多阶段流水线:可以定义多个阶段来处理不同的任务,例如编译、测试、打包和部署。每个阶段可以根据需要单独运行或跳过。
  • 示例 Jenkinsfile (多阶段)
    pipeline {agent anyenvironment {GO_VERSION = '1.16'}stages {stage('Checkout') {steps {git branch: 'main', url: 'https://github.com/yourusername/your-go-repo.git'}}stage('Setup') {steps {sh 'go env -w GO111MODULE=on'tool name: 'Go', type: 'go'}}stage('Build') {steps {sh 'go build -o myapp ./cmd/myapp'}}stage('Test') {steps {sh 'go test -v ./...'}}stage('Package') {when { branch 'main' }steps {sh 'tar -czf myapp.tar.gz myapp'}}stage('Deploy') {when { branch 'main' }steps {// 这里可以添加部署脚本,比如使用 SCP 或者 Dockerecho 'Deploying to production server...'}}}post {always {archiveArtifacts artifacts: 'myapp.tar.gz', allowEmptyArchive: true}success {emailext body: 'Build succeeded!', subject: 'Build Success', to: 'team@example.com'}failure {emailext body: 'Build failed!', subject: 'Build Failure', to: 'team@example.com'}}
    }
    
安全实践
  • 凭证管理:使用 Jenkins 内置的凭证存储来管理敏感信息,如 API 密钥、数据库密码等。
  • 权限控制:确保只有授权用户才能访问特定的 Job 或执行敏感操作。

GitHub Actions 高级配置

使用 Secrets
  • GitHub Secrets:用于存储敏感数据,如 API 密钥、令牌等,并在工作流中引用它们。
  • 示例 ci.yml 文件(含 Secrets)
    name: Go CI
    on:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-latestenv:MY_SECRET: ${{ secrets.MY_SECRET }}steps:- uses: actions/checkout@v2- name: Set up Gouses: actions/setup-go@v2with:go-version: '1.16'- name: Cache Go modulesuses: actions/cache@v2with:path: ~/go/pkg/modkey: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}restore-keys: |${{ runner.os }}-go-- name: Buildrun: go build -v ./...- name: Testrun: go test -v ./...- name: Run Linterrun: go vet ./...- name: Deployif: github.ref == 'refs/heads/main'run: |echo "Deploying using secret: ${MY_SECRET}"# 在这里添加实际的部署命令
    
多阶段构建
  • 矩阵策略:使用矩阵策略来并行运行多个版本的 Go 编译器。
  • 示例 ci.yml 文件(多阶段)
    name: Go CI
    on:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:strategy:matrix:go-version: [1.15, 1.16]os: [ubuntu-latest, macos-latest]runs-on: ${{ matrix.os }}steps:- uses: actions/checkout@v2- name: Set up Gouses: actions/setup-go@v2with:go-version: ${{ matrix.go-version }}- name: Buildrun: go build -v ./...- name: Testrun: go test -v ./...deploy:needs: buildif: github.ref == 'refs/heads/main'runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Gouses: actions/setup-go@v2with:go-version: '1.16'- name: Build for deploymentrun: go build -o myapp ./cmd/myapp- name: Packagerun: tar -czf myapp.tar.gz myapp- name: Deployrun: |echo "Deploying the application..."# 添加实际部署命令
    

通过这些高级配置,您可以为您的 Go 项目创建一个更加健壮和灵活的 CI/CD 流水线。

接下来,我们将继续深入探讨一些更高级的主题,包括如何在 CI/CD 流程中处理依赖管理、自动化测试报告生成、以及如何集成代码质量检查工具。此外,我们还将讨论如何使用容器化技术来进一步简化部署过程。

依赖管理和缓存

Jenkins
  • 依赖管理:确保每次构建时都能准确地获取到正确的依赖版本。
  • 示例 Jenkinsfile (包含依赖缓存)
    pipeline {agent anyenvironment {GO_VERSION = '1.16'}stages {stage('Checkout') {steps {git branch: 'main', url: 'https://github.com/yourusername/your-go-repo.git'}}stage('Setup') {steps {tool name: 'Go', type: 'go'}}stage('Restore Cache') {steps {sh 'mkdir -p $HOME/go/pkg/mod'cache path: '$HOME/go/pkg/mod', key: "go-mod-${GO_VERSION}-${GIT_COMMIT}", restoreKeys: "go-mod-${GO_VERSION}-"}}stage('Build') {steps {sh 'go build -o myapp ./cmd/myapp'}}stage('Test') {steps {sh 'go test -v ./...'}}stage('Save Cache') {when { always() }steps {sh 'mkdir -p $HOME/.cache/go-build'cache path: '$HOME/.cache/go-build', key: "go-build-${GO_VERSION}-${GIT_COMMIT}", restoreKeys: "go-build-${GO_VERSION}-"}}}
    }
    
GitHub Actions
  • 依赖管理:使用 actions/cache 来缓存 Go 模块。
  • 示例 ci.yml 文件(包含依赖缓存)
    name: Go CI
    on:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Gouses: actions/setup-go@v2with:go-version: '1.16'- name: Cache Go modulesuses: actions/cache@v2with:path: |~/go/pkg/mod~/.cache/go-buildkey: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}restore-keys: |${{ runner.os }}-go-- name: Buildrun: go build -v ./...- name: Testrun: go test -v ./...
    

自动化测试报告

Jenkins
  • 测试报告插件:安装并配置 JUnit 插件或其他适合 Go 的测试报告插件。
  • 示例 Jenkinsfile (包含测试报告)
    pipeline {agent anystages {// 其他阶段...stage('Test') {steps {sh 'go test -v -json ./... > test-report.json'}post {always {junit allowEmptyResults: true, testResults: 'test-report.json'}}}}
    }
    
GitHub Actions
  • 测试报告:使用 actions/upload-artifact 来上传测试结果,并使用 gotestfmt 或其他工具格式化输出。
  • 示例 ci.yml 文件(包含测试报告)
    name: Go CI
    on:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Gouses: actions/setup-go@v2with:go-version: '1.16'- name: Buildrun: go build -v ./...- name: Testrun: go test -v -json ./... > test-report.json- name: Upload Test Reportif: always()uses: actions/upload-artifact@v2with:name: test-reportpath: test-report.json
    

代码质量检查

Jenkins
  • 静态分析工具:集成如 golangci-lint 这样的工具来进行代码质量检查。
  • 示例 Jenkinsfile (包含静态分析)
    pipeline {agent anystages {// 其他阶段...stage('Lint') {steps {sh 'curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.37.0'sh '$(go env GOPATH)/bin/golangci-lint run'}}}
    }
    
GitHub Actions
  • 静态分析:使用 golangci-lint-action Action 来执行代码质量检查。
  • 示例 ci.yml 文件(包含静态分析)
    name: Go CI
    on:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Gouses: actions/setup-go@v2with:go-version: '1.16'- name: Lintuses: golangci/golangci-lint-action@v2with:version: v1.37.0- name: Buildrun: go build -v ./...- name: Testrun: go test -v ./...
    

容器化部署

使用 Docker
  • Docker 构建:创建一个 Dockerfile 来打包你的 Go 应用。

  • 示例 Dockerfile

    FROM golang:1.16 AS builder
    WORKDIR /app
    COPY . .
    RUN go mod download
    RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .FROM alpine:latest
    RUN apk --no-cache add ca-certificates
    COPY --from=builder /app/myapp /myapp
    CMD ["/myapp"]
    
  • Jenkins 中的 Docker 部署:在 Jenkinsfile 中添加 Docker 构建和推送步骤。

  • 示例 Jenkinsfile (包含 Docker 构建)

    pipeline {agent anyenvironment {DOCKER_IMAGE = 'your-dockerhub-username/your-image-name:latest'}stages {// 其他阶段...stage('Build Docker Image') {steps {script {docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-credentials') {def customImage = docker.build(DOCKER_IMAGE)customImage.push()}}}}stage('Deploy') {when { branch 'main' }steps {sh 'kubectl apply -f kubernetes/deployment.yaml'}}}
    }
    
  • GitHub Actions 中的 Docker 部署:在 GitHub Actions 工作流中加入 Docker 构建和推送步骤。

  • 示例 ci.yml 文件(包含 Docker 构建)

    name: Go CI
    on:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up Docker Buildxuses: docker/setup-buildx-action@v1- name: Login to DockerHubuses: docker/login-action@v1with:username: ${{ secrets.DOCKER_USERNAME }}password: ${{ secrets.DOCKER_PASSWORD }}- name: Build and pushid: docker_builduses: docker/build-push-action@v2with:push: truetags: your-dockerhub-username/your-image-name:latest
    

通过上述配置,您可以为您的 Go 项目设置一个更加全面且高效的 CI/CD 流水线。希望这些信息对您有所帮助!

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

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

相关文章

Java中的线程池使用详解

文章目录 Java中的线程池使用详解一、引言二、线程池的创建与使用1、线程池的创建1.1、FixedThreadPool(固定大小线程池)1.2、CachedThreadPool(可缓存线程池)1.3、SingleThreadExecutor(单线程化线程池)1.…

3D扫描对文博行业有哪些影响?

三维扫描技术对文博行业产生了深远的影响,主要体现在以下几个方面: 一、高精度建模与数字化保护 三维扫描技术通过高精度扫描设备,能够捕捉到文物的每一个细节,包括形状、纹理、颜色等,从而生成逼真的3D模型。这些模…

C# 泛型(Generic)

文章目录 前言一、泛型的基本概念与实例展示二、泛型的特性与优势三、泛型方法四、泛型委托 前言 泛型(Generic)允许将类或方法中编程元素的数据类型规范进行延迟编写,直到在程序实际使用这些类或方法的时候再去确定具体的数据类型。 一、泛…

前端小练习——星辰宇宙(JS没有上限!!!)

前言:在刚开始学习前端的时候,我们会学习到前端三件套中的JavaScript,可能那时候读者没有觉得JavaScript这个语言有多么的牛逼,本篇文章将会使用一个炫酷的案例来刷新你对JavaScript这个语言的认知与理解。 ✨✨✨这里是秋刀鱼不做…

【Python爬虫五十个小案例】爬取豆瓣电影Top250

博客主页:小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介:分享五十个Python爬虫小案例 🪲前言 在这篇博客中,我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求,…

多目标优化算法——多目标粒子群优化算法(MOPSO)

Handling Multiple Objectives With Particle Swarm Optimization(多目标粒子群优化算法) 一、摘要: 本文提出了一种将帕累托优势引入粒子群优化算法的方法,使该算法能够处理具有多个目标函数的问题。与目前其他将粒子群算法扩展…

C++设计模式——Singleton单例模式

一、单例模式的定义 单例模式,英文全称Singleton Pattern,是一种创建型设计模式,它保证一个类在程序中仅有一个实例,并对外提供一个访问的该类实例的全局接口。 单例模式通常用于需要控制对象资源的开发场景,一个类…

Python学习35天

# 定义父类 class Computer: CPUNone MemoryNone diskNone def __init__(self,CPU,Memory,disk): self.disk disk self.Memory Memory self.CPU CPU def get_details(self): return f"CPU:{self.CPU}\tdisk:{self.disk}\t…

<项目代码>YOLOv8 停车场空位识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复

cd /Users/自己的用户名/Library/Application\ Support/ 目录下有 GPT\ Chrome/ Google/ GptBrowser/ GPT\ Chrome 为原来的chrome浏览器的文件存储目录. GptBrowser 为升级后chrome浏览器存储目录 书签所在的文件 Bookmarks 登录账号Login 相关的文件 拷贝到GptBrow…

GB28181系列二:SIP信令

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、SIP报文介绍 二、SIP交互流程: 1、Session Model 2、Pager Model 3、SIP信令交互过程中的3个定义 三、媒体传输(SDP和RTP) 一、SIP报文介绍 这里将会介绍SIP…

ViSTa:一个包含4000多个视频和逐步描述的层次化数据集,用于评估VLMs在不同复杂性任务中的表现。

2024-11-22,由Google DeepMind和MATS机构创建的ViSTa数据集,为评估视觉语言模型(VLMs)在理解基于顺序的任务方面的能力提供了新的视角,这对于强化学习中的成本降低和安全性提升具有重要意义。 数据集地址:…

区块链:波场-TRON链

注意: 1、调试时请将所有的API地址都换成 https://api.trongrid.io 以免报错等问题 https://api.trongrid.io 主网 (Mainnet) 适用于生产环境 https://api.shasta.trongrid.io 测试网 (Shasta) 适用于开发者测试 https://nile.trongrid.io 测试网 (Nile) …

【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配

接到一个需求是类似下图的3D多房间视角,需要拖拽屏幕 问题 在做这种屏幕拖拽的时候发现,需要拖拽起来有跟手的感觉,会存在不同分辨率机型的适配问题。 即:美术调整好了机型1的手感,能做到手指按下顶层地板上下挪动&…

比特币libsecp256k1中safegcd算法形式化验证完成

1. 引言 比特币和其他链(如 Liquid)的安全性取决于 ECDSA 和 Schnorr 签名等数字签名算法的使用。Bitcoin Core 和 Liquid 都使用名为 libsecp256k1 的 C 库来提供这些数字签名算法,该库以其所运行的椭圆曲线命名。这些算法利用一种称为modu…

『VUE』elementUI dialog的子组件created生命周期不刷新(详细图文注释)

目录 1. 测试代码分析令人迷惑的效果 分析原因解决方法 如何在dialog中反复触发created呢?总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 主要是在做表单的时候想要有一个编辑表单在dialog弹窗中出现,同时dialog调用的封装的…

深入探讨 Redis 持久化机制:原理、配置与优化策略

文章目录 一、引言二、Redis持久化概述三、RDB(Redis DataBase)持久化1、RDB概念与工作原理2、RDB的配置选项3、RDB优化配置项4、RDB的优势与劣势 三、AOF(Append-Only File)持久化1、AOF概念与工作原理2、AOF的三种写回策略3、Re…

使用爬虫时,如何确保数据的准确性?

在数字化时代,数据的准确性对于决策和分析至关重要。本文将探讨如何在使用Python爬虫时确保数据的准确性,并提供代码示例。 1. 数据清洗 数据清洗是确保数据准确性的首要步骤。在爬取数据后,需要对数据进行清洗,去除重复、无效和…

(计算机网络)期末

计算机网络概述 物理层 信源就是发送方 信宿就是接收方 串行通信--一次只发一个单位的数据(串行输入) 并行通信--一次可以传输多个单位的数据 光纤--利用光的反射进行传输 传输之前,要对信源进行一个编码,收到信息之后要进行一个…

111. UE5 GAS RPG 实现角色技能和场景状态保存到存档

实现角色的技能存档保存和加载 首先,我们在LoadScreenSaveGame.h文件里,增加一个结构体,用于存储技能相关的所有信息 //存储技能的相关信息结构体 USTRUCT(BlueprintType) struct FSavedAbility {GENERATED_BODY()//需要存储的技能UPROPERT…