Python高级技术之:`Python`的`CI/CD`:如何利用`GitLab CI`和`Jenkins`自动化测试和部署。

嘿,大家好!今天咱们来聊聊Python的CI/CD,也就是持续集成和持续部署。别怕,听起来高大上,其实就是让电脑自动帮你测试代码、打包发布,让你有更多时间摸鱼…啊不,是专注于核心功能开发!

咱们今天主要讲两种主流方案:GitLab CI 和 Jenkins。我会用尽量通俗易懂的语言,配合代码示例,带大家一步步实现自动化测试和部署。

第一部分:CI/CD 概念扫盲

在开始实操之前,先简单了解下 CI/CD 的概念。

  • 持续集成 (Continuous Integration, CI): 简单来说,就是频繁地将代码集成到共享仓库,每次集成后都运行自动化测试,尽早发现并解决集成问题。想象一下,你和几个小伙伴一起开发,每天都要合并代码,如果没有 CI,那每次合并都可能出现各种冲突,简直是噩梦!有了 CI,每次合并都会自动跑测试,有问题立马就能发现,避免把问题带到后面。

  • 持续交付 (Continuous Delivery, CD): 在 CI 的基础上,更进一步。代码不仅要频繁集成和测试,还要能够随时部署到测试环境或者预生产环境。这样,可以更快地验证新功能,并且随时准备好发布新版本。

  • 持续部署 (Continuous Deployment, CD): 比持续交付更激进。代码通过自动化测试后,自动部署到生产环境。这意味着每次代码提交都可能触发一次发布。这种方式适合快速迭代的项目。

为什么需要 CI/CD?

  • 加速开发周期: 自动化测试和部署节省大量时间,让开发人员更快地发布新功能。
  • 提高代码质量: 自动化测试可以尽早发现 bug,避免把问题带到生产环境。
  • 降低发布风险: 自动化部署减少人为错误,提高发布成功率。
  • 提升团队效率: 开发人员可以专注于核心功能开发,而不用把时间浪费在繁琐的测试和部署上。

第二部分:GitLab CI 实战

GitLab CI 是 GitLab 内置的 CI/CD 工具,使用起来非常方便。只要在项目根目录下创建一个 .gitlab-ci.yml 文件,就可以定义 CI/CD 流程。

1. .gitlab-ci.yml 文件详解

.gitlab-ci.yml 文件使用 YAML 格式,定义了 CI/CD 的各个阶段 (stages) 和任务 (jobs)。

  • stages: 定义 CI/CD 流程的各个阶段,比如 build, test, deploy 等。阶段是按顺序执行的。
  • jobs: 定义每个阶段要执行的任务。每个任务包含一个 script 部分,指定要执行的命令。

下面是一个简单的 .gitlab-ci.yml 示例:

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - echo "Building the application..."
    - python -m venv venv
    - source venv/bin/activate
    - pip install -r requirements.txt

test:
  stage: test
  script:
    - echo "Running tests..."
    - source venv/bin/activate
    - pytest --cov=./ --cov-report term-missing

deploy:
  stage: deploy
  script:
    - echo "Deploying the application..."
    # 这里写你的部署命令,比如使用 SSH 上传到服务器

这个文件定义了三个阶段:build, test, deploy

  • build 阶段:安装项目依赖。
  • test 阶段:运行测试用例。
  • deploy 阶段:部署应用程序。

2. 代码示例

假设我们有一个简单的 Python 项目,包含一个 app.py 文件和一个 test_app.py 文件。

app.py:

def add(a, b):
  return a + b

def multiply(a, b):
  return a * b

test_app.py:

import pytest
from app import add, multiply

def test_add():
  assert add(2, 3) == 5
  assert add(-1, 1) == 0
  assert add(0, 0) == 0

def test_multiply():
  assert multiply(2, 3) == 6
  assert multiply(-1, 1) == -1
  assert multiply(0, 5) == 0

requirements.txt:

pytest
pytest-cov

3. 配置 GitLab CI

  1. 在项目根目录下创建 .gitlab-ci.yml 文件,并将上面的 YAML 代码复制进去。
  2. 将代码推送到 GitLab 仓库。
  3. GitLab CI 会自动检测到 .gitlab-ci.yml 文件,并开始执行 CI/CD 流程。

你可以在 GitLab 界面上看到 CI/CD 的执行结果。

4. 进阶配置

  • 使用 Docker 镜像: 为了保证 CI/CD 环境的一致性,可以使用 Docker 镜像。例如,可以使用官方的 Python 镜像。

    image: python:3.9
    
    stages:
      - build
      - test
      - deploy
    
    build:
      stage: build
      script:
        - echo "Building the application..."
        - pip install -r requirements.txt
    
    test:
      stage: test
      script:
        - echo "Running tests..."
        - pytest --cov=./ --cov-report term-missing
    
    deploy:
      stage: deploy
      script:
        - echo "Deploying the application..."
        # 这里写你的部署命令,比如使用 SSH 上传到服务器
  • 使用 Services: 如果你的应用依赖于数据库或者其他服务,可以使用 services 关键字来启动这些服务。

    image: python:3.9
    
    services:
      - postgres:13
    
    stages:
      - build
      - test
      - deploy
    
    build:
      stage: build
      script:
        - echo "Building the application..."
        - pip install -r requirements.txt
    
    test:
      stage: test
      variables:
        DATABASE_URL: "postgresql://postgres:@postgres:5432/postgres"
      script:
        - echo "Running tests..."
        - pytest --cov=./ --cov-report term-missing
    
    deploy:
      stage: deploy
      script:
        - echo "Deploying the application..."
        # 这里写你的部署命令,比如使用 SSH 上传到服务器
  • 缓存依赖: 为了加速 CI/CD 流程,可以使用 cache 关键字来缓存依赖。

    image: python:3.9
    
    stages:
      - build
      - test
      - deploy
    
    build:
      stage: build
      script:
        - echo "Building the application..."
        - pip install -r requirements.txt
      cache:
        paths:
          - venv/
    
    test:
      stage: test
      script:
        - echo "Running tests..."
        - source venv/bin/activate
        - pytest --cov=./ --cov-report term-missing
    
    deploy:
      stage: deploy
      script:
        - echo "Deploying the application..."
        # 这里写你的部署命令,比如使用 SSH 上传到服务器

