144 lines
5.1 KiB
YAML
144 lines
5.1 KiB
YAML
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>\([^<]*\)<\/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>\([^<]*\)<\/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>\([^<]*\)<\/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>\([^<]*\)<\/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>\([^<]*\)<\/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
|