该脚本适用于git仓库根据增量文件清单合并版本,增量文件清单为开发人员提交更改时通过diff输出的变更清单,合并前整理增量包并调用外部接口进行增量代码扫描。

|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
#!/bin/bash # 最后更新:2024/07/09 # 脚本开发:刘智林 # 脚本功能:Git根据文件清单合并代码shell脚本(合并前扫描代码) # 特殊说明:调用外部代码扫描功能 # 待复制的清单文件为git比对出来的文件清单 # 脚本参数: # -a 项目名称 # -f 待复制的清单文件 # -d 目标分支(默认release) # -s 源分支名(默认develop) # -u 仓库用户名称(留空时不检查GIT环境) # -p 仓库用户密码(留空时不检查GIT环境) # ./mergeCodeGitWhitFileList.sh -a '10001' -f 'fileLst.txt' -d 'develop' -s 'feature' -u 'lzl@olzl.net' -p 'git@2025' # 代码仓库信息 gitBase="http://10.10.100.100" gitUser="lzl@olzl.net" gitPass="git@2025" while getopts 'a:f:d:s:u:p:' OPT do case ${OPT} in a) prjName="$OPTARG";; f) fileLst="$OPTARG";; d) dBranch="$OPTARG";; s) sBranch="$OPTARG";; u) gitUser="$OPTARG";; p) gitPass="$OPTARG";; esac done flag=0 [ -z "${prjName}" ] && echo "缺少项目名称" && flag=1 [ -z "${fileLst}" ] && echo "缺少文件清单" && flag=1 [ -z "${dBranch}" ] && dBranch="release" [ -z "${sBranch}" ] && sBranch="develop" # 基本工作目录 baseDir="${PWD}" workDir="${baseDir}/MERGE/${prjName}" # 代码扫描信息 scanDir="scan" scanLst="scanFiles.txt" # 扫描主机信息 svrUser="scaner" svrHost="10.10.100.101" svrFold="/usr/local/apache/JenkinsHome/workspace/${prjName}" # 扫描服务信息 scanUrl="http://${svrHost}:8088/jenkins/scaner" jksUser="jenkinser" jksPass="112d1665cb83741d7e010f9de72d2c4163" # 代码合并日志 workLog="${workDir%/*}/mergeCode-Git.log" getTime (){ nowTime=`date +'%Y%m%d%H%M%S'` } getResult (){ [ ${getStatus} -ne 0 ] && getTime && echo -e "${nowTime}\t上一条指令执行失败\n" >> ${workLog} && exit 1 } getTime echo ">>>>>>>>>>>>>>> ${prjName}-${nowTime:0:8} <<<<<<<<<<<<<<<" >> ${workLog} # 检查必要参数 [ ${flag} -eq 1 ] && echo -e "${nowTime}\t缺少必要参数或参数错误导致无法合并代码\n" >> ${workLog} && exit 1 if [ -n "${gitUser}" ] && [ -n "${gitPass}" ] then echo -e "${nowTime}\t初始化仓库环境数据" >> ${workLog} [ ! -e ~/.gitconfig ] && git config --global credential.helper store && git config --global user.email "${gitUser}" [ ! -e ~/.git-credentials ] && echo "Git登录信息:${gitUser} / ${gitPass}" fi # 统一列表格式 cd ${workDir} sed -i '/^$/d' ${fileLst} sed -i 's/^\ \+//g' ${filepList} sed -i 's/\ \+$//g' ${fileLst} sed -i 's/[\t ]\+/\t/g' ${fileLst} # 检查工作目录 [ ! -d ${workDir} ] && mkdir -p ${workDir} && getTime && echo -e "${nowTime}\t创建本地目录${workDir}" >> ${workLog} # 析取工程列表 cat ${fileLst} | while read fileType fileName do tmpList="tmpList.txt" prjList="pfjList.txt" [ -z "${fileName}" ] && continue echo ${fileName%%/*} >> ${tmpList} sort -u ${tmpList} > ${prjList} rm -f ${tmpList} done # 检出并更新源分支 cat ${prjList} | while read codeUrl do [ ! -d "${workDir}/${sBranch}" ] && mkdir -p ${workDir}/${sBranch} cd ${workDir}/${sBranch} getTime if [ ! -d "${codeUrl}" ] then echo -e "${nowTime}\t克隆${codeUrl}工程至本地" >> ${workLog} git clone -b ${sBranch} ${gitBase}/${prjName}/${codeUrl}.git else echo -e "${nowTime}\t更新${codeUrl}的${sBranch}本地分支" >> ${workLog} cd ${codeUrl} git checkout ${sBranch} git pull fi getStatus=$? getResult done # 复制待扫描的代码文件 cd ${workDir} cat ${fileLst} | while read fileType fileName do getTime case ${fileType^^} in A|M) [ ! -e ${sBranch}/${fileName} ] && echo -e "${nowTime}\t文件${sBranch}/${fileName}不存在" >> ${workLog} && exit 1 [ ! -d tmp/${fileName%/*} ] && mkdir -p tmp/${fileName%/*} cp -f ${sBranch}/${fileName} tmp/${fileName%/*}/ getStatus=$? getResult ;; esac done # 打包待扫描的代码文件 cd ${workDir} getTime echo -e "${nowTime}\t打包待扫描的代码文件" >> ${workLog} tar -zcf ${prjName}.tar.gz tmp getStatus=$? getResult # 复制文件至代码扫描服务器 getTime echo -e "${nowTime}\t发送待扫描的代码文件至扫描服务器" >> ${workLog} scp ${prjName}.tar.gz ${svrUser}@${svrHost}:${svrFold}/ getStatus=$? getResult sleep 1 # 处理代码扫描服务器的文件 getTime echo -e "${nowTime}\t清理扫描目录并解压待扫描的代码文件" >> ${workLog} ssh ${svrUser}@${svrHost} "cd ${svrFold}; [ -d tmp ] && rm -rf tmp; tar -zxf ${prjName}.tar.gz" getStatus=$? getResult sleep 1 # 调用代码扫描接口 getTime echo -e "${nowTime}\t扫描代码${gitBase}/${prjName}" >> ${workLog} curl -X POST ${scanUrl}/${prjName}/build --user ${jksUser}:${jksPass} --data-urlencode 'json={"parameter":[{"name":"version_url","value":"'"${gitBase}/${prjName}/代码扫描结果目录"'"}],"statusCode":"303","redirectTo":"."}' [ $? -ne 0 ] && getTime && echo -e "${nowTime}\t调用代码扫描接口时遇到问题" >> ${workLog} # 检出并更新目标分支 cd ${workDir} cat ${prjList} | while read codeUrl do [ ! -d "${workDir}/${dBranch}" ] && mkdir -p ${workDir}/${dBranch} cd ${workDir}/${dBranch} getTime if [ ! -d "${codeUrl}" ] then echo -e "${nowTime}\t克隆${codeUrl}工程至本地" >> ${workLog} git clone -b ${dBranch} ${gitBase}/${prjName}/${codeUrl}.git else echo -e "${nowTime}\t更新${codeUrl}的${dBranch}本地分支" >> ${workLog} cd ${codeUrl} git checkout ${dBranch} git pull fi getStatus=$? getResult done # 整理目标分支 cd ${workDir} cat ${fileLst} | while read fileType fileName do cd ${workDir}/${dBranch}/${fileName%%/*} case ${fileType^^} in A|M) cp -f ${workDir}/tmp/${fileName} ${workDir}/${dBranch}/${fileName} getStatus=$? getResult [ "${fileType}^^" = "A" ] && git add ${fileName#*/} && getStatus=$? && getResult ;; D) git rm -f ${fileName#*/} echo "文件${fileName}已删除" ;; esac done # 提交合并代码 cd ${workDir} cat ${prjList} | while read codeUrl do cd ${workDir}/${dBranch}/${codeUrl} git commit -a -m "配置管理员根据发版申请提交代码" git push -u origin ${dBranch} getStatus=$? getResult done # 清理工程列表 cd ${workDir} rm -f ${prjList} getTime echo -e ">>>>>>>>>>>>>>> ${nowTime} <<<<<<<<<<<<<<<\n" >> ${workLog} |
原创文章禁止转载:技术学堂 » Git根据文件清单合并代码shell脚本(合并前扫描代码)

技术学堂















