export PATH=/opt/maven-3.9.11/bin:/usr/lib/jvm/jdk-17.0.16-oracle-x64/bin:$PATH
#jenkins工作空间默认是/var/lib/jenkins/workspace/test,test是构建名
#我自定义的空间##/home/ck1111-payment-01

##判断server是因为ck1111的仓库对应dev分支下的第一个目录就是server,它存在,说明之前拉取过不用再拉取了,它不存在需要再拉一次
##如果复制模版后这个需要改成实际对应仓库对应分支下的第一个目录用来判断是否需要拉取
dir_name="server"
dir_name02="ck1111-payment-01"
# 检查仓库目录是否存在
output=$(ls -l "$dir_name" 2>&1)
if [[ $output == *"total"* ]]; then
    echo "仓库目录 $dir_name 存在"
elif [[ $output == *"No such file or directory"* ]] || [[ $output == *"such file or directory"* ]]; then
    echo "仓库目录 $dir_name 不存在,开始克隆仓库..."
######这个路径/home/huoma-dzg-payment-01 需要复制流水线模版后更改huoma-dzg-payment-01这,这个名称是任务名称也是git仓库+具体业务名
#######这个命名比较好记

    #记得登录一个服务器ck1111
    git clone git@gitee.com:liwenhao-K8S/ck1111.git  /home/ck1111-payment-01
    #git clone git@gitee.com:shanghai_fire_code/huoma-dzg.git     
else
    echo "未知错误,检查仓库目录步骤,退出脚本执行: $output"
    exit 1
fi

##dir_name="仓库名"
##/opt/jenkin-sh-通用脚本/01-jenkin-sh-通用脚本-查看gitee文件变更.sh
##/opt/jenkin-sh-通用脚本/02-jenkin-sh-通用脚本-gitee文件变更通知到钉钉.sh
# 定义目录变量
#dir_name="huoma-dzg"

#cp /opt/jenkin-sh-通用脚本/01-jenkin-sh-通用脚本-查看gitee文件变更.sh       /tmp/01-jenkin-sh-通通用脚本-查看gitee文件变更.sh
#cp /opt/jenkin-sh-通用脚本/02-jenkin-sh-通用脚本-gitee文件变更通知到钉钉.sh  /tmp/02-jenkin-sh-通用脚本-gitee文件变更通知到钉钉.sh


# git pull 拉代码下来会发现和之前文件不同,这里可以写个shell脚本01将内容截取打印,
# 然后将内容通过钉钉脚本里面的webhook 报警推送到钉钉群
# 报警推送到钉钉群的
cd /home/ck1111-payment-01

git checkout dev
git pull
# 执行git pull并捕获输出
pull_output=$(git pull 2>&1)
echo "Git pull output:" "$pull_output"
# 检查是否包含"Already up-to-date"
if [[ $pull_output == *"Already up-to-date."* ]]; then
    AAA="代码已是最新,跳过脚本执行"
else
    AAA="代码有更新,执行变更检查脚本"    
    # 执行第1个脚本
    #if [ -f "/tmp/01-jenkin-sh-通通用脚本-查看gitee文件变更.sh" ]; then
    #    sh "/tmp/01-jenkin-sh-通通用脚本-查看gitee文件变更.sh"
    #else
    #    echo "错误:/tmp/01-jenkin-sh-通通用脚本-查看gitee文件变更.sh 该脚本不存在"
    #fi
    
     # 执行第2个脚本
   # if [ -f "/tmp/02-jenkin-sh-通用脚本-gitee文件变更通知到钉钉.sh" ]; then
   #     sh "/tmp/02-jenkin-sh-通用脚本-gitee文件变更通知到钉钉.sh"
   # else
   #     echo "错误:/tmp/02-jenkin-sh-通用脚本-gitee文件变更通知到钉钉.sh 该脚本不存在"
   # fi    
fi
#if里面的变量调用失败需要重写回环一下


# 定义存储提交记录的文件路径
COMMIT_LOG="/opt/gitee-rev-parse-HEAD/pay-of-java_commit_history.log"
#上次
COMMIT_FILE="/opt/gitee-rev-parse-HEAD/pay-of-java_parse-HEAD_commit.txt"
CHANGES_FILE="/opt/gitee-rev-parse-HEAD/pay-of-java_parse-HEAD_CHANGES.txt"

