You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions复用Slack通知步骤问题咨询

解决方案:GitHub Actions实现DRY的Slack通知触发

问题原因

你直接使用- uses: slack_success报错,是因为uses关键字仅支持引用预构建Action、可重用工作流或仓库内的自定义Action目录,无法直接调用当前工作流中定义的jobs(作业)。作业之间的关联需要通过needs依赖+条件判断实现,或者将通知逻辑封装为可重用的自定义Action。

推荐方案:封装自定义Action实现DRY

将Slack通知逻辑抽离为仓库内的自定义Action,这样每个核心作业只需调用该Action并传入参数即可,完全符合DRY原则。

1. 创建自定义Slack通知Action

在仓库根目录创建.github/actions/slack-notify/action.yml,内容如下:

name: 'Slack Notification'
description: '统一发送作业状态的Slack通知'
inputs:
  job-name:
    description: '需要通知的作业名称'
    required: true
  status:
    description: '作业状态(success/failure)'
    required: true
runs:
  using: 'composite'
  steps:
    - name: 发送Slack通知
      uses: slackapi/slack-github-action@v1.24.0
      with:
        slack-message: >
          ${{ inputs.status == 'success' 
            && format('✅ 作业 `{0}` 执行成功!', inputs.job-name) 
            || format('❌ 作业 `{0}` 执行失败!', inputs.job-name) }}
      env:
        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

2. 在主工作流中调用自定义Action

修改你的GitHub Actions工作流文件,为每个核心作业(Release、Build、Publish)添加通知步骤,通过if条件判断触发成功/失败通知:

name: 发布工作流
on: [push]

jobs:
  Release:
    runs-on: ubuntu-latest
    steps:
      - name: 执行Release步骤
        run: echo "Running Release job..."
      # 作业成功时发送通知
      - name: Slack成功通知
        uses: ./.github/actions/slack-notify
        if: success()
        with:
          job-name: 'Release'
          status: 'success'
      # 作业失败时发送通知
      - name: Slack失败通知
        uses: ./.github/actions/slack-notify
        if: failure()
        with:
          job-name: 'Release'
          status: 'failure'

  Build:
    runs-on: ubuntu-latest
    needs: Release
    steps:
      - name: 执行Build步骤
        run: echo "Running Build job..."
      - name: Slack成功通知
        uses: ./.github/actions/slack-notify
        if: success()
        with:
          job-name: 'Build'
          status: 'success'
      - name: Slack失败通知
        uses: ./.github/actions/slack-notify
        if: failure()
        with:
          job-name: 'Build'
          status: 'failure'

  Publish:
    runs-on: ubuntu-latest
    needs: Build
    steps:
      - name: 执行Publish步骤
        run: echo "Running Publish job..."
      - name: Slack成功通知
        uses: ./.github/actions/slack-notify
        if: success()
        with:
          job-name: 'Publish'
          status: 'success'
      - name: Slack失败通知
        uses: ./.github/actions/slack-notify
        if: failure()
        with:
          job-name: 'Publish'
          status: 'failure'

备选方案:通过作业依赖+可重用工作流实现

如果坚持用作业的方式实现,可以将slack_success和slack_fail封装为可重用工作流,然后为每个核心作业调用对应的通知工作流:

1. 创建可重用的Slack通知工作流

创建.github/workflows/slack-notify.yml:

name: Slack通知工作流
on:
  workflow_call:
    inputs:
      trigger-job:
        description: '触发通知的作业名称'
        required: true
        type: string

jobs:
  slack_success:
    runs-on: ubuntu-latest
    if: success()
    steps:
      - name: 发送成功通知
        uses: slackapi/slack-github-action@v1.24.0
        with:
          slack-message: "✅ 作业 `${{ inputs.trigger-job }}` 执行成功!"
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

  slack_fail:
    runs-on: ubuntu-latest
    if: failure()
    steps:
      - name: 发送失败通知
        uses: slackapi/slack-github-action@v1.24.0
        with:
          slack-message: "❌ 作业 `${{ inputs.trigger-job }}` 执行失败!"
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

2. 在主工作流中调用可重用工作流

name: 发布工作流
on: [push]

jobs:
  Release:
    runs-on: ubuntu-latest
    steps:
      - name: 执行Release步骤
        run: echo "Running Release job..."

  Build:
    runs-on: ubuntu-latest
    needs: Release
    steps:
      - name: 执行Build步骤
        run: echo "Running Build job..."

  Publish:
    runs-on: ubuntu-latest
    needs: Build
    steps:
      - name: 执行Publish步骤
        run: echo "Running Publish job..."

  # 为每个核心作业绑定通知
  notify_release:
    uses: ./.github/workflows/slack-notify.yml
    with:
      trigger-job: 'Release'
    needs: Release

  notify_build:
    uses: ./.github/workflows/slack-notify.yml
    with:
      trigger-job: 'Build'
    needs: Build

  notify_publish:
    uses: ./.github/workflows/slack-notify.yml
    with:
      trigger-job: 'Publish'
    needs: Publish

方案对比

  • 自定义Action方案:代码更简洁,通知逻辑与作业步骤融合,额外生成的作业少,更推荐。
  • 可重用工作流方案:适合需要独立管理通知逻辑场景,但会生成更多作业实例。

内容的提问来源于stack exchange,提问作者doughlass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:15:07