最近在团队内部推动Java项目的CI/CD流程标准化时,发现很多同事对Arbess和GitPuk的集成使用存在困惑。作为一个在DevOps领域摸爬滚打多年的老手,今天我就来分享一个实战案例:如何用Arbess快速搭建Java项目的自动化构建流水线,并通过GitPuk实现Docker镜像的自动化部署。
这个方案特别适合中小型Java团队快速搭建轻量级CI/CD环境。相比传统的Jenkins方案,Arbess+GitPuk的组合配置更简单,学习曲线平缓,而且对硬件资源要求更低。我们团队用这套方案后,部署效率提升了60%以上,发布错误率降到了接近零。
在开始之前,确保你的开发环境满足以下条件:
注意:如果你的项目使用Gradle构建,需要额外安装Gradle 7.x。本文以Maven项目为例,但核心思路同样适用于Gradle。
在评估了多种CI/CD方案后,我们最终选择了这个组合,主要基于以下考虑:
在项目根目录创建.arbess.yml文件,这是整个流水线的核心配置文件。一个典型的Java项目配置如下:
yaml复制version: '3.0'
stages:
- build
- test
- package
- deploy
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
IMAGE_NAME: "${CI_PROJECT_NAME}:${CI_COMMIT_SHORT_SHA}"
build_job:
stage: build
image: maven:3.8.4-openjdk-11
script:
- mvn clean compile
artifacts:
paths:
- target/classes/
test_job:
stage: test
image: maven:3.8.4-openjdk-11
script:
- mvn test
dependencies:
- build_job
MAVEN_OPTS指定本地仓库路径,避免每次构建都下载全部依赖${CI_PROJECT_NAME}:${CI_COMMIT_SHORT_SHA}作为镜像tag,确保每次提交都有唯一标识实操技巧:对于大型项目,可以在build阶段后添加
sonar-scanner任务进行代码质量检查,提前发现问题。
在项目根目录创建Dockerfile,以下是一个优化过的Java应用Dockerfile示例:
dockerfile复制FROM openjdk:11-jre-slim
WORKDIR /app
# 分层构建优化:先拷贝依赖
COPY target/dependency/*.jar /app/lib/
# 再拷贝应用jar
COPY target/*.jar /app/app.jar
# JVM参数调优
ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0"
ENTRYPOINT exec java $JAVA_OPTS -jar app.jar
在.arbess.yml中继续添加部署阶段配置:
yaml复制package_job:
stage: package
image: docker:20.10
services:
- docker:dind
script:
- docker build -t $IMAGE_NAME .
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker push $IMAGE_NAME
deploy_job:
stage: deploy
image: bitnami/kubectl:latest
script:
- kubectl set image deployment/${DEPLOY_NAME} ${CONTAINER_NAME}=${IMAGE_NAME}
only:
- master
通过以下方式可以显著提升构建速度:
yaml复制cache:
key: "${CI_JOB_NAME}"
paths:
- .m2/repository
- target/
针对dev/staging/prod不同环境,可以使用条件触发:
yaml复制deploy_to_prod:
stage: deploy
script:
- ./deploy-prod.sh
when: manual
only:
refs:
- master
variables:
- $DEPLOY_ENV == "prod"
在Dockerfile中添加健康检查:
dockerfile复制HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8080/actuator/health || exit 1
现象:Maven构建时卡在下载依赖阶段
解决方案:
yaml复制variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository -Dmaven.wagon.http.retryHandler.count=3"
现象:构建过程中容器被OOM Killer终止
解决方案:
yaml复制services:
- name: docker:dind
command: ["--storage-driver=overlay2", "--default-ulimit=nofile=65536:65536"]
现象:docker push时报错"denied: requested access to the resource is denied"
解决方案:
docker logout再重新login经过在多个项目中的实践,我总结了以下宝贵经验:
latest和v1.0.0风格的语义化版本标签only/except规则,避免不必要的构建-XX:MaxRAMPercentage而非固定值一个经过优化的完整配置示例:
yaml复制deploy_job:
stage: deploy
image: bitnami/kubectl:latest
script:
- kubectl rollout status deployment/${DEPLOY_NAME}
- kubectl set image deployment/${DEPLOY_NAME} ${CONTAINER_NAME}=${IMAGE_NAME}
- kubectl rollout status deployment/${DEPLOY_NAME}
retry:
max: 2
when:
- job_failure
timeout: 10m
only:
- master
after_script:
- echo "Deployment completed at $(date)" >> deploy.log
这套方案在我们团队已经稳定运行超过一年,支撑了日均50+次的构建部署。最大的优势在于它的简洁性和可靠性 - 新成员通常能在2小时内掌握整个流程,而且极少出现因配置错误导致的部署失败。