CI/CD教程

 

CI/CD概述

CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。

CI/CD 的核心概念是持续集成、持续交付和持续部署。它是作为一个面向开发和运营团队的解决方案,主要针对在集成新代码时所引发的问题(也称为:“集成地狱”)。

CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试阶段,到交付和部署)。

这些关联的事务通常被统称为 CI/CD 管道,由开发和运维团队以敏捷方式协同支持。

CI 持续集成(Continuous Integration)

协同开发是目前主流的开发方式,也就是多位开发人员可以同时处理同一个应用的不同模块或者功能。

但是,如果企业计划在同一天,将所有开发分支代码集成在一起,最终可能会花费很多时间和进行很多重复劳动,费事费力。因为代码冲突是难以避免的。

如果开发人员本地的环境和线上不一致的话,那么这个问题就更加复杂了。

持续集成(CI)可以帮助开发者更加方便地将代码更改合并到主分支。

一旦开发人员将改动的代码合并到主分支,系统就会通过自动构建应用,并运行不同级别的自动化测试(通常是单元测试和集成测试)来验证这些更改,确保这些更改没有对应用造成破坏。

如果自动化测试发现新代码和现有代码之间存在冲突,CI 可以更加轻松地快速修复这些错误。

CD 持续交付(Continuous Delivery)

CI 在完成了构建、单元测试和集成测试这些自动化流程后,持续交付可以自动把已验证的代码发布到企业自己的存储库。

持续交付旨在建立一个可随时将开发环境的功能部署到生产环境的代码库。

在持续交付过程中,每个步骤都涉及到了测试自动化和代码发布自动化。

在流程结束时,运维团队可以快速、轻松地将应用部署到生产环境中。

CD 持续部署(Continuous Deployment)

对于一个完整、成熟的 CI/CD 管道来说,最后的阶段是持续部署。

它是作为持续交付的延伸,持续部署可以自动将应用发布到生产环境。

实际上,持续部署意味着开发人员对应用的改动,在编写完成后的几分钟内就能及时生效(前提是它通过了自动化测试)。这更加便于运营团队持续接收和整合用户反馈。

总而言之,所有这些 CI/CD 的关联步骤,都极大地降低了应用的部署风险。

不过,由于还需要编写自动化测试以适应 CI/CD 管道中的各种测试和发布阶段,因此前期工作量还是很大的。

Github Actions

GitHub Actions 是 GitHub 提供的一种自动化工具,它可以帮助你在 GitHub 仓库中自动执行软件开发的工作流程。你可以使用 GitHub Actions 来构建、测试和部署你的代码项目。它可以在你的代码仓库中自动执行各种任务,比如运行测试、发布包、创建你的应用等。

GitHub Actions 的工作流程是由一系列的命令(称为 “actions”)组成的,这些命令可以在同一个虚拟环境中按照你定义的顺序执行。你可以创建自己的 actions,也可以使用 GitHub 社区中其他开发者分享的 actions。

Github Actions 的主要特点包括 :

自定义工作流程:你可以创建符合你项目需求的自定义工作流程。

多平台支持:GitHub Actions 提供了多种运行环境,包括 Ubuntu、Windows Server 和 macOS。

事件驱动:你可以配置工作流程在特定的 GitHub 事件(如 push、pull request 或 issue 的创建等)发生时自动执行。

共享和复用:你可以在你的工作流程中使用、共享和复用其他开发者创建的 actions。

内置的秘钥管理:GitHub Actions 提供了一种安全的方式来存储和使用敏感信息(如 API 密钥和凭证),而无需将这些信息公开。

日志和错误跟踪:每次运行工作流程时,GitHub Actions 都会提供详细的日志和错误跟踪信息,帮助你快速定位和解决问题。

从实际项目开始熟悉Github Actions的使用

在这里作为教程我就拿学校里的一个关于Rasa的科研训练项目来讲一下如何使用Github Actions来构建自动部署

