【Docker】Docker持续集成与持续部署(四)

2023-07-25 11:55:32

前言:

Docker与持续集成/持续部署(CI/CD)的作用是通过容器化技术实现环境一致性、快速构建和隔离性,从而加快软件交付速度、提高部署效率,确保持续集成和持续部署的顺利实施。

在这里插入图片描述

持续集成(Continuous Integration)

持续集成是一种开发实践,通过频繁地将代码集成到共享的主干(版本控制仓库)中,然后自动运行构建和测试,以尽早地发现和解决集成问题。持续集成的目标是减少集成问题带来的风险,提高开发效率和软件质量。

在这里插入图片描述

持续部署(Continuous Deployment)

持续部署是持续集成的延伸,它不仅自动构建和测试代码,还自动将通过测试的代码部署到生产环境中。持续部署的目标是快速地将新功能交付给用户,实现持续交付。

在这里插入图片描述

Docker在CI/CD中的作用

Docker在持续集成和持续部署中发挥了重要作用,它可以实现以下好处:

  1. 环境一致性: Docker容器可以封装应用程序及其依赖,确保在不同环境中运行的一致性,避免“在我这里可以运行”的问题。

  2. 快速构建: Docker镜像可以快速构建,加快持续集成过程,减少开发者等待时间。

  3. 隔离性: Docker容器提供了隔离性,保证每个构建和测试环节都在干净的环境中进行,避免互相影响。

  4. 可移植性: Docker容器可以在不同的主机和云环境中运行,便于持续部署到多种目标环境。

在这里插入图片描述

实例:使用Docker进行持续集成与持续部署(Go应用)

演示如何使用Docker在一个简单的Go应用上实现持续集成和持续部署

项目结构

首先,我们创建一个简单的Go应用,目录结构如下:

my-go-app/
  |- Dockerfile
  |- main.go
  |- go.mod
  |- go.sum
  |- tests/
      |- main_test.go

Dockerfile用于构建Go应用程序的Docker镜像,main.go是Go应用程序的主文件,go.mod和go.sum是Go应用程序的模块文件,tests文件夹包含单元测试文件main_test.go。

Dockerfile

编写Dockerfile,用于构建Go应用程序的Docker镜像:

# 使用Golang官方镜像作为基础镜像
FROM golang:1.17

# 设置工作目录
WORKDIR /app

# 将应用程序代码复制到镜像中
COPY . .

# 构建Go应用程序
RUN go build -o my-go-app

# 暴露应用程序监听的端口
EXPOSE 8080

# 启动应用程序
CMD ["./my-go-app"]

编写单元测试

在tests/main_test.go中编写一个简单的单元测试:

// tests/main_test.go
package main

import (
	"testing"
	"net/http"
	"net/http/httptest"
)

func TestHandler(t *testing.T) {
	req, err := http.NewRequest("GET", "/", nil)
	if err != nil {
		t.Fatal(err)
	}

	rr := httptest.NewRecorder()
	handler := http.HandlerFunc(Handler)

	handler.ServeHTTP(rr, req)

	if status := rr.Code; status != http.StatusOK {
		t.Errorf("handler returned wrong status code: got %v want %v",
			status, http.StatusOK)
	}

	expected := "Hello, World!"
	if rr.Body.String() != expected {
		t.Errorf("handler returned unexpected body: got %v want %v",
			rr.Body.String(), expected)
	}
}

编写持续集成配置文件:

pipeline {
  agent any

  stages {
    stage('Build') {
      steps {
        // 使用Docker构建镜像
        sh 'docker build -t my-go-app .'
      }
    }

    stage('Test') {
      steps {
        // 运行单元测试
        sh 'docker run --rm my-go-app go test ./tests'
      }
    }

    stage('Deploy') {
      steps {
        // 将镜像部署到远程服务器
        // 假设远程服务器上已经安装了Docker,并启动了Docker守护进程
        sh 'docker save my-go-app | ssh user@remote_server "docker load"'
        ssh user@remote_server 'docker stop my-go-app || true'
        ssh user@remote_server 'docker rm my-go-app || true'
        ssh user@remote_server 'docker run -d --name my-go-app -p 8080:8080 my-go-app'
      }
    }
  }
}

在Jenkinsfile中,我们使用Docker构建Go应用程序的镜像、运行单元测试,然后将镜像通过SSH方式部署到远程服务器。

配置Jenkins

我们在Jenkins中新建一个Pipeline项目,并在配置中选择"Pipeline script from SCM",指定项目的版本控制仓库和Jenkinsfile位置。

触发持续集成

每当代码提交到版本控制仓库,Jenkins会自动拉取代码、构建Docker镜像、运行单元测试,并将镜像部署到远程服务器。这样就实现了持续集成和持续部署。

