Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 38 additions & 1 deletion .github/workflows/publish-to-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: write
outputs:
# The notify job replies in the start notice's thread.
slack-ts: ${{ steps.slack-start.outputs.ts }}

steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand All @@ -23,6 +26,7 @@ jobs:

# Non-fatal: Slack being down must not block the release.
- name: Notify Slack (start)
id: slack-start
if: ${{ vars.SLACK_CHANNEL_ID != '' }}
continue-on-error: true
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
Expand Down Expand Up @@ -93,6 +97,13 @@ jobs:
if: ${{ !cancelled() && vars.SLACK_CHANNEL_ID != '' }}
runs-on: ubuntu-latest

env:
# Notices reply in the start notice's thread, quoted so YAML keeps the ts a
# string. Without a start notice (its post failed or never ran) this is null,
# which the Slack client drops, and they post to the channel. Failures are
# also broadcast to the channel; success stays in the thread.
THREAD_TS: ${{ needs.build.outputs.slack-ts && format('"{0}"', needs.build.outputs.slack-ts) || 'null' }}

steps:
- name: Notify Slack (build failure)
if: ${{ needs.build.result == 'failure' }}
Expand All @@ -103,6 +114,8 @@ jobs:
errors: true
payload: |
channel: ${{ vars.SLACK_CHANNEL_ID }}
thread_ts: ${{ env.THREAD_TS }}
reply_broadcast: ${{ env.THREAD_TS != 'null' }}
text: >-
*Codeplain Client*: Build of `${{ github.ref_name }}` FAILED :x:. Nothing was published to PyPI.
See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.
Expand All @@ -116,6 +129,8 @@ jobs:
errors: true
payload: |
channel: ${{ vars.SLACK_CHANNEL_ID }}
thread_ts: ${{ env.THREAD_TS }}
reply_broadcast: ${{ env.THREAD_TS != 'null' }}
text: >-
*Codeplain Client*: Publishing `${{ github.ref_name }}` to PyPI FAILED :x:.
See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.
Expand All @@ -141,6 +156,7 @@ jobs:
errors: true
payload: |
channel: ${{ vars.SLACK_CHANNEL_ID }}
thread_ts: ${{ env.THREAD_TS }}
text: >-
*Codeplain Client*: pre-release `${{ github.ref_name }}` published to PyPI :test_tube:.
Normal installs are unaffected — try it with `pip install --pre codeplain==${{ steps.version.outputs.version }}`.
Expand All @@ -154,18 +170,35 @@ jobs:
errors: true
payload: |
channel: ${{ vars.SLACK_CHANNEL_ID }}
thread_ts: ${{ env.THREAD_TS }}
text: >-
*Codeplain Client*: `${{ github.ref_name }}` published to PyPI :white_check_mark:.
Install with `pip install --upgrade codeplain`.

# Success also puts a ✅ on the start notice, so the result shows in the
# channel without another message. Needs the app's reactions:write scope.
# Non-fatal: the result is already posted, and a re-run gets already_reacted.
- name: Notify Slack (✅ on the start notice)
if: ${{ needs.publish-to-pypi.result == 'success' && env.THREAD_TS != 'null' }}
continue-on-error: true
uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
with:
method: reactions.add
token: ${{ secrets.SLACK_BOT_TOKEN }}
errors: true
payload: |
channel: ${{ vars.SLACK_CHANNEL_ID }}
timestamp: ${{ env.THREAD_TS }}
name: white_check_mark

# Release pipelines to be turned on only after the rest of the infrastructure
# is ready.
#
# # Runs only after the package is on PyPI. Kept as its own job so the publish job
# # keeps its minimal permissions and no checkout.
# linear-release:
# name: Record release in Linear
# needs: publish-to-pypi
# needs: [build, publish-to-pypi]
# runs-on: ubuntu-latest
#
# permissions:
Expand All @@ -192,13 +225,17 @@ jobs:
# # outcome — `failure()` would never fire.
# - name: Notify Slack (release not recorded)
# if: ${{ steps.linear.outcome == 'failure' && vars.SLACK_CHANNEL_ID != '' }}
# env:
# # See the notify job.
# THREAD_TS: ${{ needs.build.outputs.slack-ts && format('"{0}"', needs.build.outputs.slack-ts) || 'null' }}
# uses: slackapi/slack-github-action@dcb1066f776dd043e64d0e8ba94ca15cc7e1875d # v4.0.0
# with:
# method: chat.postMessage
# token: ${{ secrets.SLACK_BOT_TOKEN }}
# errors: true
# payload: |
# channel: ${{ vars.SLACK_CHANNEL_ID }}
# thread_ts: ${{ env.THREAD_TS }}
# text: >-
# *Codeplain Client*: `${{ github.ref_name }}` is on PyPI, but recording it in Linear FAILED :warning:.
# See <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|the run log>.
Loading