首先说明一下这个项目的基本构成:

后端:rasa-project-for-windows

前端:rasa-front-interactive

数据库:rasa-database-sqlite

在这个项目里,我的前端和数据库是使用了Github Actions来进行自动化部署的,后端由于没有足够强大的服务器资源,最后采取的是使用Github的codespace功能 那里的服务器比较强大。

创建一个新的GitHub Actions

这里我将拿我的前端代码来做演示

第一步:创建.github文件夹下的workflows文件夹

error

所有workflows文件夹下的yml文件都会被识别为github的工作流文件用来构建Github Actions

第二步:编写Actions文件

name: Deploy to Server

on:
  push:
    branches:
      - master

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Install SSH key
      uses: webfactory/ssh-agent@v0.5.3
      with:
        ssh-private-key: $

    - name: Deploy to Server
      run: |
        ssh -o StrictHostKeyChecking=no -p 22 bugleesir@207.46.143.24 <<EOF
        sudo su
        cd /home/1007878154/rasa-front-interactive
        screen -S rasa-front-interactive -X quit
        git pull
        # curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
        # sudo apt-get install -y nodejs
        cd /home/1007878154/rasa-front-interactive
        npm install
        screen -S rasa-front-interactive -d -m npm run dev
        EOF

这个是我deploy-2-server.yml中的代码,接下来我将解析这下配置有何作用

on: push: branches: - master

这一系列命令on:代表何时去调用这个action,push:则是指定是在push这个操作执行的时候去调用,即每次推送代码时,- master指的是推送到master 这个分支时会执行

jobs: deploy: runs-on: ubuntu-latest

jobs:这个代表开始执行action,deploy:代表执行的是部署操作,rus-on:指的是在什么环境中去执行这些命令,这里选用的环境是ubuntu-latest即最新的ubuntu环境

Checkout code:这个步骤使用 actions/checkout@v2 这个 GitHub Actions 来检出你的代码。这样,后续的步骤就可以访问到你的代码了。

Install SSH key:这个步骤使用 webfactory/ssh-agent@v0.5.3 这个 GitHub Actions 来安装 SSH 密钥。这个密钥是用来连接到远程服务器的。这个密钥应该是存储在你的 GitHub Secrets 中的。

Deploy to Server:这个步骤将你的项目部署到远程服务器。以下是这个步骤的详细解释:

ssh -o StrictHostKeyChecking=no -p 22 bugleesir@207.46.143.24 «EOF:这个命令会建立一个 SSH 连接到远程服务器。-o StrictHostKeyChecking=no 参数表示不检查远程服务器的主机密钥,这可以避免在首次连接到远程服务器时出现的交互式提示。-p 22 参数表示使用 22 端口连接到远程服务器。bugleesir@207.46.143.24 是远程服务器的用户名和 IP 地址。

cd /home/1007878154/rasa-front-interactive:这个命令会切换到你的项目所在的目录。

screen -S rasa-front-interactive -X quit:这个命令会停止名为 rasa-front-interactive 的 screen 会话。screen 是一个可以在多个进程之间多路复用一个物理终端的全屏窗口管理器。

sudo su:这个命令会切换到 root 用户。

git pull:这个命令会更新你的项目代码。

cd /home/1007878154/rasa-front-interactive:这个命令会再次切换到你的项目所在的目录。

npm install:这个命令会安装你的项目的依赖。

screen -S rasa-front-interactive -d -m npm run dev:这个命令会在一个新的 screen 会话中启动你的项目。-d -m 参数表示创建一个分离的会话。npm run dev 是启动你的项目的命令。

第三步:配置密钥

error

点击仓库的settings,找到Secrets and varibles,点击New repository secret

error

error

取好密钥的名字,其中的内容即是你服务器中所生成的ssh的密钥,一般在.ssh目录下面,保存好密钥后ssh-private-key: $这里要替换为自己刚刚生成好的密钥名