什么是 CI
持续集成
通过自动化的流程和工具,提高软件开发的效率、质量和交付速度。
持续集成是开发团队通过将代码的不同部分集成到共享存储库中,并频繁地进行构建和测试,以确保代码的一致性和稳定性。
概念
在现在的开发模式中,一般的项目,协同开发是离不开的,这就涉及到多个开发人员编写处理自己负责的功能模块或者某些开发人员共同负责一个模块。于是,通过版本控制系统可以将各个开发人员的代码集成在该共享存储库里,在存储库里,每个开发人员根据需求的不同来创建对应的分支,在完成需求后,每个人都需要提交合并将开发分支代码集成在一起,这就需要解决代码冲突,并且如何除了code review之外如何确保这些更改对应用没有产生影响,一旦提交请求合并到主分支,自动化构建工具就会根据流程自动编译构建安装应用,并执行单元测试框架的自动化测试来校验提交的修改。
CI 主要有三部分组成
1.版本控制系统 如 git
2.自动化构建工具 如 Jenkins
3.单元测试框架 如 JUnit Jcoco
什么是 CD
持续交付
持续交付建立在持续集成的基础上,通过自动化的流程确保软件可以随时随地进行部署。
概念
这时,持续交付后的代码已经在主分支上了,这处于某个版本的待发布的状态,随时可以将开发环境的功能部署到生产环境中(部署到生成环境前还需要在测试环境性能测试、回归测试、自动化测试、人工测试等),运行脚本构建打包应用,通过自动化部署工具部署到生产环境运行应用,监控生产环境指标,如出现问题和错误,可以触发手动或自动回滚,如系统正常,则定期回顾,收集反馈,优化,并持续改进。
CD 主要有三部分组成
1.自动化部署工具 如 docker
2.环境变量控制工具
3.持续监控和反馈
好处
减少集成问题
提高代码质量
提高开发效率
快速交付到生产环境
降低风险
降低发布成本
支持持续改进
GitHub Action
采用CI/CD可以通过自动化流程和工具自动帮你构建应用、测试应用、部署应用,将你的应用交给流程工具来管理,做到自动触发、验证、部署等功能,从而减省人工成本、提高交付速度,在敏捷开发、DevOps中扮演着重要的角色。
GitHub Action正是这样一个实现持续集成交付的自动化流程工具,是由GitHub提供的一个组件。你可以通过YAML文件的配置定义工作流程以构建执行CI/CD流水线,并可以触发不同事件时(如代码提交push、Pull Request、schedule)自动执行这些工作流程。
工作流(Workflows)
工作流是GitHub Actions执行任务的基本单位,你可以为Git上不同的事件(如push、pull、request等)定义不同的工作流,以响应操作代码的变更。
任务(Jobs)
工作流程由一个或多个任务组成,每个任务运行在独立的虚拟环境中。任务可以是构建、测试、部署等操作。
步骤(Steps)
任务由多个步骤组成,每个步骤执行一个操作。一个步骤可以是运行命令、使用某个预定义的操作,或者调用自定义脚本。
举例
假如我们对项目中其中一个服务做了修改,添加了某些功能,完成任务后,我们在本地分支通过Git提交代码到Github项目仓库下的dev分支(这里直接本地提交到测试分支,省去测试环境测试的流程),并请求合并到master分支,这时,我们希望在合并之前先对该模块进行构建,运行测试来校验代码质量与验证代码是否出错,确保代码的基本功能在集成后仍然有效,测试通过后,提交到打包部署分支bdeploy来自动将模块打包成一个容器镜像推送到容器镜像仓库,并将docker-compose文件拷贝到远程生产服务器执行部署。
name: compile
on:
pull_request:
paths: #当有 pull request,且文件路径包含 Java 文件或者当前的工作流配置文件时触发。
- '**.java'
- .github/workflows/compile.yml
jobs:
compile: #任务名称
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: Checkout code
uses: actions/checkout@v3 #actions/checkout@v3 是 GitHub Actions 中一个常用的操作(Action),用于从存储库中检出代码。@v3 是指定该 Action 的版本号。在这里,v3 表示使用的是版本 3。
- name: Set up Java
uses: actions/setup-java@v3 #actions/setup-java@v3 操作被用于设置 Java 运行环境
with:
java-version: '11' # 指定所需的 Java 版本
distribution: 'temurin' #'temurin' 表示使用 Temurin(先前称为 AdoptOpenJDK) 的发行版。Temurin 提供了免费的、社区驱动的 OpenJDK 发行版。
- name: Build with Maven
run: mvn clean install
- name: Run JUnit test
run: mvn test
GitHub Action 示例 自己写的
我自己写的一份
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
name: Java CI with Maven
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
# 在linux上跑 使用的环境是ubuntu
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: maven
# 打包项目
- name: Build with Maven
run: mvn -B package --file pom.xml
# 执行单元测试
# - name: Run Tests
# run: mvn test
# 检查依赖
- name: Update dependency graph
uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6
# 代码静态检查
- name: Code Static Analysis
run: |
mvn checkstyle:check
mvn pmd:check
mvn spotbugs:check
# 代码覆盖率检查
- name: Code Coverage
run: mvn jacoco:report # 生成 JaCoCo 覆盖率报告、
每次提交后都会进行 跑一个 持续集成的流程
并且给出报告
参考文章
深入理解CI/CD:构建、测试和部署的完整流程_cicd自动化部署流程-CSDN博客