stages: - lock - build - save - unlock variables: GOPATH: "/home/gopath" GoServerSrcPath: "mongo.games.com/goserver" # 项目相对于GOPATH/src的路径 BetaBinPath: "/home/game/" # beta环境部署路径 DevelopBinPath: "/home/game/" # develop环境部署路径 default: tags: - gitlab cache: key: ${CI_COMMIT_REF_SLUG} paths: - ${GOPATH}/pkg/mod - ${GOPATH}/bin # 锁定作业,防止并发流水线执行 lock_job: stage: lock script: - | if [ -f /tmp/ci_lock_$CI_COMMIT_REF_NAME ]; then echo "流水线($CI_COMMIT_REF_NAME)已在运行,等待..." exit 1 else touch /tmp/ci_lock_$CI_COMMIT_REF_NAME echo "获得锁定,开始流水线($CI_COMMIT_REF_NAME)。" fi build-job: stage: build only: - develop - release script: - git checkout $CI_COMMIT_REF_NAME - git pull origin $CI_COMMIT_REF_NAME # 替换 go.mod 中的 ../goserver - sed -i "s|mongo.games.com/goserver => .*|mongo.games.com/goserver => $GOPATH/src/$GoServerSrcPath|" go.mod - if [ ! -z "$(git status --porcelain go.mod go.sum)" ]; then GOMODTIDY=1; fi # 编译 - echo '编译' - if [ "$GOMODTIDY" == 1 ]; then go mod tidy; fi - | while IFS= read -r line || [[ -n $line ]] do cd $line echo "编译 $line" go build -v cd .. done < ./programs.txt save-job: stage: save only: - develop - release script: # 拷贝文件 - echo '拷贝文件' - rm -rf ./temp - mkdir ./temp - mkdir ./temp/data - cp -rfp ./data/* ./temp/data # 删除自定义配置 - echo '删除自定义配置' - | while IFS= read -r line || [[ -n $line ]] do echo "删除 $line 配置" rm ./temp/data/$line done < ./exclude.txt # 拷贝可执行程序 - echo '拷贝可执行程序' - | while IFS= read -r line || [[ -n $line ]] do echo "拷贝 $line" mv ./$line/$line ./temp/$line done < ./programs.txt # 解锁作业,释放锁定 unlock_job: stage: unlock script: - rm -f /tmp/ci_lock_$CI_COMMIT_REF_NAME - echo "释放锁定,流水线结束(/$CI_COMMIT_REF_NAME)。" when: always