Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
137 commits
Select commit Hold shift + click to select a range
7c4a8aa
feat: add narrator logout and move login to top-level /login/ URL
AevumDecessus Jun 18, 2026
68093f2
ci: add GitHub Actions workflows for dev and prod Docker image builds
AevumDecessus Jun 18, 2026
3ce0cc3
Merge pull request #1 from AevumDecessus/ci/docker-workflows
AevumDecessus Jun 18, 2026
77042fa
docs: document signed URL approach and unified storage for audio deli…
AevumDecessus Jun 18, 2026
a54f93b
Merge pull request #12 from AevumDecessus/docs/signed-url-playback
AevumDecessus Jun 18, 2026
e411665
Added CSRF_ORIGIN setting, and sample env file
AevumDecessus Jun 19, 2026
862a56f
Add narrator dashboard at /portal/
AevumDecessus Jun 19, 2026
edb623c
Move all CSS to a static file
AevumDecessus Jun 19, 2026
e518e81
Fix max_narrators check when set to 0
AevumDecessus Jun 19, 2026
81e9fc9
Show max narrators count on dashboard when set
AevumDecessus Jun 19, 2026
187672d
Merge pull request #17 from AevumDecessus/dev_setup
AevumDecessus Jun 19, 2026
82158ea
Add pre-flight checklist before recording
AevumDecessus Jun 22, 2026
31ffb96
Highlight missed checklist items and show error on incomplete submission
AevumDecessus Jun 22, 2026
74a07ab
Apply Fragforce brand color palette (60/30/10 split)
AevumDecessus Jun 22, 2026
c80b088
Refactor CSS to use custom properties for all colors
AevumDecessus Jun 22, 2026
427f26b
Merge pull request #18 from AevumDecessus/narrator-preflight
AevumDecessus Jun 22, 2026
ac29e2b
Add whitenoise for static file serving in production
AevumDecessus Jun 22, 2026
95116c8
Add SSL security settings gated on SECURE_SSL env var
AevumDecessus Jun 22, 2026
b589497
Add /healthz/ endpoint restricted to internal networks
AevumDecessus Jun 22, 2026
0d0f7b3
Enable persistent database connections (CONN_MAX_AGE=600)
AevumDecessus Jun 22, 2026
f85ff14
Configure media file storage and serving
AevumDecessus Jun 22, 2026
9b8f905
Merge pull request #19 from AevumDecessus/deployment-hardening
AevumDecessus Jun 22, 2026
845d9bb
Fix collectstatic in Docker build by providing dummy env vars
AevumDecessus Jun 22, 2026
293b6b8
Merge pull request #20 from AevumDecessus/fix/collectstatic-build
AevumDecessus Jun 22, 2026
c7629aa
Run container as non-root user and add .dockerignore
AevumDecessus Jun 22, 2026
501e162
Add explicit HTTP method restrictions to all views
AevumDecessus Jun 22, 2026
e0b917f
Resolve N+1 query in dashboard view
AevumDecessus Jun 22, 2026
76432e0
Merge pull request #21 from AevumDecessus/sonarcloud-fixes
AevumDecessus Jun 22, 2026
2783bf5
Disable uv cache in container
AevumDecessus Jun 22, 2026
4172335
Merge pull request #22 from AevumDecessus/dev
AevumDecessus Jun 22, 2026
0b683ca
Add recording preparation page
AevumDecessus Jun 22, 2026
885d2a8
Guard start recording button when mic access denied
AevumDecessus Jun 22, 2026
f4104b2
Merge pull request #23 from AevumDecessus/recording-preparation
AevumDecessus Jun 22, 2026
9b513f2
Implement browser-based recording workflow
AevumDecessus Jun 23, 2026
437efee
Add noscript notice on recording page
AevumDecessus Jun 23, 2026
0d15521
Require preflight completion before accessing the record page
AevumDecessus Jun 23, 2026
698024f
Merge pull request #25 from AevumDecessus/recording-workflow
AevumDecessus Jun 23, 2026
0cc9c3f
Add flagged_for_review and flag_reason fields to Recording
AevumDecessus Jun 23, 2026
1183fb7
Add recording detail view with flag-for-review form
AevumDecessus Jun 23, 2026
70b1c7d
Show flagged_for_review in admin with list filter
AevumDecessus Jun 23, 2026
c7f89bb
Delete audio file from disk when a Recording is deleted
AevumDecessus Jun 23, 2026
324d267
Redirect to recording detail after upload and add progress bar
AevumDecessus Jun 23, 2026
f6f1446
Add upload progress bar styles
AevumDecessus Jun 23, 2026
1cad64b
Add narrator profile page
AevumDecessus Jun 23, 2026
c0224f1
Improve upload error handling with user-friendly messages
AevumDecessus Jun 23, 2026
72a731c
Fix visited link color on buttons
AevumDecessus Jun 23, 2026
4e8e0d4
Move Edit profile link inline with greeting
AevumDecessus Jun 23, 2026
3a1e8af
Merge pull request #26 from AevumDecessus/narrator-recording-review
AevumDecessus Jun 23, 2026
7b77b20
Serve audio files with Range request support for seeking
AevumDecessus Jun 23, 2026
a176b99
Merge pull request #27 from AevumDecessus/audio-seeking-support
AevumDecessus Jun 23, 2026
14aa72b
Display recording duration as mm:ss instead of raw seconds
AevumDecessus Jun 23, 2026
2a2a00e
Merge pull request #28 from AevumDecessus/fix-audio-duration-display
AevumDecessus Jun 23, 2026
3ea5e18
Use explicit prefixes for book URL patterns
AevumDecessus Jun 23, 2026
c6fc60c
Merge pull request #29 from AevumDecessus/fix-audio-url-routing
AevumDecessus Jun 23, 2026
486cd80
Add status field and processing paths to Recording model
AevumDecessus Jun 24, 2026
84bbac7
Add recording remux processing module
AevumDecessus Jun 24, 2026
a8f58fe
Wire up remux pipeline in views
AevumDecessus Jun 24, 2026
4b7a582
Recover stuck recordings on app startup
AevumDecessus Jun 24, 2026
7401c4e
Clean up finalized and processing files on recording delete
AevumDecessus Jun 24, 2026
f08de58
Add status display and retry action to recording admin
AevumDecessus Jun 24, 2026
0e07edc
Show recording processing status in narrator UI
AevumDecessus Jun 24, 2026
3905cc4
Install ffmpeg and create media directories in Docker image
AevumDecessus Jun 24, 2026
a008227
Fix admin retry action re-evaluating queryset after update
AevumDecessus Jun 24, 2026
7c8f9d2
Merge pull request #30 from AevumDecessus/recording-remux-pipeline
AevumDecessus Jun 24, 2026
314ca63
Remove processing directory cleanup from startup recovery
AevumDecessus Jun 24, 2026
cbe8237
Merge pull request #31 from AevumDecessus/fix-remux-recovery-race
AevumDecessus Jun 24, 2026
d6c6c7f
Use SELECT FOR UPDATE SKIP LOCKED for remux claim
AevumDecessus Jun 24, 2026
dd17674
Merge pull request #32 from fragforce/fix-remux-claim-race
AevumDecessus Jun 24, 2026
255142b
Add short codes and auto-generated passwords to QR codes
AevumDecessus Jun 24, 2026
3038427
Add QR code generation module with qrcode[pil] dependency
AevumDecessus Jun 24, 2026
62e45e7
Add QR code views, short URL redirect, and printable sheet
AevumDecessus Jun 24, 2026
7446db0
Auto-create QR codes on remux success, add admin QR links
AevumDecessus Jun 24, 2026
9298317
Merge pull request #33 from AevumDecessus/qr-code-generation
AevumDecessus Jun 24, 2026
04e0713
Make QR password entry case-insensitive
AevumDecessus Jun 25, 2026
ed4e9db
Disable browser caching on QR image endpoints
AevumDecessus Jun 29, 2026
102d0af
Enforce license expiry at playback time
AevumDecessus Jun 29, 2026
29a052f
Add password attempt rate limiting on playback page
AevumDecessus Jun 29, 2026
820edbc
Validate recording duration bounds on upload
AevumDecessus Jun 29, 2026
7ba2ef8
Fix file handle leak in range-request audio serving
AevumDecessus Jun 29, 2026
44a2fa2
Add rate limiting to passphrase login and event registration
AevumDecessus Jun 29, 2026
82d7a19
Validate attestation text length on upload
AevumDecessus Jun 29, 2026
3f42416
Enforce upload size limit with user-facing error
AevumDecessus Jun 29, 2026
0670b1b
Set session expiry to 7 days with rolling renewal
AevumDecessus Jun 29, 2026
00e7181
Add migration to sync QRCode field defaults with model
AevumDecessus Jun 29, 2026
7837c5c
Merge pull request #34 from AevumDecessus/feedback-improvements
AevumDecessus Jun 29, 2026
d28a95f
Add CI workflows for linting, tests, coverage, and SonarCloud
AevumDecessus Jun 29, 2026
550cb81
Update lockfile with coverage dependency
AevumDecessus Jun 29, 2026
5d1f4af
Fix lint issues and exclude migrations from ruff
AevumDecessus Jun 29, 2026
39a1876
Fix setup-uv action pin to v8.2.0
AevumDecessus Jun 29, 2026
56663df
Merge pull request #35 from AevumDecessus/ci
AevumDecessus Jun 29, 2026
98f65da
Exclude Django templates from SonarCloud JS analysis
AevumDecessus Jun 29, 2026
b9296d3
Merge pull request #36 from AevumDecessus/fix-sonar-templates
AevumDecessus Jun 29, 2026
14f4eb7
feat: configure per-app test package structure
AevumDecessus Jun 29, 2026
39814e1
feat: add comprehensive test suite across all apps
AevumDecessus Jun 29, 2026
32558a5
fix: block healthz access from reverse proxy
AevumDecessus Jun 29, 2026
bd15bf6
Merge pull request #37 from AevumDecessus/test-suite
AevumDecessus Jun 29, 2026
226f3b5
fix: use frozen lockfile for CI dependency install
AevumDecessus Jun 29, 2026
e0215d1
Use frozen lockfile for all uv commands in CI and Docker
AevumDecessus Jun 29, 2026
1741f6b
Address SonarCloud credential and log injection findings
AevumDecessus Jun 29, 2026
4e461ec
Add CODEOWNERS to protect CI and build configuration
AevumDecessus Jun 29, 2026
b8bcd23
Document fork checkout safety rationale in sonar workflow
AevumDecessus Jun 29, 2026
d04b928
Skip remux recovery during manage.py check and handle missing tables
AevumDecessus Jun 29, 2026
84dc02f
Only run remux recovery for gunicorn and runserver
AevumDecessus Jun 29, 2026
723a1e8
Merge pull request #38 from AevumDecessus/fix-sonar-ci
AevumDecessus Jun 29, 2026
bb96d64
Fix HTML accessibility and CSS deprecation warnings
AevumDecessus Jun 29, 2026
1abdafc
Extract duplicated string literals in registration views
AevumDecessus Jun 29, 2026
bec5c9b
Return consistent types from admin get_exclude methods
AevumDecessus Jun 29, 2026
88b1ddb
Merge consecutive RUN instructions in Dockerfile
AevumDecessus Jun 29, 2026
82f42a3
Reduce cognitive complexity in remux_recording
AevumDecessus Jun 29, 2026
8df678d
Reduce cognitive complexity in playback view
AevumDecessus Jun 29, 2026
f92d8e4
Reduce cognitive complexity in register_event view
AevumDecessus Jun 29, 2026
bc6ccd4
Split Dockerfile into dev and prod variants
AevumDecessus Jun 29, 2026
efb078a
Add development documentation and update README
AevumDecessus Jun 29, 2026
7457837
Correct README to match actual implementation
AevumDecessus Jun 29, 2026
81c2e8b
Merge pull request #39 from AevumDecessus/fix-reliability
AevumDecessus Jun 29, 2026
8a19988
Fix signal registration and add signal tests
AevumDecessus Jun 29, 2026
96a6add
Add admin test coverage for books and registration
AevumDecessus Jun 29, 2026
c2b6739
Add processing edge case tests
AevumDecessus Jun 29, 2026
cd5b861
Merge pull request #40 from AevumDecessus/improve-coverage
AevumDecessus Jun 29, 2026
a3cd6be
Allow narrators to re-record flagged recordings
AevumDecessus Jun 29, 2026
2f7b074
Add tests for narrator re-record flow
AevumDecessus Jun 29, 2026
47c36b7
Merge pull request #41 from AevumDecessus/narrator-rerecord
AevumDecessus Jun 29, 2026
054ffc4
Rename image workflow jobs to distinct contexts
AevumDecessus Jun 29, 2026
da1b564
Merge pull request #42 from AevumDecessus/rename-image-jobs
AevumDecessus Jun 29, 2026
2145d2f
Simplify QR password format to word-word-digits
AevumDecessus Jul 1, 2026
edc5dd0
Show narrator attribution before password entry
AevumDecessus Jul 1, 2026
d9c8960
Merge pull request #43 from AevumDecessus/simplify-passwords
AevumDecessus Jul 1, 2026
64c84cb
Bump version to 1.0.0
AevumDecessus Jul 1, 2026
e7f7f34
Add changelog for 1.0.0 MVP release
AevumDecessus Jul 1, 2026
d2f6261
Document optional environment variable overrides in env.sample
AevumDecessus Jul 1, 2026
7871027
Expand development documentation
AevumDecessus Jul 1, 2026
336ea76
Add release validation workflow for PRs to main
AevumDecessus Jul 1, 2026
0777fcc
Add automatic release creation workflow
AevumDecessus Jul 1, 2026
6460b8a
Only build prod image on release tags, not main pushes
AevumDecessus Jul 1, 2026
5f066e5
Merge pull request #44 from AevumDecessus/bump-version-1.0.0
AevumDecessus Jul 1, 2026
3cefb08
Fix CodeQL security alerts
AevumDecessus Jul 1, 2026
b79e7ab
Merge pull request #46 from AevumDecessus/fix-codeql-alerts
AevumDecessus Jul 1, 2026
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
12 changes: 12 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
.env
.env.*
.git
.gitignore
.venv
__pycache__
*.pyc
staticfiles/
media/
.ruff_cache/
.pytest_cache/
.mypy_cache/
7 changes: 7 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/.github/ @fragforce/web-team
/Dockerfile @fragforce/web-team
/Dockerfile.prod @fragforce/web-team
/compose.yaml @fragforce/web-team
/sonar-project.properties @fragforce/web-team
/pyproject.toml @fragforce/web-team
/uv.lock @fragforce/web-team
42 changes: 42 additions & 0 deletions .github/workflows/codeql.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: CodeQL

