首页主机资讯Java程序在Linux如何进行持续集成与持续部署

Java程序在Linux如何进行持续集成与持续部署

时间2025-12-08 20:28:03发布访客分类主机资讯浏览537
导读: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 用于生产级部署与扩缩容。
  • 典型流水线
    1. 代码提交触发(Push/PR) → 2) 拉取代码 → 3) 构建与单元测试(如 Maven/Gradle)→ 4) 代码质量与测试报告 → 5) 打包(如 JAR/WAR)→ 6) 制品归档 → 7) 部署到测试环境 → 8) 自动化验收/冒烟 → 9) 人工审批(生产)→ 10) 部署到生产并回滚预案。

二 方案一 Jenkins 自建流水线

  • 环境准备(Ubuntu/Debian 示例)
    • 安装 JDK 11MavenJenkins
      • 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(默认)、RecreateBlue/Green;通过 readiness/liveness 探针保障可用性;镜像使用 不可变标签(如 git shasemver),配合 Kustomize/Helm 管理多环境差异。

五 质量保障 安全与最佳实践

  • 质量与安全
    • 在流水线中加入 单元测试/集成测试代码覆盖率静态检查(如 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
Linux Python如何实现自动化运维 Linux中Java如何进行故障排查

游客 回复需填写必要信息