接着 上一篇文章调用的脚本
流水线通用脚本-shell形式,直接改几个参数,可以拿到Jenkins,github和 gitee和 gitlab等直接调用(主要是Jenkins,改的参数比较少)-CSDN博客

上一篇进榜了嘻嘻
root@jenkins dev-build\]# cat Dockerfile ###Dockerfile(多阶段构建) ##注意合并指令减少层数 #运行时环境(轻量级使用最小镜像) ##docker.io/library/alpine:latest ##Alpine是一个轻量级的Linux发行版只需要约5MB ##使用国内镜像站下载 #docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/alpine:latest #crictl images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/alpine:latest ###jdk17镜像 #### 设置环境变量(单层) ##471.47MB #docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17.0.2-jdk #crictl images swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17.0.2-jdk ##17-jdk-alpine 325.60MB #docker pull #crictl images #swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17-jdk-alpine #docker pull ##crictl images #openjdk:17-jre-slim比 JDK 镜像体积小 60% 以上 #我那个openjdk:17-jre-slim有漏洞这个废弃 #FROM openjdk:17-jdk-slim ##alpine镜像比默认 openjdk体积小 70%+,且减少隐式系统层 #使用镜像站镜像 FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17-jdk-alpine #使用harbor镜像仓库镜像 #xxxx #docker.io/library/buildpack-deps #这是一个包含构建依赖项的Docker镜像。 #它提供各种构建工具和运行库,用于构建不同的应用程序, #特别是那些使用构建包工具(例如Paketo Buildpacks)的应用程序。 # 这个镜像本身并不包含应用程序代码, # 而是为构建过程提供必要的依赖环境, # 从而简化构建过程和镜像大小 # swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/buildpack-deps:jammy #buildpack-deps 上面这个是ubuntu: ##docker pull ##crictl images # 设置环境变量(单层) ENV JAVA_OPTS="-Xms512m -Xmx1024m" \\ SPRING_PROFILES_ACTIVE="prod" \\ SERVER_PORT=8080 ### # 复制 Spring Boot 的可执行ja)(已经包含了所有子模块代码和依赖) # 复制构建产物(分离依赖与代码以利用缓存)注入环境变量 ARG ENV_FILE=./env/dev.env #复制之前打包生成的jar包到指定位置 # 复制环境文件到容器中(使用构建参数 \&\ 复制启动脚本 COPY payment-api/target/payment-api-0.0.1-SNAPSHOT.jar app.jar \&\© ${ENV_FILE} .env \&\© build/start.sh start.sh # 创建用户并设置权限(单层完成所有权限操作) RUN addgroup -S javauser \&\& adduser -S javauser -G javauser \\ \&\& chown -R javauser:javauser /app \\ \&\& chmod +x start.sh # 切换用户 USER javauser # 健康检查(单层) HEALTHCHECK --interval=30s --timeout=3s --start-period=60s --retries=3 \\ CMD curl -f http://localhost:${SERVER_PORT}/actuator/health \|\| exit 1 # 入口点 ENTRYPOINT \["./start.sh"
EXPOSE 8080
root@jenkins dev-build\]# cat build.sh #!/bin/bash # 定义源目录和目标目录 SOURCE_DIR="/home/$repo/java/payment" TARGET_DIR="$(pwd)/app" IMAGE_NAME="$镜像仓库域名/命名空间/wallet-test" DEFAULT_VERSION="$s01" # 是jenkins传递的版本号$s01 是v构建次数-时间日期方便从 举例v177-20250827-1800 # 设置基础变量 export LANG=zh_CN.UTF-8 export PATH=/opt/maven-3.9.11/bin:/usr/lib/jvm/jdk-17.0.16-oracle-x64/bin:$PATH # 检查参数 if \[ -z "$1" \]; then echo "使用方法: ./build.sh \[环境\] \[版本\]" echo "支持的环境: dev, uat, prd" echo "" echo "示例:" echo " ./build.sh uat" echo " ./build.sh prd v1.0.0" echo " ./build.sh dev" exit 1 fi ENV_NAME=$1 VERSION=$DEFAULT_VERSION # 验证环境参数 case $ENV_NAME in "dev") ENV_FILE=./env/dev.env IMAGE_TAG=$IMAGE_NAME:$VERSION ;; "uat") ENV_FILE=./tmp/huoma-dzg/server/service/pay-of-java/env/ IMAGE_TAG=$IMAGE_NAME:$VERSION ;; "prd") ENV_FILE=./tmp/huoma-dzg/server/service/pay-of-java/env IMAGE_TAG=$IMAGE_NAME:$VERSION ;; \*) echo "\[ERROR\] 不支持的环境: $ENV_NAME" echo "支持的环境: dev, uat, prd" exit 1 ;; esac #调试输出 echo "\[INFO\] 构建环境: $ENV_NAME" #echo "\[INFO\] 环境文件: $ENV_FILE" #echo "\[INFO\] 镜像+标签: $IMAGE_TAG" 1.Maven检查并构建 # 检查 Maven 是否安装 if ! command -v mvn \&\> /dev/null; then echo "\[ERROR\] Maven 未安装或不在 PATH 中" exit 1 fi ###这个需要自己进行选择切换的目录根据java环境不同进行切换对应项目下 cd ../ mvn clean install -DskipTests if \[ $? -ne 0 \]; then echo "\[ERROR\] Maven 构建失败!" exit 1 fi #/build目录下面存放的是 这个.sh脚本和Dockerfile文件 cd ./build ### 验证 JAR 包#根据情况修改 ###主要是查询对应项目下面有没有生成jar包 ###需要手动添加对应关键词 if \[ ! -f "../payment-api/target/"\*.jar \]; then echo "\[ERROR\] 未找到生成的 JAR 包" exit 1 fi # 2. Docker 检查 # 检查 Docker 是否安装 if ! command -v docker \&\> /dev/null; then echo "\[ERROR\] Docker 未安装或不在 PATH 中" exit 1 fi # 检查 Docker 服务是否运行 if ! docker info \&\> /dev/null; then echo "\[ERROR\] Docker 服务未运行" exit 1 fi # 3. 检测并删除已存在的同名镜像 echo "检测镜像是否存在: $IMAGE_TAG" **if** docker images --format "{{.Repository}}:{{.Tag}}" \| grep -q "\^**${** IMAGE_NAME**}** :**${** VERSION**}** $"; **then** echo "发现已存在镜像 **${** IMAGE_NAME**}** :**${** VERSION**}**,执行删除..." # 停止关联容器 running_containers=$(docker ps -a -q --filter "ancestor=**${** IMAGE_NAME**}** :**${** VERSION**}**") **if** \[ -n "$running_containers" \]; **then** echo "停止关联容器:" docker stop $running_containers docker rm $running_containers **fi** # 删除镜像 docker rmi -f "**${** IMAGE_NAME**}** :**${** VERSION**}**" **if** \[ $? -eq 0 \]; **then** echo "旧镜像删除成功!" **else** echo "警告:旧镜像删除失败,可能被其他容器引用" \>\&2 **fi** **else** echo "未发现同名镜像,继续构建..." **fi** # 4. 构建Docker镜像 # 执行 Docker 构建 echo "\[INFO\] 执行命令: docker build -f Dockerfile --build-arg ENV_FILE=$ENV_FILE -t $IMAGE_TAG ." docker build -f Dockerfile --build-arg ENV_FILE="$ENV_FILE" -t "$IMAGE_TAG" ../ if \[ $? -ne 0 \]; then echo "\[ERROR\] Docker 构建失败!" exit 1 fi # 5. 验证构建结果 **# 验证镜像** **echo "\[INFO\] 验证 Docker 镜像..."** **if ! docker images \| grep -q "wallet"; then** **echo "\[ERROR\] Docker 镜像不存在: $IMAGE_TAG"** **exit 1** **fi** # 6. 删除临时文件 #rm -rf "$TARGET_DIR" # 7. 上传镜像到habor镜像仓库 ###docker push "**${** IMAGE_NAME**}** :**${** VERSION**}**"