on:
pull_request:
branches:
- dev
- main
push:
branches:
- dev
- main

jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
actions: read

strategy:
fail-fast: false
matrix:
language: ['python', 'javascript', 'actions']

steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

- name: Initialize CodeQL
uses: github/codeql-action/init@1a818fd5f97ed0ee9a823421bd5b171add01227f # v4.36.2
with:
languages: ${{ matrix.language }}

- name: Autobuild
uses: github/codeql-action/autobuild@1a818fd5f97ed0ee9a823421bd5b171add01227f # v4.36.2

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@1a818fd5f97ed0ee9a823421bd5b171add01227f # v4.36.2
with:
category: "/language:${{ matrix.language }}"
91 changes: 91 additions & 0 deletions .github/workflows/coverage.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: Coverage

on:
push:
branches:
- dev
- master
pull_request:

jobs:
coverage:
name: Lint and test with coverage
runs-on: ubuntu-latest
permissions:
contents: read

services:
postgres:
image: postgres:18.3
env:
POSTGRES_DB: fragforce_read_test
POSTGRES_PASSWORD: insecure
POSTGRES_HOST_AUTH_METHOD: trust
options: >-
--health-cmd pg_isready
--health-interval 5s
--health-timeout 5s
--health-retries 10
ports:
- 5432:5432

steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
fetch-depth: 0

- name: Install uv
uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0

- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: '3.13'

- name: Install dependencies
run: uv sync --frozen --extra dev

- name: Lint with ruff
run: uv run --frozen ruff check .

- name: Django system check
env:
DATABASE_URL: postgres://postgres:insecure@localhost/fragforce_read_test
SECRET_KEY: insecure-test-key-not-used-in-production
run: uv run --frozen python manage.py check

- name: Run tests with coverage
continue-on-error: true
env:
DATABASE_URL: postgres://postgres:insecure@localhost/fragforce_read_test
SECRET_KEY: insecure-test-key-not-used-in-production
run: |
uv run --frozen coverage run -m pytest --junitxml=TEST-results.xml
uv run --frozen coverage xml

- name: Save PR metadata
env:
PR_NUMBER: ${{ github.event_name == 'pull_request' && github.event.number || '' }}
COMMIT_SHA: ${{ github.sha }}
BASE_REF: ${{ github.base_ref }}
REF_NAME: ${{ github.ref_name }}
run: |
echo "$PR_NUMBER" > pr_number.txt
echo "$COMMIT_SHA" > pr_sha.txt
echo "$BASE_REF" > pr_base_ref.txt
echo "$REF_NAME" > branch_name.txt

- name: Upload coverage and test artifacts
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: coverage-report
path: |
coverage.xml
TEST-*.xml
pr_number.txt
pr_sha.txt
pr_base_ref.txt
branch_name.txt
retention-days: 1
71 changes: 71 additions & 0 deletions .github/workflows/create-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: Create Release

