124 lines
4.4 KiB
YAML
124 lines
4.4 KiB
YAML
# 条件部署示例
|
|
# 这个示例展示了如何根据触发方式进行条件部署
|
|
|
|
name: Conditional Deployment
|
|
|
|
on:
|
|
push:
|
|
branches: ['main', 'develop', 'v*']
|
|
tags: ['v*']
|
|
|
|
jobs:
|
|
analyze:
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
is-version-trigger: ${{ steps.version-info.outputs.is-version-trigger }}
|
|
trigger-version: ${{ steps.version-info.outputs.trigger-version }}
|
|
version-with-dash: ${{ steps.version-info.outputs.version-with-dash }}
|
|
trigger-source: ${{ steps.version-info.outputs.trigger-source }}
|
|
ref-name: ${{ steps.version-info.outputs.ref-name }}
|
|
deploy-staging: ${{ steps.deployment-strategy.outputs.deploy-staging }}
|
|
deploy-production: ${{ steps.deployment-strategy.outputs.deploy-production }}
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: 获取版本信息
|
|
id: version-info
|
|
uses: actions/xgj/trigger-version@v1
|
|
|
|
- name: 确定部署策略
|
|
id: deployment-strategy
|
|
run: |
|
|
IS_VERSION="${{ steps.version-info.outputs.is-version-trigger }}"
|
|
REF_NAME="${{ steps.version-info.outputs.ref-name }}"
|
|
|
|
echo "分析部署策略..."
|
|
|
|
# 生产环境部署条件:版本标签触发
|
|
if [[ "$IS_VERSION" == "true" && "${{ steps.version-info.outputs.trigger-source }}" == "tag" ]]; then
|
|
echo "deploy-production=true" >> $GITHUB_OUTPUT
|
|
echo "deploy-staging=false" >> $GITHUB_OUTPUT
|
|
echo "🚀 将部署到生产环境"
|
|
# 测试环境部署条件:main分支或版本分支
|
|
elif [[ "$REF_NAME" == "main" || "$IS_VERSION" == "true" ]]; then
|
|
echo "deploy-production=false" >> $GITHUB_OUTPUT
|
|
echo "deploy-staging=true" >> $GITHUB_OUTPUT
|
|
echo "🧪 将部署到测试环境"
|
|
else
|
|
echo "deploy-production=false" >> $GITHUB_OUTPUT
|
|
echo "deploy-staging=false" >> $GITHUB_OUTPUT
|
|
echo "⏭️ 跳过部署"
|
|
fi
|
|
|
|
build:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: 构建应用
|
|
run: |
|
|
echo "🔨 构建应用中..."
|
|
# 模拟构建过程
|
|
sleep 2
|
|
echo "✅ 构建完成"
|
|
|
|
- name: 运行测试
|
|
run: |
|
|
echo "🧪 运行测试中..."
|
|
# 模拟测试过程
|
|
sleep 1
|
|
echo "✅ 测试通过"
|
|
|
|
deploy-staging:
|
|
needs: [analyze, build]
|
|
runs-on: ubuntu-latest
|
|
if: needs.analyze.outputs.deploy-staging == 'true'
|
|
environment: staging
|
|
|
|
steps:
|
|
- name: 部署到测试环境
|
|
run: |
|
|
echo "🚀 部署到测试环境"
|
|
echo "分支/版本: ${{ needs.analyze.outputs.ref-name }}"
|
|
if [[ "${{ needs.analyze.outputs.is-version-trigger }}" == "true" ]]; then
|
|
echo "版本号: ${{ needs.analyze.outputs.trigger-version }}"
|
|
fi
|
|
echo "✅ 测试环境部署完成"
|
|
|
|
- name: 发送通知
|
|
run: |
|
|
echo "📢 发送测试环境部署通知"
|
|
# 这里可以集成 Slack、钉钉等通知
|
|
|
|
deploy-production:
|
|
needs: [analyze, build]
|
|
runs-on: ubuntu-latest
|
|
if: needs.analyze.outputs.deploy-production == 'true'
|
|
environment: production
|
|
|
|
steps:
|
|
- name: 部署到生产环境
|
|
run: |
|
|
echo "🚀 部署版本 ${{ needs.analyze.outputs.trigger-version }} 到生产环境"
|
|
echo "🐳 Docker标签: myapp:${{ needs.analyze.outputs.version-with-dash }}"
|
|
echo "触发源: ${{ needs.analyze.outputs.trigger-source }}"
|
|
# 生产部署逻辑
|
|
# docker build -t myapp:${{ needs.analyze.outputs.version-with-dash }} .
|
|
# docker push myapp:${{ needs.analyze.outputs.version-with-dash }}
|
|
echo "✅ 生产环境部署完成"
|
|
|
|
- name: 创建 Release
|
|
if: needs.analyze.outputs.trigger-source == 'tag'
|
|
run: |
|
|
echo "📦 创建 GitHub Release"
|
|
echo "版本: v${{ needs.analyze.outputs.trigger-version }}"
|
|
# 这里可以使用 gh CLI 创建 release
|
|
|
|
- name: 发送生产部署通知
|
|
run: |
|
|
echo "📢 发送生产环境部署通知"
|
|
echo "🎉 版本 ${{ needs.analyze.outputs.trigger-version }} 已成功部署到生产环境"
|