k8s打包机实现构建缓存环境分仓

544 阅读1分钟

在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