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

news2024/10/5 21:16:10

前言:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chrome解决http自动跳转https问题

1.地址栏输入: chrome://net-internals/#hsts 2.找到底部Delete domain security policies一栏,输入想处理的域名,点击delete。 3.再次访问http域名不再自动跳转https了。

1.项目需求-项目实现

1.项目需求-项目实现代码是依次迭代的 慢慢增加。 密码只能输入整数,密码一般用字符串,用户名和密码都用字符串实现 需要头文件 不识别内容 string需要头文件。c头文件里没有.h #include string 是c特有的类型。 总结:string 是c特有的类型…

【冷冻电镜】InSilicoTEM 使用手册

简介 InSilicoTEM是一个用来模拟生成冷冻电镜显微图像的软件,原论文是"Image formation modeling in cryo-electron microscopy"。 该软件基DIPImage和MATLAB开发。 (注:在GitHub上的代码,只适用于DIPImage2.9以及更早…

C# 父类实现的 IEquatable<T> 接口,重写的相等性判断函数都能被子类继承

实验代码 Son s1 new(), s2 new();Console.WriteLine("_ s1 s2"); _ s1 s2; Console.WriteLine();Console.WriteLine("_ s1 ! s2;"); _ s1 ! s2; Console.WriteLine();Console.WriteLine("_ s1.Equals(s2);"); _ s1.Equals(s2); Cons…

华为数通HCIP-BGP基础

AS(自治系统/路由域) 定义:运行相同路由协议,具有相同管理规则的区域(一般为一个企业网); 按照传递路由时是否携带掩码分类: 1、有类路由协议 路由传递时,无需携带掩…

linux下的tomcat

springboot项目端口是8080,部署到linux运行之后,为什么能检测到tomcat 手动安装tomcat,以下是在 Linux 系统上安装 Tomcat 的步骤: 下载 Tomcat 安装包。您可以从 Tomcat 官方网站(https://tomcat.apache.org/ ↗&…

Bagging方法6大面试热点问题

Q1:为什么Bagging算法的效果比单个评估器更好? 该问题其实是在考察Bagging方法降低模型泛化误差的基本原理。 泛化误差是模型在未知数据集上的误差,更低的泛化误差是所有机器学习/深度学习建模的根本目标。在机器学习当中,泛化误差…

python获取图片坐标系中的图形,将其展示到新的坐标系中,并存储到excel中

python获取图片坐标系中的图形,将其展示到新的坐标系中,并存储到excel中 1.原始图片 2.重新定义转换的图片 3.代码展示 import cv2 import numpy as np import matplotlib.pyplot as plt import pandas as pddef get_curve_vertices(lines):vertices…

【文末送书】Python高并发编程:探索异步IO和多线程并发

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。搜…

RISC-V汇编指令

写在最前面:这一篇是UC Berkeley的CS61C的笔记,根据我自己的理解进行学习记录,其中贴的一些图片来自于课程PPT。 了解汇编之前,我们需要先了解为什么需要汇编?以下是我的理解: 机器执行的命令都是些二进制…

六边形架构和分层架构的区别?

六边形架构和分层架构是什么? 六边形架构(Hexagonal Architecture)和分层架构(Layered Architecture)是两种常见的软件架构模式。六边形架构强调将核心业务逻辑与外部依赖解耦,通过接口与外部世界进行通信。…

hcip mgre与rip实验

要求: 1.toop搭建 2.IP地址规划 R1g 0/0/1 192.168.1.1 24 s 4/0/0 188.0.0.2 24 t:10.0.0.1 24R2 s 4/0/0 188.0.0.1 24 s 4/0/1 188.0.1.1 24 s 3/0/0 188.0.2.1 24 loop0 8.8.8.8 24 t:10.0.0.2 24 R3g…

本地 IDC 中的 K8s 集群如何以 Serverless 方式使用云上计算资源

作者:庄宇 在前一篇文章《应对突发流量,如何快速为自建 K8s 添加云上弹性能力》中,我们介绍了如何为 IDC 中 K8s 集群添加云上节点,应对业务流量的增长,通过多级弹性调度,灵活使用云上资源,并通…

Python自动化测试框架pytest的详解安装与运行

这篇文章主要为大家介绍了Python自动化测试框架pytest的简介以及安装与运行,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步 1. pytest的介绍 pytest是一个非常成熟的全功能的python测试工具,它主要有以下特征: 简…

二进制子集题解

样例输入: 13样例输入: 0 1 4 5 8 9 12 13思路分析: 这道题大体就是进制转换然后按位 d f s dfs dfs。进制转换比较好理解,不懂得可以自行 b d f s ( 百度优先搜索 ) bdfs(百度优先搜索) bdfs(百度优先搜索)一下。 代码&#…

【LeetCode】260.只出现一次的数字 III(找出单身狗)

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》 🌝每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 一只单身狗: 两只单身狗: 前言&#x…

HTTPS安全套接字层超文本传输协议

HTTPS安全套接字层超文本传输协议 HTTPS简介HTTPS和HTTP的主要区别客户端在使用HTTPS方式与Web服务器通信时的步骤SSL/TLS协议的加密(握手)过程为什么数据传输阶段使用对称加密HTTPS 的优点HTTPS 的缺点HTTPS 的优化证书优化会话复用 HTTPS简介 HTTP协议…

Keil系列教程07_Configuration(一)

1写在前面 本文带来的内容为“Configuration”,即配置。而这里的“配置”和前面“工程目标选项配置”是完全不同的两种配置。 工程目标选项配置是针对工程目标,保存在工程文件(.uvprojx和.uvoptx)。这里的Configuration是针对IDE…

在本地git仓库查看远端的URL

右键调出选项栏 选择git-远端,选择远端的内容就可以看到URL了

数据结构之时间复杂度

目录 一、时间复杂度的概念 二、大O的渐进表示法 三、常见时间复杂度计算举例 一、时间复杂度的概念 时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从…