内容大纲
- 1. DevOps概述
- 2. CI/CD基础知识
- 3. Jenkins安装与配置
- 4. Jenkins流水线配置
- 5. GitLab CI/CD配置
- 6. GitHub Actions配置
- 7. 流水线设计最佳实践
- 8. 监控与告警
- 9. 安全集成
- 10. 案例分析
- 11. 常见问题与解决方案
1. DevOps概述
DevOps是一种软件开发和IT运维的方法论,旨在通过自动化和文化变革,缩短从开发到部署的时间,提高软件质量和可靠性。DevOps强调开发团队和运维团队之间的协作和沟通,通过自动化工具和流程,实现持续集成、持续交付和持续部署。
DevOps的核心原则包括:
- 自动化:自动化构建、测试、部署等流程,减少人工干预
- 持续集成:频繁地将代码集成到共享仓库,通过自动化测试确保代码质量
- 持续交付:确保代码可以随时部署到生产环境
- 持续部署:自动将代码部署到生产环境
- 监控与反馈:实时监控应用程序和基础设施,及时发现和解决问题
- 协作与沟通:打破开发和运维之间的壁垒,促进团队协作
风哥风哥提示:DevOps已成为现代软件开发的标准实践,它可以帮助组织提高开发效率,缩短发布周期,提高软件质量和可靠性。
2. CI/CD基础知识
2.1 持续集成(CI)
持续集成是指开发人员频繁地将代码集成到共享仓库,每次集成都会触发自动化构建和测试,以确保代码质量。持续集成的主要目标是尽早发现和解决集成问题,减少集成风险。
持续集成的关键步骤包括:
- 代码提交:开发人员将代码提交到版本控制系统
- 自动化构建:构建系统自动编译代码,生成可执行文件
- 自动化测试:运行单元测试、集成测试等,确保代码质量
- 代码质量检查:检查代码风格、复杂度等,确保代码符合规范
- 反馈:向开发人员提供构建和测试结果的反馈
2.2 持续交付(CD)
持续交付是指确保代码可以随时部署到生产环境的过程。持续交付要求代码始终处于可部署状态,通过自动化测试和部署流程,减少部署风险。
持续交付的关键步骤包括:
- 持续集成:确保代码质量
- 自动化测试:包括单元测试、集成测试、端到端测试等
- 环境管理:管理开发、测试、预生产和生产环境
- 部署自动化:自动化部署流程,减少人为错误
- 发布管理:管理版本发布,确保发布过程可控
2.3 持续部署(CD)
持续部署是持续交付的延伸,它自动将代码部署到生产环境,无需人工干预。持续部署要求高度自动化和可靠的测试流程,以确保部署的安全性和稳定性。
3. Jenkins安装与配置
3.1 安装Jenkins
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
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),按照以下步骤配置:
- 获取初始管理员密码:
- 在Web界面中输入初始管理员密码
- 选择”安装推荐的插件”
- 创建管理员用户
- 配置Jenkins URL
- 完成配置
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
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流水线。
– 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
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
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流水线。
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流水线包括以下阶段:
- 代码检出:从版本控制系统检出代码
- 依赖管理:安装和管理依赖项
- 构建:编译代码,生成可执行文件
- 测试:运行单元测试、集成测试、端到端测试等
- 代码质量分析:检查代码风格、复杂度、安全性等
- 安全扫描:扫描代码和依赖中的安全漏洞
- 打包:打包应用程序,生成部署包
- 部署到测试环境:部署到测试环境进行验证
- 部署到预生产环境:部署到预生产环境进行最终验证
- 部署到生产环境:部署到生产环境
- 监控与告警:监控应用程序运行状态,设置告警
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流水线。流水线包括以下步骤:
- 代码检出:从Git仓库检出代码
- 依赖管理:使用Maven管理Java依赖
- 构建:编译代码,生成Docker镜像
- 测试:运行单元测试和集成测试
- 代码质量分析:使用SonarQube进行代码质量分析
- 安全扫描:使用Trivy扫描容器镜像的安全漏洞
- 部署到测试环境:部署到Kubernetes测试集群
- 端到端测试:运行端到端测试
- 部署到预生产环境:部署到Kubernetes预生产集群
- 手动审批:等待运维人员审批
- 部署到生产环境:部署到Kubernetes生产集群
- 监控与告警:使用Prometheus和Grafana监控应用程序运行状态
10.2 案例二:前端项目的CI/CD流水线
某公司的前端项目使用GitHub Actions构建CI/CD流水线。流水线包括以下步骤:
- 代码检出:从GitHub仓库检出代码
- 依赖管理:使用npm安装依赖
- 代码质量检查:使用ESLint检查代码风格
- 测试:运行单元测试和端到端测试
- 构建:构建前端项目,生成静态文件
- 部署到测试环境:部署到测试服务器
- 部署到生产环境:部署到CDN
- 监控与告警:使用New Relic监控应用程序运行状态
11. 常见问题与解决方案
11.1 流水线构建失败
问题:流水线构建失败,无法完成构建过程
解决方案:查看构建日志,分析失败原因
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 部署失败
问题:部署失败,无法将应用程序部署到目标环境
解决方案:检查目标环境的状态,验证部署配置,确保网络连接正常
kubectl get nodes
kubectl get pods
11.5 安全扫描失败
问题:安全扫描失败,发现安全漏洞
解决方案:修复安全漏洞,更新依赖项,或添加漏洞例外
trivy image myapp:latest
更多学习教程www.fgedu.net.cn
学习交流加群风哥QQ113257174
更多学习教程公众号风哥教程itpux_com
author:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
