From a968c57ecefd13a4335591ea186654a2a72ae819 Mon Sep 17 00:00:00 2001 From: David Slusser Date: Tue, 29 Jul 2025 19:19:30 -0700 Subject: [PATCH 1/4] testing release --- .../workflows/build_and_publish_docker.yaml | 64 ++++++++++--------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/.github/workflows/build_and_publish_docker.yaml b/.github/workflows/build_and_publish_docker.yaml index 22ed477..09b62d5 100644 --- a/.github/workflows/build_and_publish_docker.yaml +++ b/.github/workflows/build_and_publish_docker.yaml @@ -1,4 +1,4 @@ -name: Build and Push Docker Image +name: Build and Publish Docker Image on: release: @@ -15,14 +15,14 @@ on: env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} + IMAGE_NAME_LOWER: ${{ github.repository_owner }}/${{ github.event.repository.name }} jobs: build-and-push: name: Build and Push Docker Image runs-on: ubuntu-latest - permissions: - contents: read + contents: write packages: write steps: @@ -32,46 +32,52 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Log in to GitHub Container Registry + - name: Log in to GHCR uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Extract tag name - id: vars + - name: Extract tag + id: extract_tag run: | - TAG_NAME=${GITHUB_REF#refs/tags/} - IMAGE_NAME_LOWER=$(echo "${GITHUB_REPOSITORY}" | tr '[:upper:]' '[:lower:]') - echo "tag=${TAG_NAME}" >> $GITHUB_OUTPUT - echo "image_name=${IMAGE_NAME_LOWER}" >> $GITHUB_OUTPUT - - if [[ "$TAG_NAME" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "latest=true" >> $GITHUB_OUTPUT - else - echo "latest=false" >> $GITHUB_OUTPUT - fi + VERSION_TAG=${GITHUB_REF##*/} + echo "version=$VERSION_TAG" >> "$GITHUB_OUTPUT" + echo "image=ghcr.io/${{ env.IMAGE_NAME_LOWER }}" >> "$GITHUB_OUTPUT" - - name: Build and push Docker image + - name: Build and Push Docker image uses: docker/build-push-action@v5 with: context: . - file: ./src/docker/Dockerfile + file: src/docker/Dockerfile push: true tags: | - ghcr.io/${{ steps.vars.outputs.image_name }}:${{ steps.vars.outputs.tag }} - ${{ steps.vars.outputs.latest == 'true' && format('ghcr.io/{0}:latest', steps.vars.outputs.image_name) || '' }} + ${{ steps.extract_tag.outputs.image }}:${{ steps.extract_tag.outputs.version }} + ${{ steps.extract_tag.outputs.image }}:latest labels: | org.opencontainers.image.source=${{ github.repositoryUrl }} - org.opencontainers.image.version=${{ steps.vars.outputs.tag }} - org.opencontainers.image.created=${{ github.event.head_commit.timestamp || github.event.release.published_at || github.event.repository.updated_at }} + org.opencontainers.image.version=${{ steps.extract_tag.outputs.version }} org.opencontainers.image.revision=${{ github.sha }} - org.opencontainers.image.title=${{ github.repository }} - - name: Confirm tags pushed - run: | - echo "Published ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.vars.outputs.tag }}" - if [ "${{ steps.vars.outputs.latest }}" = "true" ]; then - echo "Also tagged as :latest" - fi + - name: Generate Release Notes + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.extract_tag.outputs.version }} + generate_release_notes: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Generate CHANGELOG.md + uses: heinrichreimer/action-github-changelog-generator@v2.3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + output: CHANGELOG.md + tag: ${{ steps.extract_tag.outputs.version }} + + - name: Commit updated CHANGELOG.md + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "chore: update CHANGELOG.md for ${{ steps.extract_tag.outputs.version }}" + branch: main + file_pattern: CHANGELOG.md From 136f9ca5b527f226640483614a3a1ca3efc337dc Mon Sep 17 00:00:00 2001 From: David Slusser Date: Tue, 29 Jul 2025 19:29:43 -0700 Subject: [PATCH 2/4] adding release workflow --- .../workflows/build_and_publish_docker.yaml | 67 ++++++++++--------- .github/workflows/release.yaml | 55 +++++++++++++++ 2 files changed, 89 insertions(+), 33 deletions(-) create mode 100644 .github/workflows/release.yaml diff --git a/.github/workflows/build_and_publish_docker.yaml b/.github/workflows/build_and_publish_docker.yaml index 09b62d5..174dfb3 100644 --- a/.github/workflows/build_and_publish_docker.yaml +++ b/.github/workflows/build_and_publish_docker.yaml @@ -1,4 +1,4 @@ -name: Build and Publish Docker Image +name: Build and Push Docker Image on: release: @@ -15,14 +15,14 @@ on: env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} - IMAGE_NAME_LOWER: ${{ github.repository_owner }}/${{ github.event.repository.name }} jobs: build-and-push: name: Build and Push Docker Image runs-on: ubuntu-latest + permissions: - contents: write + contents: read packages: write steps: @@ -32,52 +32,53 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Log in to GHCR + - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Extract tag - id: extract_tag + - name: Extract tag name + id: vars run: | - VERSION_TAG=${GITHUB_REF##*/} - echo "version=$VERSION_TAG" >> "$GITHUB_OUTPUT" - echo "image=ghcr.io/${{ env.IMAGE_NAME_LOWER }}" >> "$GITHUB_OUTPUT" + TAG_NAME=${GITHUB_REF#refs/tags/} + IMAGE_NAME_LOWER=$(echo "${GITHUB_REPOSITORY}" | tr '[:upper:]' '[:lower:]') + echo "tag=${TAG_NAME}" >> $GITHUB_OUTPUT + echo "image_name=${IMAGE_NAME_LOWER}" >> $GITHUB_OUTPUT + + if [[ "$TAG_NAME" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "latest=true" >> $GITHUB_OUTPUT + else + echo "latest=false" >> $GITHUB_OUTPUT + fi - - name: Build and Push Docker image + - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . - file: src/docker/Dockerfile + file: ./src/docker/Dockerfile push: true tags: | - ${{ steps.extract_tag.outputs.image }}:${{ steps.extract_tag.outputs.version }} - ${{ steps.extract_tag.outputs.image }}:latest + ghcr.io/${{ steps.vars.outputs.image_name }}:${{ steps.vars.outputs.tag }} + ${{ steps.vars.outputs.latest == 'true' && format('ghcr.io/{0}:latest', steps.vars.outputs.image_name) || '' }} labels: | org.opencontainers.image.source=${{ github.repositoryUrl }} - org.opencontainers.image.version=${{ steps.extract_tag.outputs.version }} + org.opencontainers.image.version=${{ steps.vars.outputs.tag }} + org.opencontainers.image.created=${{ github.event.head_commit.timestamp || github.event.release.published_at || github.event.repository.updated_at }} org.opencontainers.image.revision=${{ github.sha }} + org.opencontainers.image.title=${{ github.repository }} - - name: Generate Release Notes - uses: softprops/action-gh-release@v2 + - name: Confirm tags pushed + run: | + echo "Published ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.vars.outputs.tag }}" + if [ "${{ steps.vars.outputs.latest }}" = "true" ]; then + echo "Also tagged as :latest" + fi + - name: Create GitHub Release + if: startsWith(github.ref, 'refs/tags/') && steps.vars.outputs.latest == 'true' + uses: softprops/action-gh-release@v1 with: - tag_name: ${{ steps.extract_tag.outputs.version }} + tag_name: ${{ steps.vars.outputs.tag }} + name: Release ${{ steps.vars.outputs.tag }} generate_release_notes: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Generate CHANGELOG.md - uses: heinrichreimer/action-github-changelog-generator@v2.3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - output: CHANGELOG.md - tag: ${{ steps.extract_tag.outputs.version }} - - - name: Commit updated CHANGELOG.md - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: "chore: update CHANGELOG.md for ${{ steps.extract_tag.outputs.version }}" - branch: main - file_pattern: CHANGELOG.md diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..3c687e6 --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,55 @@ +name: Release and Changelog + +on: + release: + types: [created] + workflow_dispatch: + push: + tags: + - '[0-9]+.[0-9]+.[0-9]+' + +permissions: + contents: write + pull-requests: write + +jobs: + generate-release: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Git + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + + - name: Get latest release tag + id: get_tag + run: echo "tag=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT" + + - name: Generate release notes + id: notes + uses: actions/github-script@v7 + with: + script: | + const { data: release } = await github.rest.repos.getReleaseByTag({ + owner: context.repo.owner, + repo: context.repo.repo, + tag: process.env.GITHUB_REF_NAME, + }); + + const notes = release.body || 'No release notes provided.'; + return { notes }; + + - name: Append to CHANGELOG.md + run: | + echo "## ${{ steps.get_tag.outputs.tag }}" >> CHANGELOG.md + echo "" >> CHANGELOG.md + echo "${{ steps.notes.outputs.result.notes }}" >> CHANGELOG.md + echo "" >> CHANGELOG.md + git add CHANGELOG.md + git commit -m "docs: update CHANGELOG for ${{ steps.get_tag.outputs.tag }}" + git push origin HEAD + From 947a8a15bf972d967c71a68d4234be956bb901c2 Mon Sep 17 00:00:00 2001 From: David Slusser Date: Tue, 29 Jul 2025 19:33:46 -0700 Subject: [PATCH 3/4] adding workflow names --- .github/workflows/bandit.yaml | 2 ++ .github/workflows/isort.yaml | 2 ++ .github/workflows/mypy.yaml | 2 ++ .github/workflows/pytest.yaml | 2 ++ .github/workflows/radon.yaml | 2 ++ .github/workflows/ruff_format.yaml | 2 ++ .github/workflows/ruff_lint.yaml | 2 ++ 7 files changed, 14 insertions(+) diff --git a/.github/workflows/bandit.yaml b/.github/workflows/bandit.yaml index 0abee46..28d261b 100644 --- a/.github/workflows/bandit.yaml +++ b/.github/workflows/bandit.yaml @@ -1,3 +1,5 @@ +name: Bandit Security Analysis + on: [push] jobs: diff --git a/.github/workflows/isort.yaml b/.github/workflows/isort.yaml index d483f52..2364170 100644 --- a/.github/workflows/isort.yaml +++ b/.github/workflows/isort.yaml @@ -1,3 +1,5 @@ +name: isort + on: [push] jobs: diff --git a/.github/workflows/mypy.yaml b/.github/workflows/mypy.yaml index 0b586c3..cd94de4 100644 --- a/.github/workflows/mypy.yaml +++ b/.github/workflows/mypy.yaml @@ -1,3 +1,5 @@ +name: mypy + on: [push] jobs: diff --git a/.github/workflows/pytest.yaml b/.github/workflows/pytest.yaml index 11c2b50..2f09f02 100644 --- a/.github/workflows/pytest.yaml +++ b/.github/workflows/pytest.yaml @@ -1,3 +1,5 @@ +name: pytest + on: [push] jobs: diff --git a/.github/workflows/radon.yaml b/.github/workflows/radon.yaml index 7bb495a..31a1fde 100644 --- a/.github/workflows/radon.yaml +++ b/.github/workflows/radon.yaml @@ -1,3 +1,5 @@ +name: radon + on: [push] jobs: diff --git a/.github/workflows/ruff_format.yaml b/.github/workflows/ruff_format.yaml index 280f8a8..eff2b7a 100644 --- a/.github/workflows/ruff_format.yaml +++ b/.github/workflows/ruff_format.yaml @@ -1,3 +1,5 @@ +name: ruff_format + on: [push] jobs: diff --git a/.github/workflows/ruff_lint.yaml b/.github/workflows/ruff_lint.yaml index 4978af7..1c88f6b 100644 --- a/.github/workflows/ruff_lint.yaml +++ b/.github/workflows/ruff_lint.yaml @@ -1,3 +1,5 @@ +name: ruff_lint + on: [push] jobs: From 781465281dd956abe7d00720d18d2bef8787479b Mon Sep 17 00:00:00 2001 From: David Slusser Date: Tue, 29 Jul 2025 19:40:12 -0700 Subject: [PATCH 4/4] testing workflow --- .github/workflows/release.yaml | 38 ++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3c687e6..d8681d1 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -10,14 +10,13 @@ on: permissions: contents: write - pull-requests: write jobs: - generate-release: + release: runs-on: ubuntu-latest steps: - - name: Checkout repository + - name: Checkout code uses: actions/checkout@v4 - name: Set up Git @@ -25,31 +24,38 @@ jobs: git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - - name: Get latest release tag - id: get_tag - run: echo "tag=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT" + - name: Get tag name + id: tag + run: echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Generate release notes - id: notes + id: release_notes uses: actions/github-script@v7 with: script: | - const { data: release } = await github.rest.repos.getReleaseByTag({ + const tag = process.env.GITHUB_REF_NAME; + const { data: commits } = await github.rest.repos.listCommits({ owner: context.repo.owner, repo: context.repo.repo, - tag: process.env.GITHUB_REF_NAME, + per_page: 20, }); - const notes = release.body || 'No release notes provided.'; - return { notes }; + const notes = commits.map(c => `- ${c.commit.message.split('\n')[0]}`).join('\n'); + return notes; + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.tag.outputs.tag }} + name: Release ${{ steps.tag.outputs.tag }} + body: ${{ steps.release_notes.outputs.result }} - - name: Append to CHANGELOG.md + - name: Update CHANGELOG.md run: | - echo "## ${{ steps.get_tag.outputs.tag }}" >> CHANGELOG.md + echo "## ${{ steps.tag.outputs.tag }}" >> CHANGELOG.md echo "" >> CHANGELOG.md - echo "${{ steps.notes.outputs.result.notes }}" >> CHANGELOG.md + echo "${{ steps.release_notes.outputs.result }}" >> CHANGELOG.md echo "" >> CHANGELOG.md git add CHANGELOG.md - git commit -m "docs: update CHANGELOG for ${{ steps.get_tag.outputs.tag }}" + git commit -m "docs: update CHANGELOG for ${{ steps.tag.outputs.tag }}" git push origin HEAD -