1. 首页 > IT综合教程 > 正文

it教程FG054-DevOps实践与CI/CD流水线

内容大纲

1. DevOps概述

DevOps是一种软件开发和IT运维的方法论,旨在通过自动化和文化变革,缩短从开发到部署的时间,提高软件质量和可靠性。DevOps强调开发团队和运维团队之间的协作和沟通,通过自动化工具和流程,实现持续集成、持续交付和持续部署。

DevOps的核心原则包括:

  • 自动化:自动化构建、测试、部署等流程,减少人工干预
  • 持续集成:频繁地将代码集成到共享仓库,通过自动化测试确保代码质量
  • 持续交付:确保代码可以随时部署到生产环境
  • 持续部署:自动将代码部署到生产环境
  • 监控与反馈:实时监控应用程序和基础设施,及时发现和解决问题
  • 协作与沟通:打破开发和运维之间的壁垒,促进团队协作

风哥风哥提示:DevOps已成为现代软件开发的标准实践,它可以帮助组织提高开发效率,缩短发布周期,提高软件质量和可靠性。

2. CI/CD基础知识

2.1 持续集成(CI)

持续集成是指开发人员频繁地将代码集成到共享仓库,每次集成都会触发自动化构建和测试,以确保代码质量。持续集成的主要目标是尽早发现和解决集成问题,减少集成风险。

持续集成的关键步骤包括:

  • 代码提交:开发人员将代码提交到版本控制系统
  • 自动化构建:构建系统自动编译代码,生成可执行文件
  • 自动化测试:运行单元测试、集成测试等,确保代码质量
  • 代码质量检查:检查代码风格、复杂度等,确保代码符合规范
  • 反馈:向开发人员提供构建和测试结果的反馈

2.2 持续交付(CD)

持续交付是指确保代码可以随时部署到生产环境的过程。持续交付要求代码始终处于可部署状态,通过自动化测试和部署流程,减少部署风险。

持续交付的关键步骤包括:

  • 持续集成:确保代码质量
  • 自动化测试:包括单元测试、集成测试、端到端测试等
  • 环境管理:管理开发、测试、预生产和生产环境
  • 部署自动化:自动化部署流程,减少人为错误
  • 发布管理:管理版本发布,确保发布过程可控

2.3 持续部署(CD)

持续部署是持续交付的延伸,它自动将代码部署到生产环境,无需人工干预。持续部署要求高度自动化和可靠的测试流程,以确保部署的安全性和稳定性。

3. Jenkins安装与配置

3.1 安装Jenkins

# 安装Java
sudo apt-get update
sudo apt-get install -y openjdk-11-jdk

# 添加Jenkins仓库
wget -q -O – https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add –
sudo sh -c ‘echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list’

# 安装Jenkins
sudo apt-get update
sudo apt-get install -y jenkins

# 启动Jenkins服务
sudo systemctl start jenkins

# 设置Jenkins服务开机自启
sudo systemctl enable jenkins

# 查看Jenkins服务状态
sudo systemctl status jenkins

● jenkins.service – LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; generated)
Active: active (running) since Thu 2026-04-03 10:00:00 UTC; 5min ago
Docs: man:systemd-sysv-generator(8)
Tasks: 49 (limit: 4666)
Memory: 457.4M
CPU: 36.958s
CGroup: /system.slice/jenkins.service
└─1234 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/jenkins/jenkins.war –webroot=/var/cache/jenkins/war –httpPort=8080

3.2 配置Jenkins