on:
push:
branches:
- main

jobs:
release:
name: Create GitHub release and tag
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

- name: Extract version
id: version
run: |
VERSION=$(grep '^version = ' pyproject.toml | cut -d'"' -f2)
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "tag=v$VERSION" >> "$GITHUB_OUTPUT"

- name: Check if tag exists
id: tag-check
env:
TAG: ${{ steps.version.outputs.tag }}
run: |
if git rev-parse "$TAG" >/dev/null 2>&1; then
echo "Tag $TAG already exists, skipping release"
echo "exists=true" >> "$GITHUB_OUTPUT"
else
echo "Tag $TAG does not exist, creating release"
echo "exists=false" >> "$GITHUB_OUTPUT"
fi

- name: Extract changelog
if: steps.tag-check.outputs.exists == 'false'
env:
VERSION: ${{ steps.version.outputs.version }}
run: |
# Extract changelog section for this version
awk "/^## \[$VERSION\]/,/^## \[/" CHANGELOG.md | sed '$d' | tail -n +2 > changelog.txt

echo "### Release Notes for $VERSION" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
cat changelog.txt >> "$GITHUB_STEP_SUMMARY"

- name: Create GitHub release
if: steps.tag-check.outputs.exists == 'false'
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ steps.version.outputs.tag }}
VERSION: ${{ steps.version.outputs.version }}
run: |
gh release create "$TAG" \
--title "Release $VERSION" \
--notes-file changelog.txt

