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


    前言:

    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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"]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    编写单元测试

    在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)
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    编写持续集成配置文件:

    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'
          }
        }
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

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

    配置Jenkins

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

    触发持续集成

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

    总结

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

  • 相关阅读:
    Springboot网络微小说的设计与实现毕业设计源码031758
    【无标题】
    maven的详细下载和安装
    React - 路由跳转方法
    蓝桥杯每日一题(python)
    Django: 2. 创建菜单界面
    2023年9月30日
    粉丝提问:26想转行做Python开发,是不是已经晚了?
    ADFS 高可用配置 + NLB配置(Windows网络负载均衡)
    Day18_VueComponent
  • 原文地址:https://blog.csdn.net/weixin_54174102/article/details/131914444