完整的手动模拟CICD流程:构建Microsoft ApplicationInsights-Java的Docker镜像
1. 环境准备
创建项目目录
mkdir -p ~/appinsights-build
cd ~/appinsights-build
准备必要的工具
# 确保Docker已安装
sudo apt-get update
sudo apt-get install -y docker.io git curl
# 添加用户到docker组(需要重新登录)
sudo usermod -aG docker $USER
2. 手动拉取代码
# 克隆仓库
git clone https://github.com/microsoft/ApplicationInsights-Java.git
cd ApplicationInsights-Java
# 切换到特定版本(根据日志中的commit)
git checkout f0d5f508f89df9a05aeaed88749394a57adb973b
3. 创建Dockerfile
创建 Dockerfile:
FROM mcr.microsoft.com/devcontainers/java:8-bullseye
# 设置工作目录
WORKDIR /workspace
# 复制项目文件
COPY . /workspace/
# 安装构建工具和依赖
RUN apt-get update && apt-get install -y \
fontconfig \
libfreetype6 \
libfreetype6-dev \
docker.io \
&& rm -rf /var/lib/apt/lists/*
# 设置Gradle缓存权限
RUN mkdir -p /root/.gradle && chmod 755 /root/.gradle
# 验证环境
RUN java -version && \
javac -version
# 设置构建命令
CMD ["./gradlew", "build", "-x", "test", "--no-daemon"]
4. 创建Gradle初始化脚本(解决依赖问题)
创建 .gradle-init-script.gradle:
// 兼容Gradle 4.1的初始化脚本
allprojects {
buildscript {
repositories {
mavenCentral()
jcenter()
}
}
repositories {
mavenCentral()
jcenter()
maven {
url "https://plugins.gradle.org/m2/"
}
}
}
// 解决插件仓库配置(Gradle 4.1兼容版本)
gradle.settingsEvaluated { settings ->
settings.pluginManagement {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
maven {
url "https://repo1.maven.org/maven2"
}
jcenter()
}
}
}
5. 创建构建脚本
创建 build.sh:
#!/bin/bash
set -e
echo "=== ApplicationInsights-Java CICD模拟构建 ==="
# 环境变量
IMAGE_NAME="appinsights-java"
VERSION="1.0.0"
CONTAINER_NAME="appinsights-builder"
echo "1. 清理旧容器和镜像..."
docker stop $CONTAINER_NAME || true
docker rm $CONTAINER_NAME || true
docker rmi $IMAGE_NAME:$VERSION || true
echo "2. 构建Docker镜像..."
docker build -t $IMAGE_NAME:$VERSION .
echo "3. 运行构建容器..."
docker run --name $CONTAINER_NAME \
--memory=4g \
--cpus=2 \
$IMAGE_NAME:$VERSION
echo "4. 提取构建产物..."
docker cp $CONTAINER_NAME:/workspace/build ./build-output/
echo "5. 检查构建结果..."
if [ -d "./build-output/libs" ]; then
echo "✅ 构建成功!生成的JAR文件:"
ls -la ./build-output/libs/
else
echo "❌ 构建失败"
exit 1
fi
echo "6. 清理临时容器..."
docker rm $CONTAINER_NAME
echo "=== 构建完成 ==="
6. 分步执行CICD流程
步骤1: 基础镜像构建
# 给构建脚本执行权限
chmod +x build.sh
# 执行构建
./build.sh
步骤2: 多阶段构建(优化版本)
创建 Dockerfile.multistage:
# 构建阶段
FROM mcr.microsoft.com/devcontainers/java:8-bullseye AS builder
WORKDIR /workspace
COPY . .
# 安装构建依赖
RUN apt-get update && apt-get install -y fontconfig libfreetype6 libfreetype6-dev
# 使用初始化脚本构建
RUN ./gradlew build -x test --no-daemon --init-script .gradle-init-script.gradle
# 运行时阶段
FROM openjdk:8-jre-slim
WORKDIR /app
COPY --from=builder /workspace/build/libs/*.jar app.jar
# 创建非root用户
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
步骤3: 运行测试(可选)
创建 test.sh:
#!/bin/bash
echo "=== 运行测试 ==="
# 运行单元测试
docker run --rm \
-v $(pwd):/workspace \
mcr.microsoft.com/devcontainers/java:8-bullseye \
bash -c "cd /workspace && ./gradlew test --no-daemon"
# 检查测试结果
if [ $? -eq 0 ]; then
echo "✅ 所有测试通过"
else
echo "❌ 测试失败"
exit 1
fi
7. 完整的CICD流水线脚本
创建 cicd-pipeline.sh:
#!/bin/bash
set -e
echo "🚀 开始CICD流水线执行"
# 阶段1: 代码质量检查
echo "=== 阶段1: 代码检查 ==="
docker run --rm -v $(pwd):/workspace \
mcr.microsoft.com/devcontainers/java:8-bullseye \
bash -c "cd /workspace && ./gradlew check --no-daemon"
# 阶段2: 构建
echo "=== 阶段2: 构建 ==="
./build.sh
# 阶段3: 测试
echo "=== 阶段3: 测试 ==="
./test.sh
# 阶段4: 安全扫描(可选)
echo "=== 阶段4: 安全扫描 ==="
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/src \
aquasec/trivy:latest image appinsights-java:1.0.0
# 阶段5: 推送镜像(模拟)
echo "=== 阶段5: 镜像归档 ==="
docker save appinsights-java:1.0.0 -o appinsights-java-1.0.0.tar
echo "✅ CICD流水线执行完成"
8. 手动验证构建结果
# 检查构建产物
find ./build-output -name "*.jar" -type f
# 验证JAR文件
jar tf ./build-output/libs/applicationinsights-core-*.jar | head -10
# 清理环境
docker system prune -f
使用说明
执行完整流水线:
chmod +x *.sh
./cicd-pipeline.sh
仅构建:
./build.sh
仅测试:
./test.sh
CICD关键环节完成状态
| 环节 | 状态 | 说明 |
|---|---|---|
| 环境准备 | ✅ | Docker环境配置完成 |
| 依赖管理 | ✅ | Gradle依赖配置完成 |
| 构建执行 | ✅ | 自动化构建流程 |
| 测试验证 | ✅ | 单元测试执行 |
| 产物生成 | ✅ | JAR文件生成 |
| 安全扫描 | ✅ | 镜像安全扫描 |
| 镜像归档 | ✅ | 镜像打包保存 |
您可以根据实际需求调整各阶段的参数和配置。
611

被折叠的 条评论
为什么被折叠?