第三部分:Jenkins 实战

Jenkins 是一个开源的自动化服务器,可以用于构建、测试和部署软件。相比 GitLab CI,Jenkins 更加灵活,可以定制各种各样的 CI/CD 流程。

1. 安装 Jenkins

安装 Jenkins 的方法有很多种,可以选择适合你的方式。这里以 Docker 安装为例:

docker run -d -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:lts

等待 Jenkins 启动完成后,通过浏览器访问 http://localhost:8080,按照提示完成初始化配置。

2. 安装插件

Jenkins 的功能可以通过插件来扩展。我们需要安装以下插件:

  • Git: 用于从 Git 仓库拉取代码。
  • Python: 用于执行 Python 脚本。
  • pytest: 用于运行 pytest 测试用例。
  • Publish Over SSH: 用于通过 SSH 部署应用程序。

3. 创建 Jenkins Pipeline

Jenkins Pipeline 是一种以代码形式定义 CI/CD 流程的方式。我们可以使用 Jenkinsfile 来定义 Pipeline。

下面是一个简单的 Jenkinsfile 示例:

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                echo 'Building the application...'
                sh 'python -m venv venv'
                sh 'source venv/bin/activate && pip install -r requirements.txt'
            }
        }
        stage('Test') {
            steps {
                echo 'Running tests...'
                sh 'source venv/bin/activate && pytest --cov=./ --cov-report term-missing'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying the application...'
                // 这里写你的部署命令,比如使用 SSH 上传到服务器
                // 示例:sshPublisher(publishers: [sshPublisherDesc(configName: 'your_ssh_config', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'sudo systemctl restart your_app', flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, remoteDirectory: '/var/www/your_app', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '**/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
    }
}

这个 Pipeline 定义了三个阶段:Build, Test, Deploy

  • Build 阶段:安装项目依赖。
  • Test 阶段:运行测试用例。
  • Deploy 阶段:部署应用程序。

4. 配置 Jenkins Job

  1. 在 Jenkins 界面上,点击 "新建 Item",选择 "Pipeline"。
  2. 在 "配置" 页面,选择 "Pipeline script from SCM",并填写 Git 仓库的 URL 和凭据。
  3. 将上面的 Jenkinsfile 代码复制到 "Script Path" 字段。
  4. 点击 "保存"。

5. 运行 Jenkins Job

点击 Jenkins Job 的 "Build Now" 按钮,就可以运行 CI/CD 流程。

你可以在 Jenkins 界面上看到 Job 的执行结果。

6. 进阶配置

  • 使用 Declarative Pipeline: Jenkins Pipeline 有两种语法:Scripted Pipeline 和 Declarative Pipeline。Declarative Pipeline 更加易读易懂,推荐使用。

    pipeline {
        agent any
        stages {
            stage('Build') {
                steps {
                    script {
                        echo 'Building the application...'
                        sh 'python -m venv venv'
                        sh 'source venv/bin/activate && pip install -r requirements.txt'
                    }
                }
            }
            stage('Test') {
                steps {
                    script {
                        echo 'Running tests...'
                        sh 'source venv/bin/activate && pytest --cov=./ --cov-report term-missing'
                    }
                }
            }
            stage('Deploy') {
                steps {
                    script {
                        echo 'Deploying the application...'
                        // 这里写你的部署命令,比如使用 SSH 上传到服务器
                        // 示例:sshPublisher(publishers: [sshPublisherDesc(configName: 'your_ssh_config', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'sudo systemctl restart your_app', flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, remoteDirectory: '/var/www/your_app', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '**/*')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                    }
                }
            }
        }
    }
  • 使用 Shared Libraries: 为了提高代码复用性,可以将常用的 CI/CD 逻辑封装成 Shared Libraries。

  • 集成其他工具: Jenkins 可以集成各种各样的工具,比如 SonarQube (代码质量分析)、Slack (通知) 等。

第四部分:GitLab CI vs Jenkins

特性 GitLab CI Jenkins
易用性 简单易用,配置方便 配置复杂,需要安装插件
灵活性 相对较低,定制性有限 灵活,可以定制各种各样的 CI/CD 流程
集成度 与 GitLab 集成紧密,开箱即用 需要手动集成各种工具
学习曲线 较低 较高
适用场景 适合小型项目和简单 CI/CD 流程 适合大型项目和复杂 CI/CD 流程
社区支持 活跃,但相对 Jenkins 较小 非常活跃,插件丰富
成本 GitLab SaaS 版本有免费额度,自建需要服务器 免费,但需要服务器资源

总结

GitLab CI 和 Jenkins 都是优秀的 CI/CD 工具,选择哪个取决于你的项目需求和团队习惯。GitLab CI 简单易用,适合小型项目和简单 CI/CD 流程;Jenkins 更加灵活,适合大型项目和复杂 CI/CD 流程。

希望今天的讲座能帮助大家入门 Python 的 CI/CD。记住,自动化是解放生产力的关键!祝大家早日实现自动化测试和部署,有更多时间摸鱼…啊不,是专注于核心功能开发!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注