stages: - check - build - deploy variables: Namespace: "yescent" ProjectName: "Yes.Blog" PackageName: "yes.blog" AppPort: "9009" DockerfilePath: "./${ProjectName}/Dockerfile" DockerImage: "${Ali_Docker_Registry}/${Namespace}/${PackageName}" check-merge-target: stage: check script: - | # 获取当前合并请求的目标分支 TARGET_BRANCH="$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" SOURCE_BRANCH="$CI_COMMIT_BRANCH" # 定义允许合并的规则 if [[ "$SOURCE_BRANCH" == "develop" && "$TARGET_BRANCH" != "release" ]]; then echo "❌ 禁止将 develop 分支合并到 $TARGET_BRANCH" exit 1 elif [[ "$SOURCE_BRANCH" == "release" && "$TARGET_BRANCH" != "master" ]]; then echo "❌ 禁止将 release 分支合并到 $TARGET_BRANCH" exit 1 else echo "✅ 允许合并" fi only: - develop - release - master build_develop: stage: build script: - Version=$(sed -n 's/.*\([^<]*\)<\/Version>.*/\1/p' ./${ProjectName}/${ProjectName}.csproj) - docker build -f ${DockerfilePath} -t ${DockerImage}:v${Version}-develop${CI_PIPELINE_ID} . only: - develop build_release: stage: build script: - Version=$(sed -n 's/.*\([^<]*\)<\/Version>.*/\1/p' ./${ProjectName}/${ProjectName}.csproj) - docker build -f ${DockerfilePath} -t ${DockerImage}:v${Version}-release${CI_PIPELINE_ID} . - docker login -u ${Ali_Docker_UserName} -p ${Ali_Docker_Password} ${Ali_Docker_Registry} - docker push ${DockerImage}:v${Version}-release${CI_PIPELINE_ID} only: - release build_master: stage: build script: - Version=$(sed -n 's/.*\([^<]*\)<\/Version>.*/\1/p' ./${ProjectName}/${ProjectName}.csproj) - docker build -f ${DockerfilePath} -t ${DockerImage}:v${Version}.${CI_PIPELINE_ID} . - docker tag ${DockerImage}:v${Version}.${CI_PIPELINE_ID} ${DockerImage}:latest - docker login -u ${Ali_Docker_UserName} -p ${Ali_Docker_Password} ${Ali_Docker_Registry} - docker push ${DockerImage}:v${Version}.${CI_PIPELINE_ID} - docker rm -f ${DockerImage}:latest && docker push ${DockerImage}:latest only: - master deploy_production: stage: deploy before_script: - Version=$(sed -n 's/.*\([^<]*\)<\/Version>.*/\1/p' ./${ProjectName}/${ProjectName}.csproj) ## 安装ssh-agent - 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) ## 将GitLab服务器私钥添加到ssh-agent代理中 - chmod 400 "$SSH_PRIVATE_KEY" - ssh-add "$SSH_PRIVATE_KEY" ## 创建~/.ssh目录 - mkdir -p ~/.ssh - chmod 700 ~/.ssh ## 创建SSH_KNOWN_HOSTS - cp "$SSH_KNOWN_HOSTS" ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts script: - ssh -t ${Server_Ip} "(docker stop ${PackageName} && docker rm ${PackageName} || echo 'Container ${PackageName} not found, skipping removal.') && docker login -u ${Ali_Docker_UserName} -p ${Ali_Docker_Password} ${Ali_Docker_Registry} && docker run -e TZ=Asia/Shanghai -d --restart=always -v /data/yesblog:/app/files --name ${PackageName} -p ${AppPort}:8080 ${DockerImage}:v${Version}-release${CI_PIPELINE_ID}" only: - release