在当今的软件开发领域,持续集成和持续部署(CI/CD)已经成为提升团队效率的必备实践。作为一名长期从事Java后端开发的工程师,我深刻体会到手动构建、测试和部署的痛点——耗时费力且容易出错。本文将分享如何利用Arbess平台快速搭建一个完整的自动化流程,实现从GitHub代码提交到Docker容器部署的全链路自动化。
这个方案特别适合中小型Java项目团队,尤其是那些刚开始接触DevOps实践的开发者。通过本教程,你可以在1小时内完成从零到生产的完整配置,无需复杂的Jenkins集群或昂贵的商业工具。我在实际项目中多次使用这套方案,稳定性和效率都得到了团队的一致认可。
在开始之前,请确保你已经具备以下基础环境:
提示:虽然Arbess支持多种语言项目,但本文以Java+Maven项目为例。如果你使用Gradle或其他构建工具,配置逻辑类似,只需调整对应的构建命令即可。
在众多CI/CD工具中,我最终选择这个技术栈主要基于以下考虑:
在实际项目中,这个组合已经帮助我将部署时间从原来的30分钟缩短到3分钟以内,且实现了零人工干预。
首先需要在GitHub仓库中配置Arbess的访问权限:
注意:Docker Hub令牌建议使用"Read & Write"权限,但不要赋予管理员权限。我曾在项目中因为权限过大导致安全隐患,后来改用最小权限原则。
在项目根目录创建.arbess.yml文件,这是整个自动化的核心。以下是一个典型Java项目的配置模板:
yaml复制version: '1.0'
pipelines:
build_and_deploy:
triggers:
- github:
events: [push, pull_request]
branches: [main]
stages:
- build:
image: maven:3.8.6-jdk-11
commands:
- mvn clean package -DskipTests
- cp target/*.jar docker/app.jar
artifacts:
- docker/
- dockerize:
image: docker:20.10
commands:
- docker build -t ${DOCKERHUB_USERNAME}/my-java-app:${ARBESS_BUILD_NUMBER} .
- echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin
- docker push ${DOCKERHUB_USERNAME}/my-java-app:${ARBESS_BUILD_NUMBER}
- deploy:
image: alpine:3.14
commands:
- apk add --no-cache openssh-client
- ssh -o StrictHostKeyChecking=no user@server "docker pull ${DOCKERHUB_USERNAME}/my-java-app:${ARBESS_BUILD_NUMBER}"
- ssh -o StrictHostKeyChecking=no user@server "docker stop my-java-app || true"
- ssh -o StrictHostKeyChecking=no user@server "docker run --rm -d -p 8080:8080 --name my-java-app ${DOCKERHUB_USERNAME}/my-java-app:${ARBESS_BUILD_NUMBER}"
这个配置实现了三个关键阶段:
配套的Dockerfile对性能影响很大,这是我优化后的多阶段构建方案:
dockerfile复制# 构建阶段
FROM maven:3.8.6-jdk-11 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
# 运行时阶段
FROM eclipse-temurin:11-jre-jammy
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
这个配置有几个优化点:
go-offline),加速后续构建长期项目会积累大量Docker镜像,需要合理的清理策略。这是我使用的方案:
yaml复制# 在dockerize阶段添加
commands:
- docker system prune -f --filter "until=72h"
同时建议在服务器端添加定时任务:
bash复制0 3 * * * docker system prune -af --filter "until=168h"
这样可确保:
实际项目通常需要区分测试和生产环境。可以通过环境变量实现:
yaml复制deploy:
matrix:
- env: [staging, production]
commands:
- |
if [ "$ARBESS_ENV" = "production" ]; then
SERVER="prod.example.com"
PORT="80"
else
SERVER="stage.example.com"
PORT="8080"
fi
ssh user@$SERVER "docker run -d -p ${PORT}:8080 --name my-java-app-${ARBESS_ENV} ${IMAGE}"
触发时使用不同分支:
yaml复制triggers:
- github:
events: [push]
branches:
- main: { env: staging }
- release/*: { env: production }
在项目中我总结了这些安全实践:
bash复制docker trust sign ${IMAGE}
dockerfile复制USER nobody
RUN chown -R nobody:nobody /app
症状:Maven构建时报依赖下载失败
解决方案:
yaml复制commands:
- mvn dependency:go-offline || mvn dependency:go-offline
症状:Docker构建时内存不足
解决方案:
yaml复制dockerize:
resources:
memory: 4G
症状:SSH连接超时
检查清单:
bash复制nc -zv your.server.com 22
症状:旧容器停止失败
优化命令:
bash复制ssh user@server "docker stop my-java-app || docker rm my-java-app || true"
通过分析构建日志,我发现90%的构建时间花在依赖下载上。最终采用以下优化方案:
xml复制<mirror>
<id>nexus</id>
<url>http://nexus.example.com/repository/maven-public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
yaml复制volumes:
- $HOME/.m2:/root/.m2
优化后平均构建时间从8分钟降至2分钟。
完整的CI/CD还需要监控支持。我的方案是:
dockerfile复制HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:8080/actuator/health || exit 1
bash复制docker run --log-driver=loki \
--log-opt loki-url="http://loki:3100/loki/api/v1/push" \
my-java-app
对于关键业务,我还添加了部署后的自动化冒烟测试:
yaml复制post_deploy:
commands:
- curl -X POST "http://$SERVER/healthcheck" | grep '"status":"UP"'