CI 集成
→ 返回构建工具
在 CI 环境中运行构建工具,实现自动化编译、测试、打包和发布。
GitHub Actions
Maven 项目
# .github/workflows/build.yml
name: Build
on: [push, pull_request]
jobs:
build:
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 # 缓存 ~/.m2
- name: Build
run: mvn -B package --no-transfer-progress
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: app-jar
path: target/*.jarGradle 项目
name: Build
on: [push, pull_request]
jobs:
build:
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: gradle # 缓存 ~/.gradle
- name: Build
run: ./gradlew build
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: app-jar
path: build/libs/*.jarJenkins
Maven Pipeline
// Jenkinsfile
pipeline {
agent any
tools {
jdk 'JDK17'
maven 'Maven3'
}
stages {
stage('Build') {
steps { sh 'mvn -B clean package -DskipTests' }
}
stage('Test') {
steps { sh 'mvn -B test' }
post {
always { junit 'target/surefire-reports/*.xml' }
}
}
stage('Deploy') {
when { branch 'main' }
steps { sh 'mvn -B deploy -P prod' }
}
}
}Gradle Pipeline
pipeline {
agent any
stages {
stage('Build') {
steps { sh './gradlew clean build' }
}
stage('Test') {
steps { sh './gradlew test' }
post {
always { junit 'build/test-results/**/*.xml' }
}
}
stage('Publish') {
when { branch 'main' }
steps { sh './gradlew publish' }
}
}
}CI 最佳实践
依赖缓存
# GitHub Actions 手动配置 Maven 缓存
- uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-maven-跳过测试
mvn package -DskipTests # 跳过测试执行(仍编译)
./gradlew build -x test # Gradle 跳过 test task私服凭据注入
凭据通过 CI 环境变量注入,不写入代码:
env:
NEXUS_USER: ${{ secrets.NEXUS_USER }}
NEXUS_PASSWORD: ${{ secrets.NEXUS_PASSWORD }}mvn deploy -s settings.xml # settings.xml 从环境变量读取凭据相关文档
- 打包与发布 — 打包与发布流程
- 私有仓库 — 私服配置
- Profile 配置 — CI 中切换环境
- Maven · Gradle