CI/CD基础知识

什么是CI/CD

CI:持续集成,开发人员频繁地将代码集成到主干(主分支)中每次集成都通过自动化构建和测试来验证,从而尽早发现集成错误,常用的CI工具包括Jenkins、Travis CI、CircleCI、GitLab CI等

CD: 持续交付或持续部署,持续交付是指在持续集成的基础上,自动化将代码部署到生产环境或预生产环境的过程。它确保代码在任何时候都可以安全地部署到生产环境。自动化部署 :通过自动化脚本将应用程序部署到服务器,减少手动操作的错误。可随时发布 :代码经过测试后,可以随时选择将其发布到生产环境。环境一致性:确保开发、测试和生产环境的一致性,以减少环境差异带来的问题。工具:常用的持续交付工具包括Spinnaker、Octopus Deploy、AWS CodeDeploy等。

1、常用的CI/CD工具

特性 GitLab CI/CD Travis CI Jenkins
部署模式 内置于 GitLab(SaaS/自托管) 纯 SaaS(无自托管版) 自托管为主(支持云托管)
配置方式 .gitlab-ci.yml 文件 .travis.yml 文件 Jenkinsfile(Groovy DSL)
执行环境 GitLab Runner(可自定义) 预置的虚拟机环境 Agent/Node 自由扩展
依赖管理 自带 Artifact 存储 有限缓存机制 需插件(如 Nexus 集成)
网络拓扑 原生 Kubernetes 集成 固定环境无集群管理 支持混合云集群调度

第三方服务集成

服务类型 GitLab CI Travis CI Jenkins
代码质量 内置 SAST/DAST 扫描 需通过插件扩展 需安装 SonarQube 插件
通知渠道 20+ 内置通知方式 基础邮件/Slack 500+ 通知插件
安全扫描 集成 Dependency Scanning 依赖第三方脚本 需配置安全工具链
K8s 集成 原生支持 Auto DevOps 需手动配置 kubectl 通过 Kubernetes 插件

2、CI/CD中的jenkins

1、jenkins的基本知识

Jenkins是一款开源的自动化服务器,广泛用于持续集成(CI)和持续交付(CD)过程。它提供了一系列功能,帮助开发团队自动化软件构建、测试和部署。

|-----------|------------------------------------------------------|
| 主要功能 | 持续集成:自动化构建和测试代码,确保每次提交都能快速反馈 |
| 插件支持 | Jenkins有丰富的插件生态系统,支持与各种工具和技术集成如Git、Maven、Docker、K8s等 |
| 构建自动化 | 支持多种构建工具和语言,能够自动化构建过程,生成可执行文件或其他工件。 |
| 分布式构建 | 支持在多台机器上并行构建,提升构建效率,适用于大型项目。 |
| 可视化界面 | 提供用户友好的Web界面,方便用户配置和监控构建任务 |
| 定时构建 | 支持定时触发构建任务,能够根据预设的时间表自动执行 |
| 通知和报告 | 提供构建状态通知功能,可以通过电子邮件、Slack等方式发送构建结果 |
| 集成测试 | 支持自动化测试框架,能够在构建过程中运行单元测试和集成测试 |

优势:开源和免费:灵活性和可扩展性:社区支持:跨平台支持:提高开发效率:快速反馈:

2、在jenkins如何配置实现CI/CD

|-----------------|----------------------------------------------------------------------------------------|
| 一:安装Jenkins | 1、下载和安装Jenkins:2、启动Jenkins并完成初始配置。3、安装必要的插件:git、docker、"Pipeline"插件(通常默认已安装) |
| 二:创建流水线项目 | 新建流水线项目 :在Jenkins主页,点击"新建任务"。输入项目名称,选择"流水线",然后点击"确定"。 配置流水线:在项目配置页面,找到"流水线"部分。 |
| 三:编写流水线脚本 | Jenkins支持两种类型的流水线:声明式流水线和脚本式流水线。 |
| 四:保存和构建 | 保存配置:完成流水线脚本的编写后,点击"保存"。 构建流水线:在项目主页,点击"立即构建"按钮,开始执行流水线。 可以在"构建历史"中查看构建状态和日志。 |
| 五:监控和通知 | 监控构建状态:Jenkins提供了实时的构建日志和状态监控,可以查看每个阶段的执行情况。 设置通知:可以通过邮件、Slack等方式配置构建通知,确保团队及时了解构建状态 |