访问Jenkins Web界面(http://fgedudb:8080),按照以下步骤配置:

  1. 获取初始管理员密码:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

1234567890abcdef1234567890abcdef
  1. 在Web界面中输入初始管理员密码
  2. 选择”安装推荐的插件”
  3. 创建管理员用户
  4. 配置Jenkins URL
  5. 完成配置

3.3 安装必要的插件

在Jenkins管理界面中,点击”插件管理”,安装以下插件:

  • Git:用于代码仓库集成
  • Pipeline:用于创建CI/CD流水线
  • Blue Ocean:提供现代化的流水线可视化界面
  • Docker:用于Docker集成
  • Kubernetes:用于Kubernetes集成
  • SonarQube Scanner:用于代码质量分析
  • Credentials Binding:用于管理凭证

4. Jenkins流水线配置

4.1 创建流水线项目

在Jenkins管理界面中,点击”新建项目”,选择”流水线”,输入项目名称,点击”确定”。

4.2 配置流水线

在流水线配置页面中,选择”Pipeline script from SCM”,配置以下信息:

  • SCM:选择”Git”
  • Repository URL:输入Git仓库URL
  • Credentials:选择或添加Git凭证
  • Branches to build:输入分支名称,如”*/main”
  • Script Path:输入Jenkinsfile路径,如”Jenkinsfile”

4.3 编写Jenkinsfile

pipeline {
agent any

stages {
stage(‘Checkout’) {
steps {
checkout scm
}
}

stage(‘Build’) {
steps {
sh ‘mvn clean package’
}
}

stage(‘Test’) {
steps {
sh ‘mvn test’
}
}

stage(‘Code Quality’) {
steps {
sh ‘mvn sonar:sonar’
}
}

stage(‘Build Docker Image’) {
steps {
sh ‘docker build -t myapp:${BUILD_NUMBER} .’
sh ‘docker tag myapp:${BUILD_NUMBER} myapp:latest’
}
}

stage(‘Deploy to Test’) {
steps {
sh ‘docker run -d -p 8080:8080 –name myapp-test myapp:${BUILD_NUMBER}’
}
}

stage(‘Deploy to Production’) {
when {
branch ‘main’
}
steps {
sh ‘docker push myapp:${BUILD_NUMBER}’
sh ‘kubectl apply -f k8s/deployment.yaml’
}
}
}

post {
success {
echo ‘Pipeline completed successfully!’
}
failure {
echo ‘Pipeline failed!’
mail to: ‘team@fgedu.net.cn’, subject: ‘Pipeline Failed’, body: ‘The pipeline for ${JOB_NAME} has failed.’
}
}
}

4.4 运行流水线

点击”立即构建”按钮,运行流水线。在Blue Ocean界面中可以查看流水线的运行状态和详细日志。

5. GitLab CI/CD配置

5.1 配置GitLab CI/CD

在GitLab仓库中,创建.gitlab-ci.yml文件,配置CI/CD流水线。

stages:
– checkout
– build
– test
– code_quality
– build_image
– deploy_test
– deploy_production

checkout:
stage: checkout
script:
– echo “Checking out code…”
– git checkout $CI_COMMIT_REF_NAME

build:
stage: build
script:
– echo “Building application…”
– mvn clean package
artifacts:
paths:
– target/*.jar
only:
– main
– develop

test:
stage: test
script:
– echo “Running tests…”
– mvn test

code_quality:
stage: code_quality
script:
– echo “Running code quality analysis…”
– mvn sonar:sonar

build_image:
stage: build_image
script:
– echo “Building Docker image…”
– docker build -t myapp:$CI_COMMIT_SHORT_SHA .
– docker tag myapp:$CI_COMMIT_SHORT_SHA myapp:latest

deploy_test:
stage: deploy_test
script:
– echo “Deploying to test environment…”
– docker run -d -p 8080:8080 –name myapp-test myapp:$CI_COMMIT_SHORT_SHA
environment:
name: test
only:
– develop

deploy_production:
stage: deploy_production
script:
– echo “Deploying to production environment…”
– docker push myapp:$CI_COMMIT_SHORT_SHA
– kubectl apply -f k8s/deployment.yaml
environment:
name: production
only:
– main
when: manual

5.2 配置GitLab Runner

# 下载GitLab Runner
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash

# 安装GitLab Runner
sudo apt-get install gitlab-runner

# 注册GitLab Runner
sudo gitlab-runner register

Runtime platform arch=amd64 os=linux pid=12345 revision=12345678 version=14.0.0
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
https://gitlab.com/

Enter the registration token:
1234567890abcdef1234567890abcdef

Enter a description for the runner:
[hostname]: My GitLab Runner

Enter tags for the runner (comma-separated):
docker,linux

Enter an executor:
docker, parallels, shell, ssh, virtualbox, docker-ssh, docker+machine, docker-ssh+machine, kubernetes, custom
docker

Enter the default Docker image:
alpine:latest

Runner registered successfully. Feel free to start it, but if it’s running already the config should be automatically reloaded!

6. GitHub Actions配置

6.1 配置GitHub Actions

在GitHub仓库中,创建.github/workflows/ci-cd.yml文件,配置CI/CD流水线。

name: CI/CD Pipeline

on:
push:
branches:
– main
– develop
pull_request:
branches:
– main
– develop

jobs:
checkout:
runs-on: ubuntu-latest
steps:
– name: Checkout code
uses: actions/checkout@v2

build:
needs: checkout
runs-on: ubuntu-latest
steps:
– name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: ’11’
distribution: ‘adopt’
– name: Build with Maven
run: mvn clean package
– name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: myapp
path: target/*.jar

test:
needs: build
runs-on: ubuntu-latest
steps:
– name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: ’11’
distribution: ‘adopt’
– name: Run tests
run: mvn test

code_quality:
needs: test
runs-on: ubuntu-latest
steps:
– name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: ’11’
distribution: ‘adopt’
– name: Run SonarQube analysis
run: mvn sonar:sonar
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}

build_image:
needs: code_quality
runs-on: ubuntu-latest
steps:
– name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
– name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: myusername/myapp:${{ github.sha }}, myusername/myapp:latest

deploy_test:
needs: build_image
runs-on: ubuntu-latest
if: github.ref == ‘refs/heads/develop’
steps:
– name: Deploy to test environment
run: |
docker run -d -p 8080:8080 –name myapp-test myusername/myapp:${{ github.sha }}

deploy_production:
needs: build_image
runs-on: ubuntu-latest
if: github.ref == ‘refs/heads/main’
steps:
– name: Deploy to production environment
run: |
kubectl apply -f k8s/deployment.yaml
env:
KUBECONFIG: ${{ secrets.KUBECONFIG }}

6.2 配置GitHub Secrets

在GitHub仓库的”Settings” > “Secrets”页面中,添加以下secrets:

  • SONAR_TOKEN:SonarQube访问令牌
  • SONAR_HOST_URL:SonarQube服务器URL
  • DOCKER_USERNAME:Docker Hubfgedu
  • DOCKER_PASSWORD:Docker Hub密码
  • KUBECONFIG:Kubernetes配置文件内容

7. 流水线设计最佳实践

7.1 流水线设计原则

  • 模块化:将流水线分解为多个阶段,每个阶段负责特定的任务
  • 并行化:尽可能并行执行任务,减少流水线运行时间
  • 可重用性:使用模板和共享库,提高流水线的可重用性
  • 可扩展性:设计灵活的流水线,能够适应不同的项目需求
  • 可观测性:添加监控和日志,提高流水线的可观测性
  • 安全性:集成安全扫描,确保代码和依赖的安全性

7.2 流水线阶段设计

一个典型的CI/CD流水线包括以下阶段:

  1. 代码检出:从版本控制系统检出代码
  2. 依赖管理:安装和管理依赖项
  3. 构建:编译代码,生成可执行文件
  4. 测试:运行单元测试、集成测试、端到端测试等
  5. 代码质量分析:检查代码风格、复杂度、安全性等
  6. 安全扫描:扫描代码和依赖中的安全漏洞
  7. 打包:打包应用程序,生成部署包
  8. 部署到测试环境:部署到测试环境进行验证
  9. 部署到预生产环境:部署到预生产环境进行最终验证
  10. 部署到生产环境:部署到生产环境
  11. 监控与告警:监控应用程序运行状态,设置告警

7.3 流水线优化

  • 缓存依赖:缓存依赖项,减少构建时间
  • 并行测试:并行运行测试,减少测试时间
  • 增量构建:只构建修改的部分,减少构建时间
  • 使用容器:使用容器运行构建和测试,提高环境一致性
  • 自动扩展:根据负载自动扩展构建资源
  • 失败快速:尽早发现和解决问题,减少流水线运行时间

学习交流加群风哥微信: itpux-com

8. 监控与告警

8.1 监控流水线

监控CI/CD流水线的运行状态和性能,及时发现和解决问题。常用的监控工具包括:

  • Prometheus:监控流水线的运行状态和性能
  • Grafana:可视化监控数据
  • ELK Stack:收集和分析流水线日志
  • PagerDuty:管理告警和事件响应

8.2 配置告警

为流水线配置告警,当流水线失败或出现异常时,及时通知相关人员。告警渠道包括:

  • 邮件:发送邮件通知
  • Slack:在Slack频道中发送通知
  • 微信:通过微信发送通知
  • 短信:发送短信通知

9. 安全集成

9.1 安全扫描

在CI/CD流水线中集成安全扫描,确保代码和依赖的安全性。常用的安全扫描工具包括:

  • SonarQube:代码质量和安全分析
  • OWASP ZAP:Web应用安全扫描
  • Trivy:容器和依赖安全扫描
  • Snyk:依赖安全扫描
  • Checkmarx:静态代码分析

9.2 安全最佳实践

  • 使用安全的基础镜像:选择官方和经过安全审计的基础镜像
  • 定期更新依赖:及时更新依赖项,修复安全漏洞
  • 使用最小权限原则:限制流水线和容器的权限
  • 加密敏感信息:使用secrets管理敏感信息
  • 扫描容器镜像:在构建过程中扫描容器镜像的安全漏洞
  • 实施代码签名:对代码和构建产物进行签名,确保完整性

10. 案例分析

10.1 案例一:微服务架构的CI/CD流水线

某公司采用微服务架构,使用Jenkins和Kubernetes构建CI/CD流水线。流水线包括以下步骤:

  1. 代码检出:从Git仓库检出代码
  2. 依赖管理:使用Maven管理Java依赖
  3. 构建:编译代码,生成Docker镜像
  4. 测试:运行单元测试和集成测试
  5. 代码质量分析:使用SonarQube进行代码质量分析
  6. 安全扫描:使用Trivy扫描容器镜像的安全漏洞
  7. 部署到测试环境:部署到Kubernetes测试集群
  8. 端到端测试:运行端到端测试
  9. 部署到预生产环境:部署到Kubernetes预生产集群
  10. 手动审批:等待运维人员审批
  11. 部署到生产环境:部署到Kubernetes生产集群
  12. 监控与告警:使用Prometheus和Grafana监控应用程序运行状态

10.2 案例二:前端项目的CI/CD流水线

某公司的前端项目使用GitHub Actions构建CI/CD流水线。流水线包括以下步骤:

  1. 代码检出:从GitHub仓库检出代码
  2. 依赖管理:使用npm安装依赖
  3. 代码质量检查:使用ESLint检查代码风格
  4. 测试:运行单元测试和端到端测试
  5. 构建:构建前端项目,生成静态文件
  6. 部署到测试环境:部署到测试服务器
  7. 部署到生产环境:部署到CDN
  8. 监控与告警:使用New Relic监控应用程序运行状态

11. 常见问题与解决方案

11.1 流水线构建失败

问题:流水线构建失败,无法完成构建过程

解决方案:查看构建日志,分析失败原因

# 查看Jenkins构建日志
jenkins-cli.sh -s http://fgedudb:8080/ get-job-build-logs my-job 1

11.2 依赖安装失败

问题:依赖安装失败,无法完成构建

解决方案:检查网络连接,使用依赖缓存,或更换依赖源

# 使用国内镜像源
npm config set registry https://registry.npm.taobao.org
mvn -Dmaven.repo.local=/path/to/cache clean package

11.3 测试失败

问题:测试失败,无法通过CI/CD流水线

解决方案:分析测试失败原因,修复代码,确保测试通过

# 运行单个测试,查看详细日志
mvn -Dtest=MyTest test

11.4 部署失败

问题:部署失败,无法将应用程序部署到目标环境

解决方案:检查目标环境的状态,验证部署配置,确保网络连接正常

# 检查Kubernetes集群状态
kubectl get nodes
kubectl get pods

11.5 安全扫描失败

问题:安全扫描失败,发现安全漏洞

解决方案:修复安全漏洞,更新依赖项,或添加漏洞例外

# 使用Trivy扫描容器镜像
trivy image myapp:latest

更多学习教程www.fgedu.net.cn

学习交流加群风哥QQ113257174

更多学习教程公众号风哥教程itpux_com

author:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息