总结

Docker在持续集成和持续部署中发挥了重要作用,它提供了环境一致性、快速构建、隔离性和可移植性等优势,帮助开发团队实现更高效、更可靠的软件交付过程

更多推荐

【资源推荐】一站式机器学习学习资料

我之前向大家推荐了许多关于人工智能数学原理与应用的资料,其中包括线性代数、机器学习和深度学习等方面的内容。交互式线性代数学习网站沉浸式线性代数学习网站Kaggle大神教你机器学习今天我将继续向大家推荐一个一站式学习机器学习的绝佳资源:《鸢尾花书:从加减乘除到机器学习》。https://github.com/Visual

Aztec.nr:Aztec的隐私智能合约框架——用Noir扩展智能合约功能

1.引言前序博客有:Aztec的隐私抽象:在尊重EVM合约开发习惯的情况下实现智能合约隐私Aztec.nr,为:面向Aztec应用的,新的,强大的智能合约框架使得开发者可直观管理私有状态基于Noir构建,Noir为AztecLabs作为核心贡献者开发的通用zk编程语言。使得开发者使用Noir来编写隐私智能合约,并借助模

安卓机型固件系统分区的基础组成 手机启动规律初步常识 各分区的基本含义与说明

此贴为基本常识。感兴趣的友友可以了解手机的启动顺序和各模式的基本操作与意义。另外了解手机系统分区各文件夹的含义分区说明对应贴:安卓机型固件中分区对应说明手机开机基本启动顺序当我们按下手机开机键的时候。基本的启动顺序为注意:该结构图并不反映手机的实际分区顺序和位置,只是一个逻辑结构图。当按下电源键手机上电启动后,首先从b

【Purple Pi OH RK3566鸿蒙开发板】OpenHarmony音频播放应用,真实体验感爆棚!

本文转载于PurplePiOH开发爱好者,作者ITMING。原文链接:https://bbs.elecfans.com/jishu_2376383_1_1.html01注意事项DevEcoStudio4.0Beta2(BuildVersion:4.0.0.400)OpenHarmonySDKAPI9创建工程类型选择Ap

ARM 汇编指令集——汇编中三种符号(汇编指令、伪指令、伪操作)、汇编基本格式、数据操作指令、跳转指令、特殊功能寄存器操作指令、内存操作指令、混合编程

目录一、汇编中三种符号(汇编指令、伪指令、伪操作)二、汇编基本格式三、数据操作指令3.1数据搬移指令mov/mvn①示例②立即数3.2移位操作指令lsl/lsr/asr/ror示例3.3位运算操作指令and/orr/eor/bic①示例1②示例23.4算数运算操作指令add/adc/sub/sbc/mul①实现两个64

数字化管理平台建设实践

在勘察设计行业,各企业加速推进数字化转型。通过管理要素数字化,不断优化内部组织运营效率;通过生产手段数字化、技术产品数字化,提升服务质量,改善客户体验;通过数字化营销,精准对接市场需求,挖掘发展蓝海。本文基于勘察设计企业数字化管理系统普遍存在的问题,结合湖北省交通规划设计院股份有限公司(以下简称“湖北交规院”)的数字化

vue的组件化编程的详细讲解加代码演示

😀前言本片文章是vue系列第5篇整理了vue的组件化编程的详细讲解加代码演示🏠个人主页:尘觉主页🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉在csdn获奖荣誉:🏆csdn城市之星2名⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣💓Java全栈群星计划t

Mysql002:(库和表)操作SQL语句

目录:》SQL通用规则说明SQL分类:》DDL(数据定义:用于操作数据库、表、字段)》DML(数据编辑:用于对表中的数据进行增删改)》DQL(数据查询:用于对表中的数据进行查询)》DCL(用户权限:用于创建用户、修改数据库访问权限等)SQL通用规则说明:1.SQL语句可以单行编写,也可以多行编写,以英文分号结束2.SQ

基于Java+vue前后端分离高校社团管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

如何实现微服务

一、问题拆解1.1、客户端如何访问这些服务原来的Monolithic方式开发,所有的服务都是本地的,UI可以直接调用;现在按功能拆分成独立的服务,跑在独立的虚拟机上的Java进程了。客户端UI如何访问他的?后台有N个服务,前台就需要记住管理N个服务,一个服务下线/更新/升级,前台就要重新部署,这明显不符合我们拆分的理念

【LeetCode题目详解】第十章 单调栈part02 ● 503.下一个更大元素II ● 42. 接雨水 (day59补)

本文章代码以c++为例!一、力扣第503题:下一个更大元素II题目:给定一个循环数组nums(nums[nums.length-1]的下一个元素是nums[0]),返回nums中每个元素的下一个更大元素。数字x的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的

热文推荐