Skip to content

Commit

Permalink
feat!: port mutexbot actions to rust and add isolation channels (#7)
Browse files Browse the repository at this point in the history
## Problem

To send notifcations for dev and prod deployments into different channels we needed to use the isolation channel feature of mutexbot.

## Summary of changes

 - Port to rust, to make dynamic inclusion of channel isolation parameters easier. It would've been possible to do this in bash, but I'm confident that the static checks done by rust will help making this less error prone in the long run.
 - Support isolation_channel parameters for reserving/releasing
 - Merge `mutexbot/reserve` and `mutexbot/release` into one `mutexbot` action to dedupe code
 - Parameters change from `kebap-case` to `snake_case`, because of rust best practices. I was not able to make rust happy with `kebap-case` in parameters. If should be possible to do that by patching https://github.com/42ByteLabs/ghactions
  • Loading branch information
jcgruenhage authored Jan 16, 2025
1 parent fd3b066 commit 3a07646
Show file tree
Hide file tree
Showing 9 changed files with 2,568 additions and 111 deletions.
107 changes: 107 additions & 0 deletions .github/workflows/mutexbot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
name: MutexBot Container Image

on:
pull_request:
branches:
- main
paths:
- "mutexbot/**"
push:
branches:
- main
paths:
- "mutexbot/**"
tags:
- "mutexbot-v*.*.*"

permissions:
contents: read

env:
DOCKERHUB_REPO: neondatabase/dev-actions

jobs:
build:
runs-on: ${{ fromJson(format('["self-hosted", "{0}"]', matrix.platform == 'linux/arm64' && 'small-arm64' || 'small')) }}
outputs:
digest_arm64: ${{ steps.export_digest.outputs.digest_arm64 }}
digest_amd64: ${{ steps.export_digest.outputs.digest_amd64 }}
strategy:
fail-fast: false
matrix:
platform:
- linux/amd64
- linux/arm64
steps:
- name: Fetch mutexbot folder
uses: actions/checkout@v4
with:
sparse-checkout: mutexbot

- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.DOCKERHUB_REPO }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.NEON_DOCKERHUB_USERNAME }}
password: ${{ secrets.NEON_DOCKERHUB_PASSWORD }}

- name: Build and push by digest
id: build
uses: docker/build-push-action@v6
with:
context: mutexbot
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ env.DOCKERHUB_REPO }},push-by-digest=true,name-canonical=true,push=true

- name: Export digest
id: export_digest
run: |
arch="$(echo -n ${{ matrix.platform }} | sed -e 's/linux\///')"
digest="${{ steps.build.outputs.digest }}"
echo "digest_${arch}=${digest#sha256:}" >> "$GITHUB_OUTPUT"
merge:
runs-on: ["self-hosted", "small"]
needs:
- build
steps:
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.NEON_DOCKERHUB_USERNAME }}
password: ${{ secrets.NEON_DOCKERHUB_PASSWORD }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.DOCKERHUB_REPO }}
tags: |
# branch event
type=ref,enable=true,priority=600,prefix=mutexbot-,suffix=,event=branch
# pull request event
type=ref,enable=true,priority=600,prefix=mutexbot-pr-,suffix=,event=pr
# tags event
type=match,pattern=mutexbot-v(.*)
- name: Create manifest list and push
run: |
docker buildx imagetools create \
$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
${{ env.DOCKERHUB_REPO }}@sha256:${{ needs.build.outputs.digest_arm64 }} \
${{ env.DOCKERHUB_REPO }}@sha256:${{ needs.build.outputs.digest_amd64 }}
- name: Inspect image
run: docker buildx imagetools inspect ${{ env.DOCKERHUB_REPO }}:${{ steps.meta.outputs.version }}
1 change: 1 addition & 0 deletions mutexbot/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/target
Loading

0 comments on commit 3a07646

Please sign in to comment.