# 创建文件所在目录(如果不存在)
mkdir -p /opt/gitee-rev-parse-HEAD

# 检查并初始化 COMMIT_LOG(提交历史)
if [ ! -f "$COMMIT_LOG" ] || [ ! -s "$COMMIT_LOG" ]; then
    echo "0" > "$COMMIT_LOG"
fi


# 检查并初始化 COMMIT_FILE(当前提交哈希)
if [ ! -f "$COMMIT_FILE" ] || [ ! -s "$COMMIT_FILE" ]; then
    CURRENT_COMMIT=$(git rev-parse HEAD)
    echo "$CURRENT_COMMIT" > "$COMMIT_FILE"
fi
COMMIT_FILE01=$(cat "$COMMIT_FILE" 2>/dev/null || echo "")


# 检查并初始化 CHANGES_FILE(改动信息)
if [ ! -f "$CHANGES_FILE" ] || [ ! -s "$CHANGES_FILE" ]; then
    git diff --name-status "$COMMIT_FILE01" HEAD | grep "server/service/pay-of-java" > "$CHANGES_FILE"
fi
CHANGES_FILE01=$(cat "$CHANGES_FILE" 2>/dev/null || echo "")

#调试断点 打印当前状态
#echo "提交历史文件内容: $COMMIT_LOG01"
#echo "当前提交哈希: $COMMIT_FILE01"
#echo "改动文件信息:"
#cat "$CHANGES_FILE"

#读取当前计数-git pull之后的哈希值
LATEST_COMMIT=$(git rev-parse HEAD)
# 获取上次构建的提交哈希值,上次构建后哈希值存到了一个固定文件中
LAST_BUILT_COMMIT=$(cat "$COMMIT_FILE" 2>/dev/null || echo "")

# 如果没有上次构建的哈希值,则使用初始提交
if [ -z "$LAST_BUILT_COMMIT" ]; then 
   LAST_BUILT_COMMIT=$(git rev-list --max-parents=0 HEAD) || { echo "Error:没有找到初始提交的哈希值" >&2;
exit 1;
}
fi

###echo " 调试断点"
#echo "$LATEST_COMMIT"
#echo "$LAST_BUILT_COMMIT"

if [ "$LATEST_COMMIT" = "$LAST_BUILT_COMMIT" ]; then
    #echo "哈希值相同: $LATEST_COMMIT"
    #钉钉调用CHANGES01
    CHANGES01="哈希值相同: $LATEST_COMMIT 没有变更" 
    modified=0
    added=0
    deleted=0
    #echo "修改的文件 (M): $modified 个"
    #echo "新增的文件 (A): $added 个"
    #echo "删除的文件 (D): $deleted 个"
else
    #echo "哈希值不一致"
    #echo "最新提交: $LATEST_COMMIT"
    #echo "上次构建: $LAST_BUILT_COMMIT"
    #钉钉调用CHANGES01
    CHANGES01="哈希值不一致: 最新提交: $LATEST_COMMIT  上次构建: $LAST_BUILT_COMMIT"
    # 获取两次提交之间的差异文件(仅限 server/service/pay-of-java 目录 ,server 开头 ) 上次构建的哈希值和git pull之后的哈希值对比
    # 获取指定目录下的改动文件
    # 检查git diff命令输出是否为错误信息
   diff_output=$(git diff --name-status "$LAST_BUILT_COMMIT" "$LATEST_COMMIT" 2>&1)
   #echo "$diff_output"
# 调试输出
###diff_output=$(git diff --name-status 8a8774c8091faee3057bd213b885aa6292b862c6 2e3acebd210f9606a470935e14540c2f1d1249c2)
   # 检查diff输出是否包含错误
     if [[ "$diff_output" == *"fatal: bad object"* ]]; then
       CHANGES03="上构建的哈希值 $LAST_BUILT_COMMIT 对应的仓库代码不存在,您是否进行了迁移本地gitee库?"
       echo "$CHANGES03"
   elif [[ -z "$diff_output" ]]; then
          # 当diff_output值为空时,获取最近10条提交记录
        CHANGES02="当diff_output为空时,获取最近10条提交记录"$(git log --oneline -n 10)
       CHANGES04="git diff --name-status值是空,您是否进行了撤销已经提交远程的代码,或回滚gitee远程仓库?"
       # 调试输出
       #echo "调试输出0011$CHANGES04"
   else
    # 当diff_output不为空时
    # 获取server/service/pay-of-java目录下的变更文件##注意不要末尾写java匹配不出来,报错
    CHANGES=$(echo "$diff_output" | grep 'server/service/pay-of-ja')
    # 输出变更内容用于调试
   #echo "检测到的变更文件:$CHANGES" 
  
   
  