echo "" >> "$GITHUB_STEP_SUMMARY"
echo "✅ Created release $TAG" >> "$GITHUB_STEP_SUMMARY"

- name: Skip summary
if: steps.tag-check.outputs.exists == 'true'
env:
TAG: ${{ steps.version.outputs.tag }}
run: |
echo "### Release Skipped" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "Tag $TAG already exists" >> "$GITHUB_STEP_SUMMARY"
52 changes: 52 additions & 0 deletions .github/workflows/dev-image.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Dev Image

on:
push:
branches:
- dev

jobs:
build:
name: Build & push dev image
if: github.repository == 'fragforce/read'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
env:
IMG_NAME: fragforce-read-dev
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
with:
buildkitd-flags: --debug

- name: Docker metadata
id: metadata
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6
with:
images: ghcr.io/${{ github.repository_owner }}/${{ env.IMG_NAME }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=ref,event=branch
type=raw,value={{sha}},enable=${{ github.ref_type != 'tag' }}

- name: Login to GitHub Container Registry
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push Docker image
uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7
with:
context: .
file: Dockerfile.prod
push: true
tags: ${{ steps.metadata.outputs.tags }}
labels: ${{ steps.metadata.outputs.labels }}
43 changes: 43 additions & 0 deletions .github/workflows/django-tests.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: Django Tests

on:
workflow_run:
workflows: ["Coverage"]
types:
- completed

jobs:
report:
name: Django Tests
if: github.repository == 'fragforce/read'
runs-on: ubuntu-latest
permissions:
contents: read
checks: write
pull-requests: write

steps:
- name: Generate app token
id: app-token
uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3
with:
client-id: ${{ secrets.FRAGFORCE_CI_APP_ID }}
private-key: ${{ secrets.FRAGFORCE_CI_PRIVATE_KEY }}

- name: Download coverage artifact
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
name: coverage-report
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{ github.event.workflow_run.id }}

- name: Report test results
uses: mikepenz/action-junit-report@bccf2e31636835cf0874589931c4116687171386 # v6.4.0
with:
report_paths: TEST-*.xml
check_name: Django Tests
commit: ${{ github.event.workflow_run.head_sha }}
token: ${{ steps.app-token.outputs.token }}
fail_on_failure: true
include_passed: true
detailed_summary: true
52 changes: 52 additions & 0 deletions .github/workflows/prod-image.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: Prod Image

on:
push:
tags:
- v*

jobs:
build:
name: Build & push prod image
if: github.repository == 'fragforce/read'
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
env:
IMG_NAME: fragforce-read-prod
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
with:
buildkitd-flags: --debug

- name: Docker metadata
id: metadata
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6
with:
images: ghcr.io/${{ github.repository_owner }}/${{ env.IMG_NAME }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=ref,event=branch
type=raw,value={{sha}},enable=${{ github.ref_type != 'tag' }}

- name: Login to GitHub Container Registry
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push Docker image
uses: docker/build-push-action@d08e5c354a6adb9ed34480a06d141179aa583294 # v7
with:
context: .
file: Dockerfile.prod
push: true
tags: ${{ steps.metadata.outputs.tags }}
labels: ${{ steps.metadata.outputs.labels }}
Loading