在使用gitlab ci/cd部署我们服务时,是怎么知道对应模块文件的变更的呢?是如何对变成的微服务模块进行打包的呢?下面将从git命令、shell 命令、mvn 命令等三个主要的命令讲解其具体实现。
git命令获取变更记录
通过下面命令就能获取到变更文件:
git diff --name-status git提交本次版本号 git提交上次版本号
gitlab版本号获取可以通过下面两个变量获取:
$CI_COMMIT_SHA$CI_COMMIT_BEFORE_SHA
通过上面两个信息就能提取到变更文件的目录信息:
下面就是通过shell命令获取变更模块,然后打包对应模块和其依赖的模块了。
shell解析变更模块
然后就是通过shell脚本解析上面git命令获取得到的变文件目录,如下:
file_changes=$(git diff --name-status f246b466 6f3a6285)
declare -a UNIQUE_FOLDERS
while read -r line; do
root_folder=`echo "$line" | cut -b 3- | cut -d "/" -f1`
if [ -d "$k8s_folder" ]; then
UNIQUE_FOLDERS[i]="${root_folder}"
fi
done <<< "$file_changes"
UNIQUE_FOLDERS=($(printf "%s\n" "${UNIQUE_FOLDERS[@]}" | sort -u))
通过上面脚本可以获取唯一且变更了文件的根目录:
report
ticket
vehicle
mvn 命令
mvn命令打包指定模块,该命令将模块依赖的common module和父 pom一起打包,所以不用担心依赖不会重新打包的问题。
mvn package -pl module -am -Dmaven.test.skip=true
流程:
- 通过shell脚本循环变更的目录,mvn打包模块和其依赖。
- 将生成的jar包,k8s部署文件,dockerfile文件拷贝到新的artifact目录下。gitlab后面的build和deploy job,将会操作artifact目录下的文件,然后进行镜像上传、k8s部署。
for changed_folder in "${UNIQUE_FOLDERS[@]}"
do
mvn package -pl ${changed_folder} -am -Dmaven.test.skip=true
subfolder=$(echo "${changed_folder}" | cut -d'-' -f2-)
mkdir -p ./artifact/${subfolder}
cp ./${changed_folder}/target/*.jar ./artifact/${subfolder}/runnable.jar
cp ./${changed_folder}/k8s/deployment.yaml ./artifact/${subfolder}/
cp ./${changed_folder}/k8s/Dockerfile ./artifact/${subfolder}/
done
整个完整的脚本如下:
#!/bin/bash file_changes=$(git diff --name-status ${CI_COMMIT_SHA} ${CI_COMMIT_BEFORE_SHA}) declare -a UNIQUE_FOLDERS while read -r line; do root_folder=`echo "$line" | cut -b 3- | cut -d "/" -f1` if [ -d "$k8s_folder" ]; then UNIQUE_FOLDERS[i]="${root_folder}" fi done <<< "$file_changes" UNIQUE_FOLDERS=($(printf "%s\n" "${UNIQUE_FOLDERS[@]}" | sort -u)) for changed_folder in "${UNIQUE_FOLDERS[@]}" do mvn package -pl ${changed_folder} -am -Dmaven.test.skip=true subfolder=$(echo "${changed_folder}" | cut -d'-' -f2-) mkdir -p ./artifact/${subfolder} cp ./${changed_folder}/target/*.jar ./artifact/${subfolder}/runnable.jar cp ./${changed_folder}/k8s/deployment.yaml ./artifact/${subfolder}/ cp ./${changed_folder}/k8s/Dockerfile ./artifact/${subfolder}/ done