Skip to content
Merged
Show file tree
Hide file tree
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
161 changes: 161 additions & 0 deletions .github/workflows/quay.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
name: Push to Quay.io

on:
push:
tags:
- '*'

env:
REGISTRY: quay.io
REGISTRY_IMAGE: quay.io/rocketadmin/rocketadmin

jobs:
prepare:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.platforms.outputs.matrix }}
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Create matrix
id: platforms
run: |
echo "matrix=$(docker buildx bake image-all -f docker-bake.hcl --print | jq -cr '.target."image-all".platforms')" >>${GITHUB_OUTPUT}

- name: Show matrix
run: |
echo ${{ steps.platforms.outputs.matrix }}

- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY_IMAGE }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=ref,event=tag

- name: Rename meta bake definition file
run: |
mv "${{ steps.meta.outputs.bake-file }}" "/tmp/bake-meta.json"

- name: Upload meta bake definition
uses: actions/upload-artifact@v4
with:
name: bake-meta
path: /tmp/bake-meta.json
if-no-files-found: error
retention-days: 1

build:
permissions:
id-token: write
contents: read
attestations: write
runs-on: ${{ contains(matrix.platform, 'arm') && 'arm64' || 'ubuntu-latest' }}
needs:
- prepare
strategy:
fail-fast: false
matrix:
platform: ${{ fromJson(needs.prepare.outputs.matrix) }}
steps:
- name: Prepare
run: |
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV

- name: Checkout
uses: actions/checkout@v4

- name: Download meta bake definition
uses: actions/download-artifact@v4
with:
name: bake-meta
path: /tmp

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

- name: Login to Quay.io
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.QUAY_USERNAME }}
password: ${{ secrets.QUAY_PASSWORD }}

- name: Build
id: bake
uses: docker/bake-action@v5
with:
sbom: true
files: |
./docker-bake.hcl
/tmp/bake-meta.json
targets: image
set: |
*.tags=
*.platform=${{ matrix.platform }}
*.output=type=image,"name=${{ env.REGISTRY_IMAGE }}",push-by-digest=true,name-canonical=true,push=true

- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ fromJSON(steps.bake.outputs.metadata).image['containerimage.digest'] }}"
touch "/tmp/digests/${digest#sha256:}"

- name: Upload digest
uses: actions/upload-artifact@v4
with:
name: digests-${{ env.PLATFORM_PAIR }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1

- name: Attest Build Provenance
uses: actions/attest-build-provenance@v1
with:
subject-digest: "${{ fromJSON(steps.bake.outputs.metadata).image['containerimage.digest'] }}"
push-to-registry: false
subject-name: ${{ env.REGISTRY_IMAGE }}

merge:
runs-on: ubuntu-latest
needs:
- build
steps:
- name: Download meta bake definition
uses: actions/download-artifact@v4
with:
name: bake-meta
path: /tmp

- name: Download digests
uses: actions/download-artifact@v4
with:
path: /tmp/digests
pattern: digests-*
merge-multiple: true

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

- name: Login to Quay.io
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ secrets.QUAY_USERNAME }}
password: ${{ secrets.QUAY_PASSWORD }}

- name: Create manifest list and push
working-directory: /tmp/digests
run: |
docker buildx imagetools create $(jq -cr '.target."docker-metadata-action".tags | map(select(startswith("${{ env.REGISTRY_IMAGE }}")) | "-t " + .) | join(" ")' /tmp/bake-meta.json) \
$(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)

- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:$(jq -r '.target."docker-metadata-action".args.DOCKER_META_VERSION' /tmp/bake-meta.json)
177 changes: 89 additions & 88 deletions frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,90 +1,91 @@
{
"name": "dissendium-v0",
"version": "1.0.0",
"scripts": {
"ng": "ng",
"start": "node scripts/update-version.js && ng serve",
"build": "node scripts/update-version.js && ng build",
"test": "ng test",
"test:ci": "ng test --watch=false --browsers=ChromeHeadlessCustom",
"lint": "ng lint",
"e2e": "ng e2e",
"analyze": "webpack-bundle-analyzer dist/dissendium-v0/stats.json",
"build:stats": "node scripts/update-version.js && ng build --stats-json",
"update-version": "node scripts/update-version.js"
},
"private": true,
"dependencies": {
"@angular/animations": "~19.2.14",
"@angular/cdk": "~19.2.14",
"@angular/common": "~19.2.14",
"@angular/compiler": "~19.2.14",
"@angular/core": "~19.2.14",
"@angular/forms": "~19.2.14",
"@angular/material": "~19.2.14",
"@angular/platform-browser": "~19.2.14",
"@angular/platform-browser-dynamic": "~19.2.14",
"@angular/router": "~19.2.14",
"@brumeilde/ngx-theme": "^1.2.1",
"@jsonurl/jsonurl": "^1.1.8",
"@ngstack/code-editor": "^9.0.0",
"@sentry-internal/rrweb": "^2.31.0",
"@sentry/angular-ivy": "^7.116.0",
"@sentry/tracing": "^7.116.0",
"@stripe/stripe-js": "^5.3.0",
"@types/google-one-tap": "^1.2.6",
"@types/lodash": "^4.17.13",
"@zxcvbn-ts/core": "^3.0.4",
"@zxcvbn-ts/language-en": "^3.0.2",
"amplitude-js": "^8.21.9",
"angular-password-strength-meter": "npm:@eresearchqut/angular-password-strength-meter@^13.0.7",
"angulartics2": "^14.1.0",
"color-string": "^2.0.1",
"convert": "^5.12.0",
"date-fns": "^4.1.0",
"ipaddr.js": "^2.2.0",
"json5": "^2.2.3",
"libphonenumber-js": "^1.12.9",
"lodash": "^4.17.21",
"lodash-es": "^4.17.21",
"mermaid": "^11.12.1",
"monaco-editor": "0.44.0",
"ng-dynamic-component": "^10.7.0",
"ngx-cookie-service": "^19.0.0",
"ngx-markdown": "^19.1.1",
"ngx-stripe": "^19.0.0",
"pluralize": "^8.0.0",
"postgres-interval": "^4.0.2",
"private-ip": "^3.0.2",
"puppeteer": "^24.29.1",
"rxjs": "^7.4.0",
"tslib": "^2.8.1",
"uuid": "^11.1.0",
"validator": "^13.15.20",
"zone.js": "~0.15.0"
},
"devDependencies": {
"@angular-devkit/build-angular": "~19.2.19",
"@angular/cli": "~19.0.5",
"@angular/compiler-cli": "~19.0.4",
"@angular/language-service": "~19.0.4",
"@sentry-internal/rrweb": "^2.16.0",
"@types/jasmine": "~5.1.5",
"@types/jasminewd2": "~2.0.13",
"@types/node": "^22.10.2",
"jasmine-core": "~5.5.0",
"jasmine-spec-reporter": "~7.0.0",
"karma": "~6.4.4",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage": "^2.2.1",
"karma-coverage-istanbul-reporter": "^3.0.3",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "^2.1.0",
"ts-node": "~10.9.2",
"typescript": "~5.6.0"
},
"resolutions": {
"mermaid": "^11.10.0"
},
"packageManager": "[email protected]"
"name": "dissendium-v0",
"version": "1.0.0",
"scripts": {
"ng": "ng",
"start": "node scripts/update-version.js && ng serve",
"build": "node scripts/update-version.js && ng build",
"test": "ng test",
"test:ci": "ng test --watch=false --browsers=ChromeHeadlessCustom",
"lint": "ng lint",
"e2e": "ng e2e",
"analyze": "webpack-bundle-analyzer dist/dissendium-v0/stats.json",
"build:stats": "node scripts/update-version.js && ng build --stats-json",
"update-version": "node scripts/update-version.js"
},
"private": true,
"dependencies": {
"@angular/animations": "~19.2.14",
"@angular/cdk": "~19.2.14",
"@angular/common": "~19.2.14",
"@angular/compiler": "~19.2.14",
"@angular/core": "~19.2.14",
"@angular/forms": "~19.2.14",
"@angular/material": "~19.2.14",
"@angular/platform-browser": "~19.2.14",
"@angular/platform-browser-dynamic": "~19.2.14",
"@angular/router": "~19.2.14",
"@brumeilde/ngx-theme": "^1.2.1",
"@jsonurl/jsonurl": "^1.1.8",
"@ngstack/code-editor": "^9.0.0",
"@sentry-internal/rrweb": "^2.31.0",
"@sentry/angular-ivy": "^7.116.0",
"@sentry/tracing": "^7.116.0",
"@stripe/stripe-js": "^5.3.0",
"@types/google-one-tap": "^1.2.6",
"@types/lodash": "^4.17.13",
"@zxcvbn-ts/core": "^3.0.4",
"@zxcvbn-ts/language-en": "^3.0.2",
"amplitude-js": "^8.21.9",
"angular-password-strength-meter": "npm:@eresearchqut/angular-password-strength-meter@^13.0.7",
"angulartics2": "^14.1.0",
"color-string": "^2.0.1",
"convert": "^5.12.0",
"date-fns": "^4.1.0",
"ipaddr.js": "^2.2.0",
"json5": "^2.2.3",
"knip": "^5.79.0",
"libphonenumber-js": "^1.12.9",
"lodash": "^4.17.21",
"lodash-es": "^4.17.21",
"mermaid": "^11.12.1",
"monaco-editor": "0.44.0",
"ng-dynamic-component": "^10.7.0",
"ngx-cookie-service": "^19.0.0",
"ngx-markdown": "^19.1.1",
"ngx-stripe": "^19.0.0",
"pluralize": "^8.0.0",
"postgres-interval": "^4.0.2",
"private-ip": "^3.0.2",
"puppeteer": "^24.29.1",
"rxjs": "^7.4.0",
"tslib": "^2.8.1",
"uuid": "^11.1.0",
"validator": "^13.15.20",
"zone.js": "~0.15.0"
},
"devDependencies": {
"@angular-devkit/build-angular": "~19.2.19",
"@angular/cli": "~19.0.5",
"@angular/compiler-cli": "~19.0.4",
"@angular/language-service": "~19.0.4",
"@sentry-internal/rrweb": "^2.16.0",
"@types/jasmine": "~5.1.5",
"@types/jasminewd2": "~2.0.13",
"@types/node": "^22.10.2",
"jasmine-core": "~5.5.0",
"jasmine-spec-reporter": "~7.0.0",
"karma": "~6.4.4",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage": "^2.2.1",
"karma-coverage-istanbul-reporter": "^3.0.3",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "^2.1.0",
"ts-node": "~10.9.2",
"typescript": "~5.6.0"
},
"resolutions": {
"mermaid": "^11.10.0"
},
"packageManager": "[email protected]"
}
Loading
Loading