Java 在 Linux 上的 CI/CD 落地方案
一 工具选型与总体流程
- 常用工具与适配场景
- Jenkins:开源自托管、插件生态丰富,适合复杂流程与私有化环境。
- GitLab CI/CD:与仓库深度集成,.gitlab-ci.yml 即流水线,适合一体化平台。
- GitHub Actions:GitHub 原生,开箱即用,适合托管在 GitHub 的项目。
- Gitee CI/CD:国内网络与合规友好,.gitee-ci.yml 配置,适合本土团队。
- 容器与编排:Docker 用于构建一致运行环境,Kubernetes 用于生产级部署与扩缩容。
- 典型流水线
- 代码提交触发(Push/PR) → 2) 拉取代码 → 3) 构建与单元测试(如 Maven/Gradle)→ 4) 代码质量与测试报告 → 5) 打包(如 JAR/WAR)→ 6) 制品归档 → 7) 部署到测试环境 → 8) 自动化验收/冒烟 → 9) 人工审批(生产)→ 10) 部署到生产并回滚预案。
二 方案一 Jenkins 自建流水线
- 环境准备(Ubuntu/Debian 示例)
- 安装 JDK 11、Maven、Jenkins:
- sudo apt update && sudo apt install -y openjdk-11-jdk maven
- wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
- sudo sh -c ‘echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list’
- sudo apt update && sudo apt install -y jenkins
- sudo systemctl start jenkins && sudo systemctl enable jenkins
- 访问 http://<服务器IP>:8080,初始密码在 /var/lib/jenkins/secrets/initialAdminPassword。
- 创建流水线
- 新建 Item → 选择 Pipeline → 在 Pipeline 配置中选择 “Pipeline script from SCM”,指定仓库与 Jenkinsfile 路径。
- 配置 Webhook(GitHub/GitLab → Webhooks → Payload URL 例如 http:///github-webhook/,事件选 push)。
- 示例 Jenkinsfile(Maven 项目)
- pipeline {
agent any
tools { maven ‘Maven 3.8’ } // 需在 Jenkins 全局工具配置中定义
stages {
stage(‘Checkout’) {
steps { git url: ‘git@github.com:org/app.git’, branch: ‘main’ }
}
stage(‘Build & Test’) {
steps {
sh ‘mvn -B clean verify’
}
post {
always {
junit ‘**/target/surefire-reports/.xml’
}
}
}
stage(‘Package’) {
steps { sh ‘mvn -DskipTests package’ }
}
stage(‘Archive’) {
steps { archiveArtifacts artifacts: 'target/.jar’, fingerprint: true }
}
stage(‘Deploy to Staging’) {
steps {
sh ‘rsync -avz target/app.jar user@staging:/opt/app/’
sh ‘ssh user@staging “systemctl restart app || true”’
}
}
stage(‘Deploy to Prod’) {
when { branch ‘main’ }
steps {
input ‘Deploy to production?’
sh ‘rsync -avz target/app.jar user@prod:/opt/app/’
sh ‘ssh user@prod “systemctl restart app”’
}
}
}
}
- 远程部署与安全
- 建议使用 SSH 密钥或 Jenkins 凭据管理密码,避免明文;生产阶段增加 审批与回滚步骤。
三 方案二 GitLab CI 或 GitHub Actions
- GitLab CI 示例(.gitlab-ci.yml)
- image: maven:3.8-openjdk-11
stages:
- build
- test
- package
- deploy-staging
- deploy-prod
variables:
MAVEN_OPTS: “-Dmaven.repo.local=.m2/repository”
cache:
paths:
- .m2/repository/
build:
stage: build
script: mvn -B compile
test:
stage: test
script: mvn -B test
artifacts:
reports:
junit: target/surefire-reports/*.xml
package:
stage: package
script: mvn -DskipTests package
deploy-staging:
stage: deploy-staging
script:
- rsync -avz target/app.jar user@staging:/opt/app/
- ssh user@staging “systemctl restart app || true”
only:
- main
deploy-prod:
stage: deploy-prod
script:
- rsync -avz target/app.jar user@prod:/opt/app/
- ssh user@prod “systemctl restart app”
when: manual
only:
- main
- GitHub Actions 示例(.github/workflows/ci.yml)
- name: Java CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 11
uses: actions/setup-java@v4
with:
java-version: ‘11’
distribution: ‘temurin’
cache: maven
- name: Build and test
run: mvn -B verify
- name: Package
run: mvn -DskipTests package
- name: Deploy to Staging
if: github.ref == ‘refs/heads/main’
run: |
rsync -avz target/app.jar user@staging:/opt/app/
ssh user@staging “system.jar || true”
# 生产可另建 job,使用 environment + required reviewers 实现审批
- 其他托管选项
- Gitee CI/CD:在项目根目录添加 .gitee-ci.yml,通过可视化日志与通知快速落地,适合国内团队与合规需求。
四 容器化与 Kubernetes 部署
- Docker 化示例
- Dockerfile:
- FROM eclipse-temurin:11-jre
WORKDIR /app
COPY target/app.jar app.jar
CMD [“java”,“-jar”,“app.jar”]
- 构建与运行:
- docker build -t my-java-app:latest .
- docker run -d --name app -p 8080:8080 my-java-app:latest
- Kubernetes 示例
- 部署清单(deploy.yaml,示例):
- apiVersion: apps/v1
kind: Deployment
metadata:
name: app
labels: { app: app }
spec:
replicas: 2
selector: { matchLabels: { app: app } }
template:
metadata:
labels: { app: app }
spec:
containers:
- name: app
image: my-registry/my-java-app:latest
ports: [{ containerPort: 8080 }]
resources:
requests: { cpu: “250m”, memory: “512Mi” }
limits: { cpu: “500m”, memory: “1Gi” }
- 发布策略:使用 RollingUpdate(默认)、Recreate 或 Blue/Green;通过 readiness/liveness 探针保障可用性;镜像使用 不可变标签(如 git sha 或 semver),配合 Kustomize/Helm 管理多环境差异。
五 质量保障 安全与最佳实践
- 质量与安全
- 在流水线中加入 单元测试/集成测试、代码覆盖率、静态检查(如 SpotBugs/Checkstyle/PMD)、依赖漏洞扫描(如 OWASP Dependency-Check),并发布 构建状态徽标 与 报告;生产前执行 冒烟测试 与 回滚预案。
- 运行与维护
- 使用 JDK 11+ 并及时更新;为 Jenkins/GitLab Runner 配置 Docker 执行器 与缓存(如 Maven .m2),提升构建速度;通过 SSH 密钥/凭据 管理敏感信息,避免明文;按环境拆分 Staging/Prod,生产部署采用 手动审批 与 金丝雀/蓝绿 降低风险。