# 将变更文件存入临时文件
echo "$CHANGES" > /tmp/changes_list.txt


# 初始化变量
modified=0
added=0
deleted=0

# 统计变更文件状态
if grep -q "^M" /tmp/changes_list.txt; then
    modified=$(grep -c "^M" /tmp/changes_list.txt)
fi

if grep -q "^A" /tmp/changes_list.txt; then
    added=$(grep -c "^A" /tmp/changes_list.txt)
fi

if grep -q "^D" /tmp/changes_list.txt; then
    deleted=$(grep -c "^D" /tmp/changes_list.txt)
fi

# 输出统计结果
echo "修改的文件 (M): $modified 个"
echo "新增的文件 (A): $added 个"
echo "删除的文件 (D): $deleted 个"


CHANGES=$(cat /tmp/changes_list.txt 2>/dev/null || echo "")  
 

  
  
   fi
fi
    
# 统计数量

 
    ####调试断点命令如下
    # 打印统计结果
    #echo "修改的文件 (M): $modified 个"
    #echo "新增的文件 (A): $added 个"
    #echo "删除的文件 (D): $deleted 个"
    # 打印结果
    #echo "上次构建后到现在,期间gitee仓库对应分支对应目录下,修改了 (M): $modified 个文件"
    #echo "上次构建后到现在,期间gitee仓库对应分支对应目录下,添加了 (A): $added 个文件"
    #echo "上次构建后到现在,期间gitee仓库对应分支对应目录下,删除了 (D): $deleted 个文件"
    #echo "空值,表示未发生改变"
    echo "----又一次提交分割线------" >> "$COMMIT_LOG"
    # 保存最新的提交哈希值(覆盖写入)
    echo "$LATEST_COMMIT" > "$COMMIT_FILE" || { echo "Error: Failed to write commit file" >&2; exit 1; }

    # 将提交信息和变更内容追加写入日志文件
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Commit: $LATEST_COMMIT" >> "$COMMIT_LOG"
    echo "检测工作目录中的文件与上一次提交(commit)相比是否发生变化:" >> "$COMMIT_LOG"
    if [ -n "$CHANGES" ]; then
        echo "$CHANGES" >> "$COMMIT_LOG"
    else
        echo "/opt/gitee-rev-parse-HEAD/pay-of-java_parse-HEAD_CHANGES.txt 这个文件没有发生变更"  >> "$COMMIT_LOG"
    fi
  

    # 输出变更文件到屏幕
    if [ -n "$CHANGES" ]; then
        echo "Changes detected:"
        #echo "$CHANGES"
        echo "有变更"
    else
        echo "没有变更 001"
    fi
    
 

echo "$LATEST_COMMIT" > "$COMMIT_FILE" 


# 判断是否有改动
if [ -z "$CHANGES" ]; then
   #调试输出
   #echo "上次构建后,现在重新git pull代码到本地 这段时间内代码未发生改变" >&2
   CHANGIF="没有改变\n上次构建后,现在重新git pull代码到本地\n这段时间内代码未发生改变"
else
   #调试输出
   #echo "检测到以下文件改动:"
   CHANGIF="有改变\n上次构建后,现在重新git pull代码到本地\n这段时间内对应gitee远程仓库代码发生改变\n上次执行构建和这次执行构建远程,仓库文件有变动,检测到以下文件改动:"
   #echo "$CHANGES"
fi

# 使用示例
# echo "执行时间变量: \$data01"
###调试
####data01=date "+%Y年%m月%d日 %H:%M:%S"
###CCI01=5
# 打印信息
#echo "${data01}"

