#!/bin/bash set -e MAIN_IMAGE_NAME=${PROJECT} # 定义 prepareDockerComposeFile:准备 docker-compose.yml 定义文件。 prepareDockerComposeFile() { echo "[INFO] 准备 docker-compose.yml 文件 (prepareDockerComposeFile)..." sh -c "sed -i 's|image:\s*${MAIN_IMAGE_NAME}:|image: ${IMAGE_NAME}|g' docker-compose.yml" echo "✅ docker-compose.yml 文件准备完成" } # 定义 waitDockerComposeUp:启动后操作 waitDockerComposeUp() { echo "[INFO] 检查并等待 docker compose 启动完成 (waitDockerComposeUp)..." echo "[INFO] 等待 60s 启动 (waitDockerComposeUp)..." sleep 60 for i in {1..3}; do echo "[INFO] 等待 30s 启动 (waitDockerComposeUp)..." sleep 30 ALL_STARTED=1 # 检查服务1 是否已启动 DOCKER_SVC=$((docker compose -f docker-compose.yml ps ${PROJECT} --format '{{.Status}}' | grep -E '(up|Up)\s+[0-9]+' | tail -n 1) || echo '') if [ "${DOCKER_SVC}" = '' ]; then echo ${PROJECT}' 未启动!' ALL_STARTED=0 else echo ${PROJECT}' 已启动!' fi if [ ${ALL_STARTED} -eq 1 ]; then echo '所有服务已启动!' exit 0 fi done; echo "✅ docker compose 启动完成" } # 定义 triggerK8SUpdateImageVersion:触发 K8S 更新镜像版本 triggerK8SUpdateImageVersion() { echo "[INFO] 触发 k8s kind 更新镜像版本 (triggerK8SUpdateImageVersion)..." echo "[INFO] 调用 K8S API 触发更新镜像版本 "${LOCAL_REGISTRY_FULL_NAME} # 设置快捷命令 alias ls_di='docker image ls --format="{{.ID}} {{.Repository}}:{{.Tag}}" | grep ${LOCAL_REGISTRY_GROUP} | sort -V -r | head -n 3' CURRENT_IMAGE=$(ls_di | head -n 2 | head -n 1) echo "当前版本"$CURRENT_IMAGE CURRENT_IMAGE_ID=$(echo $CURRENT_IMAGE | awk -F' ' '{print $1}') LAST_IMAGE=$(ls_di | head -n 2 | tail -n 1) echo "前一个版本"$LAST_IMAGE LAST_IMAGE_ID=$(echo $LAST_IMAGE | awk -F' ' '{print $1}') #if [ "$condition1" = true ] && ([ "$condition2" = true ] || [ "$condition2" = false ]); then # echo "条件满足" #else # echo "条件不满足" #fi if [ ${FORCE_DEPLOY: false} = false ] && [ "${CURRENT_IMAGE}" != "${LAST_IMAGE}" ] && [ "${CURRENT_IMAGE_ID}" = "${LAST_IMAGE_ID}" ]; then echo "[INFO] 没有发现递送内容存在变化,跳过发版!${LAST_IMAGE_ID} -> ${CURRENT_IMAGE_ID}" echo $(ls_di) echo " " exit 0 fi # 更新镜像版本的脚本 K8S_ACCESS_KEY='7bpmjzpcbw8c.y72hy3m26d7y6aw6j45nx5m66tcnws33' K8S_API_BODY='{"kind":"deployments","namespace":"kube-public","name":"'${K8S_deployment_NAME}'","images":{"'${LOCAL_REGISTRY_NAME}'":"'${LOCAL_REGISTRY_FULL_NAME}'"}}' curl -v --fail -X PUT \ -H "content-type: application/json" \ -H "Cookie: KuboardUsername=admin; KuboardAccessKey=${K8S_ACCESS_KEY}" \ -d ${K8S_API_BODY} \ "http://k8s-ui.hz3r.cn/kuboard-api/cluster/hz3r-k8s-kind/kind/CICDApi/admin/resource/updateImageTag" \ || (echo '调用 Kuboard CI/CD API 失败!request body = '${K8S_API_BODY} && exit 9) # curl -X PUT \ # -H "content-type: application/json" \ # -H "Cookie: KuboardUsername=admin; KuboardAccessKey=7bpmjzpcbw8c.y72hy3m26d7y6aw6j45nx5m66tcnws33" \ # -d '{"kind":"deployments","namespace":"kube-public","name":"business-webapi","images":{"localhost:5001/business-webapi":"localhost:5001/business-webapi:yourNewVersion","localhost:5001/zjjhyiwuyq-webapi":"localhost:5001/zjjhyiwuyq-webapi:yourNewVersion"}}' \ # "http://k8s-ui.hz3r.cn/kuboard-api/cluster/hz3r-k8s-kind/kind/CICDApi/admin/resource/updateImageTag" echo "[INFO] 触发更新镜像版本成功!\n" } # 主逻辑:根据传入参数决定调用哪个函数 if [ "$#" -ne 1 ]; then echo "用法: $0 {prebuild|postup|k8s}" echo " prebuild 构建前准备" echo " postup docker compose up -d 后处理" echo " k8s 触发 k8s(kind|k3d) 更新镜像版本" exit 1 fi case "$1" in prebuild) prepareDockerComposeFile ;; postup) waitDockerComposeUp ;; k8s) triggerK8SUpdateImageVersion ;; *) echo "错误: 无效参数 '$1'。请使用 'prebuild' 或 'postup'" echo "用法: $0 {prebuild|postup|k8s}" echo " prebuild 构建前准备" echo " postup docker compose up -d 后处理" echo " k8s 触发 k8s(kind|k3d) 更新镜像版本" exit 1 ;; esac