从零到一:基于Bamboo与Docker的Java项目CI/CD流水线实战
1. 环境准备:从零搭建Bamboo与Docker基础环境
第一次接触CI/CD流水线时,我对着Bamboo和Docker的文档折腾了整整三天。现在回想起来,如果能提前知道这些关键步骤,至少能节省50%的时间。下面我会用最直白的语言,带你快速搞定基础环境搭建。
1.1 JDK安装的隐藏坑点
很多教程会直接让你安装JDK,但不会告诉你版本兼容性问题。比如Bamboo 8.x官方推荐使用JDK8或JDK11,但实际测试发现:
- JDK8对Gradle 7.x+的支持有限
- JDK11的LTS版本更稳定
我推荐用OpenJDK11,执行以下命令一键安装:
sudo apt-get update
sudo apt-get install -y openjdk-11-jdk
验证安装时别只用java -version,还要检查JAVA_HOME:
echo $JAVA_HOME
如果没输出,需要手动配置环境变量。我习惯在/etc/profile.d/下新建java.sh:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
1.2 Bamboo安装的实战技巧
官方文档的安装步骤其实缺了几个关键点。下载Bamboo时,建议用国内镜像加速:
wget https://mirrors.tuna.tsinghua.edu.cn/atlassian/bamboo/8.2.3/atlassian-bamboo-8.2.3.tar.gz
解压后重点修改这两个配置:
bamboo-init.properties中设置bamboo.home=/opt/bamboo-homesetenv.sh中调整JVM内存(默认值太小):
JVM_MINIMUM_MEMORY="1024m"
JVM_MAXIMUM_MEMORY="2048m"
启动前先创建专用用户(直接用root运行会有权限问题):
useradd -m bamboo
chown -R bamboo:bamboo /opt/bamboo/
su - bamboo -c "/opt/bamboo/bin/start-bamboo.sh"
1.3 Docker的优化配置
安装Docker后一定要做这三件事:
- 配置国内镜像加速(在
/etc/docker/daemon.json):
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"https://mirror.baidubce.com"
]
}
- 调整存储驱动(避免磁盘爆满):
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
- 给bamboo用户docker权限:
sudo usermod -aG docker bamboo
重启服务后别忘验证:
docker run hello-world
2. 定制Docker镜像:打造专属构建环境
2.1 镜像构建的黄金法则
我踩过最大的坑就是镜像臃肿问题。刚开始我的镜像有1.2GB,优化后只剩380MB。关键技巧:
- 使用Alpine基础镜像(比Ubuntu小10倍):
FROM alpine:3.14
- 合并RUN指令减少镜像层:
RUN apk add --no-cache openjdk11 gradle && \
rm -rf /var/cache/apk/*
- 多阶段构建(适用于需要编译的场景):
FROM gradle:7-jdk11 AS builder
COPY --chown=gradle:gradle . /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle build --no-daemon
FROM openjdk:11-jre-slim
COPY --from=builder /home/gradle/src/build/libs/*.jar /app.jar
2.2 环境变量配置的玄机
很多人在Dockerfile里硬编码路径,这是灾难的开始。正确的做法:
ENV GRADLE_USER_HOME=/cache/.gradle \
GRADLE_OPTS="-Dorg.gradle.daemon=false -Dorg.gradle.caching=true"
VOLUME /cache
这样配置可以实现:
- 构建缓存持久化
- 关闭Gradle守护进程(容器环境下不需要)
- 启用构建缓存加速
2.3 镜像仓库的私房技巧
推送到私有仓库时,一定要给镜像打双重标签:
docker build -t my-registry.com/my-image:1.0 -t my-registry.com/my-image:latest .
docker push my-registry.com/my-image:1.0
docker push my-registry.com/my-image:latest
我推荐用Harbor搭建私有仓库,比Nexus更友好:
- 安装简单:
docker-compose up -d - 自带UI管理界面
- 支持漏洞扫描
3. Bamboo项目配置:从入门到精通
3.1 Plan设计的艺术
创建Plan时,90%的人会忽略这些配置:
-
并发构建控制(防止资源耗尽):
- 在Plan配置的"Miscellaneous"选项卡
- 设置"Maximum number of builds to keep"为5
- 启用"Enable parallel builds"但要限制数量
-
环境变量优先级(重要!):
- Plan变量 > 全局变量
- 同名变量后者覆盖前者
- 敏感变量要加密存储
-
构建日志保留策略:
bamboo.log.expiry.settings.enabled=true bamboo.log.expiry.settings.daysToKeep=30
3.2 Job配置的魔鬼细节
在Docker容器中运行构建时,必须挂载这些目录:
volumes:
- ${bamboo.build.working.directory}:/data
- ${bamboo.capability.system.builder.gradle.cache}:/cache/.gradle
environment:
- GRADLE_USER_HOME=/cache/.gradle
Task配置的黄金组合:
- Source Checkout(必选)
- Inject Variables(加载环境变量)
- Script(核心构建命令):
chmod +x gradlew ./gradlew clean build -x test - Artifact Download(获取构建产物)
3.3 触发器的隐藏玩法
除了常规的代码变更触发,还可以:
-
定时构建(比如每天凌晨2点):
0 2 * * * -
远程触发(通过REST API):
curl -X POST -u username:password http://bamboo-server/rest/api/latest/queue/PROJECT-PLAN -
依赖触发(上游Plan成功后再执行)
4. 高级技巧:生产级流水线优化
4.1 构建加速三板斧
-
Gradle守护进程模式(非Docker环境):
org.gradle.daemon=true org.gradle.parallel=true -
依赖缓存共享:
docker volume create gradle-cache -
增量构建:
./gradlew build --continuous
4.2 安全加固要点
-
镜像签名验证:
docker trust sign my-image:1.0 -
凭据管理:
- 使用Bamboo的"Shared Credentials"
- 或者HashiCorp Vault集成
-
网络隔离:
docker network create --driver bridge isolated
4.3 监控与告警配置
必备的监控指标:
- 构建成功率
- 构建时长趋势
- 队列等待时间
告警规则示例(PromQL):
avg_over_time(bamboo_build_duration_seconds[1h]) > 1800
日志收集方案:
fluentd --match bamboo.** --type tail --path /opt/bamboo-home/logs/*
更多推荐
所有评论(0)