# 设置变量
#data01="2025年7月10日 20:18:17"
data01=$(date "+%Y年%m月%d日 %H:%M:%S")
CHANGESLOG=$(tail -n 50 /opt/gitee-rev-parse-HEAD/pay-of-java_commit_history.log | nl -ba  || echo "")
data02=$(date "+%Y%m%d-%H%M")
images1version=v${BUILD_NUMBER}-$(date "+%Y%m%d-%H%M")

# 输出变量
export data01


AAA1=$AAA
#sh /opt/jenkin-sh-通用脚本/01-jenkin-sh-通用脚本-查看giree文件变更.sh 
message01=$(cat << EOF
{
  "msgtype": "text",
  "text": {
    "content": "🚀 Jenkins 构建通知
    \n• $data01
    \n• 版本标记:$data02
    \n• 生成版本号:$images1version
    \n• 执行次数: ${BUILD_NUMBER}
    \n• 仓库状态: ${CHANGIF}
    \n\n📝 文件变更统计:
    \n- 修改(M): ${modified}个文件
    \n- 新增(A): ${added}个文件
    \n- 删除(D): ${deleted}个文件\n",
    }
}
EOF
)

#可以配置多个机器人
#企业微信和钉钉机器人共用massage,这里直接调用之前的massage 
webhook_url01="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxx174"
curl -X POST \
  -H "Content-Type: application/json" \
  -d "$message01" \
  "$webhook_url01"

# 钉钉机器人配置(关键字验证 建议多个服务器IP不好找的时候用 )
# 机器人Webhook
webhook_url02="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxx90dd6f99f87d369208ea846"
# 发送消息(消息内容必须包含设置的关键字)
curl -X POST \
  -H "Content-Type: application/json" \
  -d"$message01" \
  "$webhook_url02"

message02=$(cat << EOF
{
  "msgtype": "text",
  "text": {
    "content": "🚀 gitee变更通知\\n\\n$data01\\n\\n$AAA1
    \\n git仓库提交状态: $CHANGIF
    \\n $CHANGES01
    \\n\\n提示1: $CHANGES02
    \\n\\n提示2: $CHANGES03
    \\n\\n提示3: $CHANGES04
    \\n变更了为空说明未变更
    \\n\\n 变更详细内容 : 
    \\n\\n $CHANGESLOG ",
    "mentioned_list": ["@16****49892", "13****13800"]
  }
}
EOF
)


curl -X POST \
  -H "Content-Type: application/json" \
  -d"$message02" \
  "$webhook_url01"

curl -X POST \
  -H "Content-Type: application/json" \
  -d"$message02" \
  "$webhook_url02"


# 钉钉机器人配置(加签验证,不建议,偶尔测失败)
###机器人Webhook
###webhook_url="你的Webhook"
###机器人加签密钥
###secret="你的密钥"      
###机器人加签密钥
###timestamp=$(($(date +%s%3N)))  # 当前时间戳(毫秒)
###string_to_sign="$timestamp\n$secret"
###sign=$(echo -n "$string_to_sign" | openssl dgst -sha256 -hmac "$secret" -binary | openssl base64)
###curl -X POST \
###  -H "Content-Type: application/json" \
###  -d "$message" \
###  "$webhook_url&timestamp=$timestamp&sign=$sign"


#执行mvn 清理后打包 并跳过测试命令 并构建docker镜像
cd /opt/tmp/server/service/pay-of-java/build/
sh build.sh dev

##build是构建脚本


# (测试会报一堆错导致打包失败,原因是因为Jenkins服务器没有配置springboot环境,
# 实际java开发本地环境那里他们已经测试好了,这边不用配置和测试
# mvn clean install -DskipTests 
rm -rf /opt/maven-repo/repo/com/huoma/*
##这个目前不用 调用脚本3 执行 cd到/root/huoma-dzg---fork即当前目录下cd到每个模块目录
#这个目前不用cd到每个模块目录分别执行docker build 命令后面跟端口号 以及一堆环境变量去分别构建镜像 

# 增加需要在/tmp/huoma-dzg/server/service/pay-of-java/build/build.sh构建镜像前需要清理旧镜像
#构建后推送镜像到harbor仓库

# 可选:删除临时文件
  rm -f /tmp/changes_list.txt 
docker rmi  wallet:dev-latest 

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