接着 上一篇文章调用的脚本
流水线通用脚本-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**}**"