在k8s环境下我们正常打包使用docker镜像进行打包。最好得方案是,每次打包都去拉取所需得jar包,这样就每个每个工程互不影响,但是这样未免也太豪了,并且每个分支包在nexus上还可能产生覆盖冲突等问题。例如,我们有四个环境,如果开发包都用snapshot的话,就可能出现A\B两人使用不同的分支同时打包,并且他们共同依赖了一个公共包,那么这个公共包就有可能A使用了B的包导致出现问题,这就是所谓的串包。那么我们的方案如下,
- 按环境本地分仓,解决不同环境串包问题
- 开发环境按分支分版本使用version:set -DnewVersion=${CI_COMMIT_REF_NAME}-SNAPSHOT,解决开发环境串包(未实施)
脚本如下,按分支分版本未完善自己行修改,部分变量说明
- GITLAB_AT:gitlab-Access_token
- CI_COMMIT_REF_NAME:git默认环境变量,分支名
- DEPENDENCY_LIST自定义需要依赖的构建项目,A依赖B,先构建B,再构建A
- BUILD_SUPPORT 自定义的业务框架项目构建开关
- BUILD_ARCH 自定义的基础架构项目构建开关 以上变量都定义在gitlab ci variables中。
#!/usr/bin/env bash
set -e
CUR_DIR=$(cd $(dirname $0);pwd)
function build(){
GIT_URL="http://${GITLAB_USER:-username}:${GITLAB_AT}@gitlab.xxx.cn/reponame/$1.git"
if [ -d $1 ];then
rm -rf ${CUR_DIR}/$1
fi;
git clone $GIT_URL
cd ${CUR_DIR}/$1
count=$(git branch -a|grep ${CI_COMMIT_REF_NAME}|wc -l)
if [ $count != 0 ];then
git checkout ${CI_COMMIT_REF_NAME}
env_name=$(get_env)
mvn clean install -Dmaven.test.failure.ignore=true -DskipTests=true -Dmaven.repo.local=/root/.m2/repository-$env_name -U
fi
cd ${CUR_DIR}
rm -rf ${CUR_DIR}/$1
}
function build_dependency(){
for PRO in $DEPENDENCY_LIST ;do
build $PRO
done
}
function get_env(){
if [[ "${CI_COMMIT_REF_NAME}" =~ dev[0-9]* ]]; then
echo "dev"
elif [[ "${CI_COMMIT_REF_NAME}" =~ sit[0-9]* ]] || [[ "${CI_COMMIT_REF_NAME}" =~ sit[0-9]* ]]; then
echo "sit"
elif [[ "${CI_COMMIT_REF_NAME}"=="master" ]] || [[ "${CI_COMMIT_REF_NAME}"=="release-"* ]] || [[ "${CI_COMMIT_REF_NAME}"=="hotfix-"* ]];then
echo "prod"
else
echo "dev"
fi
}
function main(){
if [[ -n ${BUILD_ARCH} ]] && [[ ${BUILD_ARCH} == true ]];then
build framework-all
fi
if [[ -n ${BUILD_SUPPORT} ]] && [[ ${BUILD_SUPPORT} == true ]];then
build support
fi
if [[ -n ${DEPENDENCY_LIST} ]];then
build_dependency
fi
env_name=$(get_env)
mvn clean package -Dmaven.test.failure.ignore=true -DskipTests=true -Dmaven.repo.local=/root/.m2/repository-$env_name -U
}
main $*
使用也相当简单,首先把脚本放在gitlab中,通过curl拉取,然后配置stage即可
mvn-package:
stage: mvn-package
script:
- bash build.sh
- cp target/app.war ${CACHE_PIPELINE}/app.war
only:
- sit
- /^dev\d+$/
- /^feature-.*$/
.auto_devops: &auto_devops |
echo "GITLAB_AT=$GITLAB_AT;GITLAB_USER=$GITLAB_USER;BUILD_ARCH=$BUILD_ARCH;BUILD_SUPPORT=$BUILD_SUPPORT;DEPENDENCY_LIST=$DEPENDENCY_LIST"
build_status=`curl -O -s -m 10 --connect-timeout 10 -w %{http_code} --header "PRIVATE-TOKEN:${GITLAB_AT}" http://gitlab.xxx.cn/package/bash/raw/master/build.sh`
if [ $build_status != 200 ];then
echo '请设置GITLAB_AT'
exit 1
fi