stages: - check - build - deploy - sync variables: DockerfilePath: "./${ProjectName}/Dockerfile" DockerImage: "${Ali_Docker_Registry}/${Namespace}/${PackageName}" MasterDockerImage: "${Ali_Docker_Registry}/${Namespace}/${MasterPackageName}" sync_to_github: stage: sync image: alpine/git script: - git config --global user.email "ci@example.com" - git config --global user.name "GitLab CI" - git remote add github https://oauth2:${GITHUB_TOKEN}@github.com/8720826/hyrule.git - git push github --all - git push github --tags sync_to_gitee: stage: sync image: alpine/git script: - git config --global user.email "ci@example.com" - git config --global user.name "GitLab CI" - git remote add gitee https://oauth2:${GITEE_TOKEN}@gitee.com/q8720826/hyrule.git - git push gitee --all - git push gitee --tags only: - master check-merge-target: stage: check script: - | ## 获取当前合并请求的目标分支 TARGET_BRANCH="$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" SOURCE_BRANCH="$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" ## 定义允许合并的规则 if [[ "$SOURCE_BRANCH" == "develop" && "$TARGET_BRANCH" == "release" ]]; then echo "✅ 允许合并" elif [[ "$SOURCE_BRANCH" == "release" && "$TARGET_BRANCH" == "master" ]]; then echo "✅ 允许合并" else echo "❌ 禁止将 $SOURCE_BRANCH 分支合并到 $TARGET_BRANCH" exit 1 fi only: - merge_requests build_develop: stage: build script: - Version=$(sed -n 's/.*\([^<]*\)<\/Version>.*/\1/p' ./${ProjectName}/${ProjectName}.csproj) - DevelopVersion=v${Version}-develop${CI_PIPELINE_ID} - docker build -f ${DockerfilePath} -t ${DockerImage}:${DevelopVersion} . only: - develop build_release: stage: build script: - Version=$(sed -n 's/.*\([^<]*\)<\/Version>.*/\1/p' ./${ProjectName}/${ProjectName}.csproj) - ReleaseVersion=v${Version}-release${CI_PIPELINE_ID} - docker build -f ${DockerfilePath} -t ${DockerImage}:${ReleaseVersion} . - docker login -u ${Ali_Docker_UserName} -p ${Ali_Docker_Password} ${Ali_Docker_Registry} - docker push ${DockerImage}:${ReleaseVersion} only: - release build_master: stage: build script: - Version=$(sed -n 's/.*\([^<]*\)<\/Version>.*/\1/p' ./${ProjectName}/${ProjectName}.csproj) - MasterVersion=v${Version}.${CI_PIPELINE_ID} - docker build -f ${DockerfilePath} -t ${MasterDockerImage}:${MasterVersion} . - docker tag ${MasterDockerImage}:${MasterVersion} ${MasterDockerImage}:latest - docker login -u ${Ali_Docker_UserName} -p ${Ali_Docker_Password} ${Ali_Docker_Registry} - docker push ${MasterDockerImage}:${MasterVersion} - docker push ${MasterDockerImage}:latest && docker rm -f ${MasterDockerImage}:latest only: - master deploy_production: stage: deploy before_script: - Version=$(sed -n 's/.*\([^<]*\)<\/Version>.*/\1/p' ./${ProjectName}/${ProjectName}.csproj) - ReleaseVersion=v${Version}-release${CI_PIPELINE_ID} ## 安装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/${PackageName}:/app/files --name ${PackageName} -p ${AppPort}:8080 ${DockerImage}:${ReleaseVersion}" only: - release deploy_master: stage: deploy before_script: - Version=$(sed -n 's/.*\([^<]*\)<\/Version>.*/\1/p' ./${ProjectName}/${ProjectName}.csproj) - MasterVersion=v${Version}.${CI_PIPELINE_ID} ## 安装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_HOSTS2" ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts script: - ssh -t ${Server_Ip2} "(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/${PackageName}:/app/files --name ${PackageName} -p ${AppPort}:8080 ${MasterDockerImage}:${MasterVersion}" only: - master