1、实现重点

- Pipeline脚本

在Jenkins中,Pipeline脚本主要有两种类型:声明式流水线(Declarative Pipeline)和脚本式流水线(Scripted Pipeline)。

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------|
| 声明式流水线(Declarative Pipeline) | 脚本式流水线(Scripted Pipeline) |
| 易读性 :声明式流水线的语法更为简洁和直观。 结构化 :使用固定的结构,便于理解和维护。 内置功能:提供了一些内置的功能,如post、options等,简化了常见的任务。 | 灵活性 :使用Groovy语言编写,提供了更大的灵活性和控制能力 复杂逻辑 :适合需要复杂逻辑和条件判断的场景 不规则结构:没有固定的结构,可能会导致可读性降低,尤其是对于大型项目 |
| 组成元素: pipeline:整个流水线的定义。 agent:指定代理上执行流水线,特定或任何可用的节点 stages:流水线的各个阶段,包含多个stage stage:每个阶段的定义,表示流水线中的一个步骤 steps:在每个阶段中执行的具体操作可以是命令、脚本等 post:定义在流水线执行后的操作如成功、失败时的处理 | 组成元素: node:定义在某个代理节点上执行的代码块。 stage:定义流水线中的一个阶段。 steps:在每个阶段中执行的具体操作。 try-catch-finally:用于处理异常和控制流程。 environment:定义环境变量。 |

声明式流水线
Groovy 复制代码
pipeline {
    agent any

    environment {
        // 定义环境变量
        NODE_ENV = 'production'
    }

    stages {
        stage('Checkout') {
            steps {
                // 从Git仓库检出代码
                git url: 'https://github.com/your-repo.git', branch: 'main'
            }
        }

        stage('Build') {
            steps {
                // 执行构建命令
                sh 'npm install'
                sh 'npm run build'
            }
        }

        stage('Code Quality') {
            steps {
                // 运行代码质量检查
                sh 'npm run lint'
            }
        }

        stage('Test') {
            steps {
                // 执行单元测试
                sh 'npm test'
            }
        }

        stage('Deploy') {
            steps {
                script {
                    // 根据环境变量决定部署目标
                    if (NODE_ENV == 'production') {
                        sh 'scp -r dist/* user@production-server:/path/to/deploy'
                    } else {
                        sh 'scp -r dist/* user@staging-server:/path/to/deploy'
                    }
                }
            }
        }
    }

    post {
        success {
            // 构建成功后的操作
            echo 'Build succeeded!'
        }
        failure {
            // 构建失败后的操作
            echo 'Build failed!'
        }
        always {
            // 无论成功与否都执行的操作
            cleanWs() // 清理工作区
        }
    }
}
脚本式流水线
Groovy 复制代码
node {
    // 定义环境变量
    def NODE_ENV = 'production'

    stage('Checkout') {
        echo 'Checking out code...'
        // 从Git仓库检出代码
        git url: 'https://github.com/your-repo.git', branch: 'main'
    }

    stage('Build') {
        echo 'Building the application...'
        // 执行构建命令
        sh 'npm install'
        sh 'npm run build'
    }

    stage('Code Quality') {
        echo 'Running code quality checks...'
        // 运行代码质量检查
        sh 'npm run lint'
    }

    stage('Test') {
        echo 'Running tests...'
        // 执行单元测试
        sh 'npm test'
    }

    stage('Deploy') {
        echo 'Deploying the application...'
        // 根据环境变量决定部署目标
        if (NODE_ENV == 'production') {
            sh 'scp -r dist/* user@production-server:/path/to/deploy'
        } else {
            sh 'scp -r dist/* user@staging-server:/path/to/deploy'
        }
    }

    // 后处理步骤
    try {
        // 这里可以添加一些后处理逻辑
    } catch (Exception e) {
        echo 'An error occurred: ' + e.getMessage()
    } finally {
        // 清理工作区
        cleanWs()
    }
}

2、多分支流水线管理

1、安装pipline和multibranch pipline插件;

