Files
yes.blog/.gitlab-ci.yml
2025-05-09 23:49:09 +08:00

101 lines
3.4 KiB
YAML

stages:
- check
- build
- deploy
variables:
Namespace: "yescent"
ProjectName: "Yes.Blog"
PackageName: "yes.blog"
MasterPackageName: "hyrule"
AppPort: "9009"
DockerfilePath: "./${ProjectName}/Dockerfile"
DockerImage: "${Ali_Docker_Registry}/${Namespace}/${PackageName}"
MasterDockerImage: "${Ali_Docker_Registry}/${Namespace}/${MasterPackageName}"
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/yesblog:/app/files --name ${PackageName} -p ${AppPort}:8080 ${DockerImage}:${ReleaseVersion}"
only:
- release