Skip to content

chore: bump versions for release -- iii(iii/v0.11.0-next.3) #20

chore: bump versions for release -- iii(iii/v0.11.0-next.3)

chore: bump versions for release -- iii(iii/v0.11.0-next.3) #20

Workflow file for this run

name: Release iii
on:
push:
tags:
- 'iii/v*'
permissions:
contents: write
id-token: write
actions: write
security-events: write
concurrency:
group: release-iii-${{ github.repository }}
jobs:
# ──────────────────────────────────────────────────────────────
# Setup: Parse tag metadata & notify
# ──────────────────────────────────────────────────────────────
setup:
name: Setup
runs-on: ubuntu-latest
outputs:
tag: ${{ github.ref_name }}
version: ${{ steps.meta.outputs.version }}
is_prerelease: ${{ steps.meta.outputs.is_prerelease }}
npm_tag: ${{ steps.meta.outputs.npm_tag }}
dry_run: ${{ steps.meta.outputs.dry_run }}
slack_ts: ${{ steps.slack.outputs.ts }}
steps:
- name: Extract metadata from tag
id: meta
run: |
TAG="${GITHUB_REF_NAME}"
VERSION="${TAG#iii/v}"
if [[ "$VERSION" =~ -dry-run\.[0-9]+$ ]]; then
echo "dry_run=true" >> "$GITHUB_OUTPUT"
echo "is_prerelease=true" >> "$GITHUB_OUTPUT"
echo "npm_tag=dry-run" >> "$GITHUB_OUTPUT"
elif [[ "$VERSION" =~ -([a-z]+)\.[0-9]+$ ]]; then
LABEL="${BASH_REMATCH[1]}"
echo "dry_run=false" >> "$GITHUB_OUTPUT"
echo "is_prerelease=true" >> "$GITHUB_OUTPUT"
echo "npm_tag=$LABEL" >> "$GITHUB_OUTPUT"
else
echo "dry_run=false" >> "$GITHUB_OUTPUT"
echo "is_prerelease=false" >> "$GITHUB_OUTPUT"
echo "npm_tag=latest" >> "$GITHUB_OUTPUT"
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "::notice::iii release — tag=$TAG version=$VERSION"
- name: Post initial Slack message
id: slack
continue-on-error: true
uses: slackapi/slack-github-action@v2.0.0
with:
method: chat.postMessage
token: ${{ secrets.SLACK_BOT_TOKEN }}
payload: |
channel: ${{ secrets.SLACK_CHANNEL_ID }}
text: "Release started"
blocks:
- type: "section"
text:
type: "mrkdwn"
text: "${{ steps.meta.outputs.dry_run == 'true' && ':test_tube: *Release Pipeline (Dry Run)* :hourglass_flowing_sand:' || '*Release Pipeline* :hourglass_flowing_sand:' }}\niii v${{ steps.meta.outputs.version }}"
- type: "context"
elements:
- type: "mrkdwn"
text: "Triggered by ${{ github.actor }} | <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Workflow>"
# ──────────────────────────────────────────────────────────────
# GitHub Release
# ──────────────────────────────────────────────────────────────
create-iii-release:
name: Create iii GitHub Release
needs: [setup]
if: needs.setup.outputs.dry_run != 'true'
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Generate token
id: generate_token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.III_CI_APP_ID }}
private-key: ${{ secrets.III_CI_APP_PRIVATE_KEY }}
- uses: actions/checkout@v4
with:
token: ${{ steps.generate_token.outputs.token }}
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
token: ${{ steps.generate_token.outputs.token }}
tag_name: ${{ needs.setup.outputs.tag }}
name: iii ${{ needs.setup.outputs.version }}
draft: false
prerelease: ${{ needs.setup.outputs.is_prerelease == 'true' }}
generate_release_notes: true
# ──────────────────────────────────────────────────────────────
# Init Binary (cross-compiled for VM guests)
# ──────────────────────────────────────────────────────────────
init-build:
name: Build iii-init (${{ matrix.target }})
needs: [setup, create-iii-release]
if: ${{ !failure() && !cancelled() }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- target: x86_64-unknown-linux-musl
publish_aliases: 'x86_64-unknown-linux-gnu x86_64-apple-darwin'
- target: aarch64-unknown-linux-musl
publish_aliases: 'aarch64-unknown-linux-gnu aarch64-apple-darwin'
steps:
- name: Generate token
id: generate_token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.III_CI_APP_ID }}
private-key: ${{ secrets.III_CI_APP_PRIVATE_KEY }}
- uses: actions/checkout@v4
with:
token: ${{ steps.generate_token.outputs.token }}
- name: Install cross-compilation tools
run: |
sudo apt-get update
case "${{ matrix.target }}" in
x86_64-unknown-linux-musl)
sudo apt-get install -y musl-tools
;;
aarch64-unknown-linux-musl)
sudo apt-get install -y musl-tools
;;
esac
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Cache cargo registry & build
uses: Swatinem/rust-cache@v2
with:
key: iii-init-${{ matrix.target }}
- name: Build iii-init
run: cargo build -p iii-init --target ${{ matrix.target }} --release
- name: Upload init binary as workflow artifact
uses: actions/upload-artifact@v4
with:
name: iii-init-${{ matrix.target }}
path: target/${{ matrix.target }}/release/iii-init
retention-days: 1
- name: Package and upload to release
if: needs.setup.outputs.dry_run != 'true'
run: |
cd target/${{ matrix.target }}/release
# Primary asset (matches the build target)
tar czf iii-init-${{ matrix.target }}.tar.gz iii-init
sha256sum iii-init-${{ matrix.target }}.tar.gz | awk '{print $1}' > iii-init-${{ matrix.target }}.sha256
# Alias assets (e.g., aarch64-musl binary published under gnu name
# so that `iii update` on aarch64-unknown-linux-gnu finds a match)
ALIASES="${{ matrix.publish_aliases }}"
for alias in $ALIASES; do
cp iii-init-${{ matrix.target }}.tar.gz "iii-init-${alias}.tar.gz"
sha256sum "iii-init-${alias}.tar.gz" | awk '{print $1}' > "iii-init-${alias}.sha256"
done
- name: Upload release assets
if: needs.setup.outputs.dry_run != 'true'
uses: softprops/action-gh-release@v2
with:
token: ${{ steps.generate_token.outputs.token }}
tag_name: ${{ needs.setup.outputs.tag }}
files: target/${{ matrix.target }}/release/iii-init-*.tar.gz,target/${{ matrix.target }}/release/iii-init-*.sha256
# ──────────────────────────────────────────────────────────────
# Firmware Assets (libkrunfw pre-built binaries)
# ──────────────────────────────────────────────────────────────
firmware-upload:
name: Upload libkrunfw firmware assets
needs: [setup, create-iii-release]
if: ${{ !failure() && !cancelled() }}
runs-on: ubuntu-latest
permissions:
contents: write
strategy:
fail-fast: false
matrix:
include:
- firmware_file: libkrunfw-darwin-aarch64.dylib
archive_name: libkrunfw-darwin-aarch64.tar.gz
publish_aliases: 'aarch64-apple-darwin'
- firmware_file: libkrunfw-linux-x86_64.so
archive_name: libkrunfw-linux-x86_64.tar.gz
publish_aliases: 'x86_64-unknown-linux-gnu x86_64-unknown-linux-musl'
- firmware_file: libkrunfw-linux-aarch64.so
archive_name: libkrunfw-linux-aarch64.tar.gz
publish_aliases: 'aarch64-unknown-linux-gnu'
steps:
- name: Generate token
id: generate_token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.III_CI_APP_ID }}
private-key: ${{ secrets.III_CI_APP_PRIVATE_KEY }}
- uses: actions/checkout@v4
with:
token: ${{ steps.generate_token.outputs.token }}
- name: Verify firmware file exists
run: |
FW_PATH="engine/firmware/${{ matrix.firmware_file }}"
if [ ! -f "$FW_PATH" ]; then
echo "::error::Firmware file not found: $FW_PATH"
echo "Ensure pre-built libkrunfw binaries are present in engine/firmware/"
exit 1
fi
echo "Found firmware: $FW_PATH ($(stat -c%s "$FW_PATH") bytes)"
- name: Package firmware archive
run: |
cd engine/firmware
# Primary archive
tar czf "${{ matrix.archive_name }}" "${{ matrix.firmware_file }}"
sha256sum "${{ matrix.archive_name }}" | awk '{print $1}' > "${{ matrix.archive_name }}.sha256"
# Alias archives for target triple resolution
ALIASES="${{ matrix.publish_aliases }}"
for alias in $ALIASES; do
ALIAS_NAME="libkrunfw-${alias}.tar.gz"
cp "${{ matrix.archive_name }}" "$ALIAS_NAME"
sha256sum "$ALIAS_NAME" | awk '{print $1}' > "${ALIAS_NAME}.sha256"
done
- name: Upload release assets
if: needs.setup.outputs.dry_run != 'true'
uses: softprops/action-gh-release@v2
with:
token: ${{ steps.generate_token.outputs.token }}
tag_name: ${{ needs.setup.outputs.tag }}
files: engine/firmware/libkrunfw-*.tar.gz,engine/firmware/libkrunfw-*.sha256
# ──────────────────────────────────────────────────────────────
# Engine Binary
# ──────────────────────────────────────────────────────────────
engine-release:
name: Engine Binary Release
needs: [setup, create-iii-release]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_rust-binary.yml
with:
bin_name: iii
manifest_path: engine/Cargo.toml
tag_name: ${{ needs.setup.outputs.tag }}
is_prerelease: ${{ needs.setup.outputs.is_prerelease == 'true' }}
skip_create_release: true
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
slack_thread_ts: ${{ needs.setup.outputs.slack_ts }}
slack_label: Engine Binary
secrets:
III_CI_APP_ID: ${{ secrets.III_CI_APP_ID }}
III_CI_APP_PRIVATE_KEY: ${{ secrets.III_CI_APP_PRIVATE_KEY }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
# ──────────────────────────────────────────────────────────────
# Worker Binary (downloaded on first use of `iii worker`)
# ──────────────────────────────────────────────────────────────
worker-release:
name: Worker Binary Release
needs: [setup, create-iii-release, init-build]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_rust-binary.yml
with:
bin_name: iii-worker
manifest_path: crates/iii-worker/Cargo.toml
tag_name: ${{ needs.setup.outputs.tag }}
is_prerelease: ${{ needs.setup.outputs.is_prerelease == 'true' }}
skip_create_release: true
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
features: embed-init,embed-libkrunfw
init_artifacts: true
targets: '["x86_64-apple-darwin","aarch64-apple-darwin","x86_64-unknown-linux-gnu","x86_64-unknown-linux-musl","aarch64-unknown-linux-gnu"]'
system_deps: libcap-ng-dev
slack_thread_ts: ${{ needs.setup.outputs.slack_ts }}
slack_label: Worker Binary
secrets:
III_CI_APP_ID: ${{ secrets.III_CI_APP_ID }}
III_CI_APP_PRIVATE_KEY: ${{ secrets.III_CI_APP_PRIVATE_KEY }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
# ──────────────────────────────────────────────────────────────
# Console Binary
# ──────────────────────────────────────────────────────────────
console-frontend:
name: Build Console Frontend
needs: [setup, create-iii-release]
if: ${{ !failure() && !cancelled() }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
run_install: false
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build frontend for binary embedding
run: pnpm --filter console-frontend build:binary
- uses: actions/upload-artifact@v4
with:
name: console-frontend-dist
path: console/packages/console-frontend/dist-binary/
retention-days: 1
console-release:
name: Console Binary Release
needs: [setup, create-iii-release, console-frontend]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_rust-binary.yml
with:
bin_name: iii-console
manifest_path: console/packages/console-rust/Cargo.toml
tag_name: ${{ needs.setup.outputs.tag }}
is_prerelease: ${{ needs.setup.outputs.is_prerelease == 'true' }}
skip_create_release: true
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
artifact_name: console-frontend-dist
artifact_dest: console/packages/console-rust/assets/
slack_thread_ts: ${{ needs.setup.outputs.slack_ts }}
slack_label: Console Binary
secrets:
III_CI_APP_ID: ${{ secrets.III_CI_APP_ID }}
III_CI_APP_PRIVATE_KEY: ${{ secrets.III_CI_APP_PRIVATE_KEY }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
# ──────────────────────────────────────────────────────────────
# SDK Publish
# ──────────────────────────────────────────────────────────────
sdk-npm:
name: SDK Node Publish
needs: [setup, create-iii-release]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_npm.yml
with:
package_path: sdk/packages/node/iii
npm_tag: ${{ needs.setup.outputs.npm_tag }}
build_filter: iii-sdk
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
slack_thread_ts: ${{ needs.setup.outputs.slack_ts }}
slack_label: SDK Node (npm)
secrets:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
sdk-npm-browser:
name: SDK Browser Publish
needs: [setup, create-iii-release]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_npm.yml
with:
package_path: sdk/packages/node/iii-browser
npm_tag: ${{ needs.setup.outputs.npm_tag }}
build_filter: iii-browser-sdk
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
slack_thread_ts: ${{ needs.setup.outputs.slack_ts }}
slack_label: SDK Browser (npm)
secrets:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
sdk-py:
name: SDK Python Publish
needs: [setup, create-iii-release]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_py.yml
with:
package_path: sdk/packages/python/iii
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
slack_thread_ts: ${{ needs.setup.outputs.slack_ts }}
slack_label: SDK Python (pypi)
secrets:
PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
sdk-rust:
name: SDK Rust Publish
needs: [setup, create-iii-release]
if: ${{ !failure() && !cancelled() }}
uses: ./.github/workflows/_rust-cargo.yml
with:
package_path: sdk/packages/rust/iii
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
slack_thread_ts: ${{ needs.setup.outputs.slack_ts }}
slack_label: SDK Rust (cargo)
secrets:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
# ──────────────────────────────────────────────────────────────
# Docker
# ──────────────────────────────────────────────────────────────
docker-engine:
name: Docker Engine
needs: [setup, engine-release]
if: ${{ !failure() && !cancelled() && needs.setup.outputs.is_prerelease != 'true' }}
uses: ./.github/workflows/docker-engine.yml
with:
release_tag: ${{ needs.setup.outputs.tag }}
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
# ──────────────────────────────────────────────────────────────
# Homebrew
# ──────────────────────────────────────────────────────────────
homebrew-engine:
name: Homebrew Engine
needs: [setup, engine-release]
if: ${{ !failure() && !cancelled() && needs.setup.outputs.is_prerelease != 'true' }}
uses: ./.github/workflows/_homebrew.yml
with:
bin_name: iii
formula_class: Iii
formula_path: Formula/iii.rb
description: WebSocket-based process communication engine
homepage: https://github.com/iii-hq/iii
release_repo: ${{ github.repository }}
release_tag: ${{ needs.setup.outputs.tag }}
version: ${{ needs.setup.outputs.version }}
include_linux: false
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
slack_thread_ts: ${{ needs.setup.outputs.slack_ts }}
slack_label: Homebrew (iii)
secrets:
III_CI_APP_ID: ${{ secrets.III_CI_APP_ID }}
III_CI_APP_PRIVATE_KEY: ${{ secrets.III_CI_APP_PRIVATE_KEY }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
homebrew-console:
name: Homebrew Console
needs: [setup, console-release]
if: ${{ !failure() && !cancelled() && needs.setup.outputs.is_prerelease != 'true' }}
uses: ./.github/workflows/_homebrew.yml
with:
bin_name: iii-console
formula_class: IiiConsole
formula_path: Formula/iii-console.rb
description: Developer console for the iii engine
homepage: https://github.com/iii-hq/iii
release_repo: ${{ github.repository }}
release_tag: ${{ needs.setup.outputs.tag }}
version: ${{ needs.setup.outputs.version }}
include_linux: true
dry_run: ${{ needs.setup.outputs.dry_run == 'true' }}
slack_thread_ts: ${{ needs.setup.outputs.slack_ts }}
slack_label: Homebrew (iii-console)
secrets:
III_CI_APP_ID: ${{ secrets.III_CI_APP_ID }}
III_CI_APP_PRIVATE_KEY: ${{ secrets.III_CI_APP_PRIVATE_KEY }}
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
# ──────────────────────────────────────────────────────────────
# Notification: Complete
# ──────────────────────────────────────────────────────────────
notify-complete:
name: Release Complete
needs:
- setup
- init-build
- firmware-upload
- engine-release
- worker-release
- console-release
- sdk-npm
- sdk-npm-browser
- sdk-py
- sdk-rust
- docker-engine
- homebrew-engine
- homebrew-console
runs-on: ubuntu-latest
if: always()
steps:
- name: Determine overall status
id: status
env:
VERSION: ${{ needs.setup.outputs.version }}
IS_PRERELEASE: ${{ needs.setup.outputs.is_prerelease }}
DRY_RUN: ${{ needs.setup.outputs.dry_run }}
INIT_RESULT: ${{ needs.init-build.result }}
FIRMWARE_RESULT: ${{ needs.firmware-upload.result }}
ENGINE_RESULT: ${{ needs.engine-release.result }}
WORKER_RESULT: ${{ needs.worker-release.result }}
CONSOLE_RESULT: ${{ needs.console-release.result }}
SDK_NPM_RESULT: ${{ needs.sdk-npm.result }}
SDK_NPM_BROWSER_RESULT: ${{ needs.sdk-npm-browser.result }}
SDK_PY_RESULT: ${{ needs.sdk-py.result }}
SDK_RUST_RESULT: ${{ needs.sdk-rust.result }}
DOCKER_RESULT: ${{ needs.docker-engine.result }}
BREW_ENGINE_RESULT: ${{ needs.homebrew-engine.result }}
BREW_CONSOLE_RESULT: ${{ needs.homebrew-console.result }}
run: |
icon() {
case "$1" in
success) echo ":large_green_circle:" ;;
skipped) echo ":fast_forward:" ;;
*) echo ":red_circle:" ;;
esac
}
LINES=""
OVERALL="success"
LINES="$LINES$(icon "$INIT_RESULT") Init Binary\n"
LINES="$LINES$(icon "$FIRMWARE_RESULT") Firmware Assets\n"
LINES="$LINES$(icon "$ENGINE_RESULT") Engine Binary\n"
LINES="$LINES$(icon "$WORKER_RESULT") Worker Binary\n"
LINES="$LINES$(icon "$CONSOLE_RESULT") Console Binary\n"
LINES="$LINES$(icon "$SDK_NPM_RESULT") SDK Node\n"
LINES="$LINES$(icon "$SDK_NPM_BROWSER_RESULT") SDK Browser\n"
LINES="$LINES$(icon "$SDK_PY_RESULT") SDK Python\n"
LINES="$LINES$(icon "$SDK_RUST_RESULT") SDK Rust\n"
if [[ "$IS_PRERELEASE" != "true" ]]; then
LINES="$LINES$(icon "$DOCKER_RESULT") Docker\n"
LINES="$LINES$(icon "$BREW_ENGINE_RESULT") Homebrew (iii)\n"
LINES="$LINES$(icon "$BREW_CONSOLE_RESULT") Homebrew (iii-console)\n"
fi
for r in "$INIT_RESULT" "$FIRMWARE_RESULT" "$ENGINE_RESULT" "$WORKER_RESULT" "$CONSOLE_RESULT" "$SDK_NPM_RESULT" "$SDK_NPM_BROWSER_RESULT" "$SDK_PY_RESULT" "$SDK_RUST_RESULT"; do
[[ "$r" != "success" && "$r" != "skipped" ]] && OVERALL="failure"
done
SUMMARY="iii v${VERSION}"
[[ "$DRY_RUN" == "true" ]] && SUMMARY="[DRY RUN] $SUMMARY"
echo "lines=$LINES" >> "$GITHUB_OUTPUT"
echo "overall=$OVERALL" >> "$GITHUB_OUTPUT"
echo "summary=$SUMMARY" >> "$GITHUB_OUTPUT"
- name: Update Slack parent message
if: needs.setup.outputs.slack_ts != ''
continue-on-error: true
uses: slackapi/slack-github-action@v2.0.0
with:
method: chat.update
token: ${{ secrets.SLACK_BOT_TOKEN }}
payload: |
channel: ${{ secrets.SLACK_CHANNEL_ID }}
ts: ${{ needs.setup.outputs.slack_ts }}
text: "Release ${{ steps.status.outputs.overall }}"
blocks:
- type: "section"
text:
type: "mrkdwn"
text: "${{ needs.setup.outputs.dry_run == 'true' && ':test_tube: *Release Pipeline (Dry Run)*' || '*Release Pipeline*' }} ${{ steps.status.outputs.overall == 'success' && ':large_green_circle:' || ':red_circle:' }}\n${{ steps.status.outputs.summary }}\n\n${{ steps.status.outputs.lines }}"
- type: "context"
elements:
- type: "mrkdwn"
text: "Triggered by ${{ github.actor }} | <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Workflow>"