Java程序在Linux如何进行持续集成与持续部署
导读:Java 在 Linux 上的 CI/CD 落地方案 一 工具选型与总体流程 常用工具与适配场景 Jenkins:开源自托管、插件生态丰富,适合复杂流程与私有化环境。 GitLab CI/CD:与仓库深度集成,.gitlab-ci.ym...
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。
- 安装 JDK 11、Maven、Jenkins:
- 创建流水线
- 新建 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
- image: maven:3.8-openjdk-11
stages:
- 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
- Dockerfile:
- 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 管理多环境差异。
- 部署清单(deploy.yaml,示例):
五 质量保障 安全与最佳实践
- 质量与安全
- 在流水线中加入 单元测试/集成测试、代码覆盖率、静态检查(如 SpotBugs/Checkstyle/PMD)、依赖漏洞扫描(如 OWASP Dependency-Check),并发布 构建状态徽标 与 报告;生产前执行 冒烟测试 与 回滚预案。
- 运行与维护
- 使用 JDK 11+ 并及时更新;为 Jenkins/GitLab Runner 配置 Docker 执行器 与缓存(如 Maven .m2),提升构建速度;通过 SSH 密钥/凭据 管理敏感信息,避免明文;按环境拆分 Staging/Prod,生产部署采用 手动审批 与 金丝雀/蓝绿 降低风险。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Java程序在Linux如何进行持续集成与持续部署
本文地址: https://pptw.com/jishu/766298.html