2、创建multobranch pipline项目;

3、配置git仓库,指定git的url配置凭证;

4、配置分支发现,添加branch Sources配置发现策略,按命名发现和按分支发现。

5、在git存储的每个分支根目录下添加jenkinsfile定义该分支的流水线逻辑;

6、保存并构建:jenkins会自动扫描git存储库的分支找到分支创建对应的pipline。

3、jenkins配置git集成出发自动集成

Webhook 自动触发(推荐方案)1、安装jenkins和git插件;2、创建jenkins任务配置git仓库url;3、Git 设置 Webhook: URL: http://jenkins.example.com/project/my-pipeline;Secret Token: 与Jenkins全局配置一致;触发事件: Push events, Merge Request events;4、验证配置提交代码观察是否自动构建。

4、jenkins如何配置构建参数实现不同环境的部署

在Jenkins中,可以通过配置构建参数来实现不同环境的部署。这通常涉及到使用参数化构建,使得用户在触发构建时可以选择目标环境。

1、创建参数化构建 步骤:1)创建或配置一个Pipeline项目:2)启用参数化构建:在项目配置页面,找到"参数化构建过程"选项,勾选"参数化构建过程"。点击"添加参数",选择合适的参数类型。例如,可以选择"选择参数"(Choice Parameter)或"字符串参数"(String Parameter)。3)配置参数:如果选择"选择参数",可以在"选择参数"字段中输入不同的环境选项,例如:development;staging;production 如果选择"字符串参数",可以设置一个默认值,用户可以在构建时输入目标环境。

  1. 修改Jenkinsfile: 在Jenkinsfile中,使用传入的参数来决定部署的目标环境。
Groovy 复制代码
pipeline {
    agent any

    parameters {
        choice(name: 'DEPLOY_ENV', choices: ['development', 'staging', 'production'], description: '选择部署环境')
    }

    stages {
        stage('Checkout') {
            steps {
                git url: 'https://github.com/your-repo.git', branch: 'main'
            }
        }

        stage('Build') {
            steps {
                sh 'npm install'
                sh 'npm run build'
            }
        }

        stage('Deploy') {
            steps {
                script {
                    // 根据选择的环境进行部署
                    if (params.DEPLOY_ENV == 'production') {
                        sh 'scp -r dist/* user@production-server:/path/to/deploy'
                    } else if (params.DEPLOY_ENV == 'staging') {
                        sh 'scp -r dist/* user@staging-server:/path/to/deploy'
                    } else {
                        sh 'scp -r dist/* user@development-server:/path/to/deploy'
                    }
                }
            }
        }
    }

    post {
        success {
            echo 'Deployment succeeded!'
        }
        failure {
            echo 'Deployment failed!'
        }
    }
}

3)触发构建:当用户在Jenkins界面中触发构建时,会看到一个下拉菜单或输入框,允许他们选择或输入目标环境。Jenkins会根据用户选择的环境执行相应的部署步骤。

相关推荐
字节程序员1 天前
Jenkins 持续集成:Linux 系统 两台机器互相免密登录
linux·软件测试·ci/cd·jenkins
全栈开发七分钟2 天前
vercel开源平替,dokploy七分钟国内安装指南
前端·后端·ci/cd
whiteBrocade2 天前
CI/CD-Jenkins安装与应用
运维·ci/cd·jenkins
遇见火星2 天前
自动化发布工具CI/CD实践Jenkins介绍!
运维·ci/cd·自动化·jenkins·自动化发布
阿俊仔(摸鱼版)2 天前
自动化构建攻略:Jenkins + Gitee 实现 Spring Boot 项目自动化构建
运维·ci/cd·gitee·自动化·jenkins
遇见火星3 天前
自动化发布工具CI/CD实践Jenkins部署与配置教程
servlet·ci/cd·自动化·jenkins·自动化发布
遇见火星3 天前
自动化发布工具CI/CD实践Jenkins各配置功能介绍和管理!
ci/cd·自动化·jenkins·自动化发布
糖醋_诗酒3 天前
CI/CD
ci/cd
码农葫芦侠4 天前
GitLab CI/CD学习教程(第四章gitlab-ci.yml)
学习·ci/cd·gitlab