mirror of
https://github.com/pocket-id/pocket-id.git
synced 2026-03-28 18:26:36 +00:00
Compare commits
16 Commits
v2.5.0
...
chore/depo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c55ce175af | ||
|
|
2517717988 | ||
|
|
0ca418228e | ||
|
|
d8a085b43a | ||
|
|
6b5026fa69 | ||
|
|
57a3ae3fea | ||
|
|
aff19e797c | ||
|
|
b4c3f946be | ||
|
|
f7667233e4 | ||
|
|
4fc37f896f | ||
|
|
d94f162532 | ||
|
|
cbb5041ab7 | ||
|
|
7e9faf9cde | ||
|
|
6ed238931e | ||
|
|
438fd3f326 | ||
|
|
a43e6a8c2d |
5
.github/workflows/backend-linter.yml
vendored
5
.github/workflows/backend-linter.yml
vendored
@@ -17,14 +17,15 @@ permissions:
|
|||||||
pull-requests: read
|
pull-requests: read
|
||||||
# Optional: allow write access to checks to allow the action to annotate code in the PR.
|
# Optional: allow write access to checks to allow the action to annotate code in the PR.
|
||||||
checks: write
|
checks: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
golangci-lint:
|
golangci-lint:
|
||||||
name: Run Golangci-lint
|
name: Run Golangci-lint
|
||||||
runs-on: ubuntu-latest
|
runs-on: depot-ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v6
|
uses: actions/setup-go@v6
|
||||||
|
|||||||
95
.github/workflows/build-next.yml
vendored
95
.github/workflows/build-next.yml
vendored
@@ -9,43 +9,39 @@ concurrency:
|
|||||||
group: build-next-image
|
group: build-next-image
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
id-token: write
|
||||||
|
attestations: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-next:
|
build-next:
|
||||||
runs-on: ubuntu-latest
|
runs-on: depot-ubuntu-latest
|
||||||
permissions:
|
|
||||||
contents: read
|
env:
|
||||||
packages: write
|
CONTAINER_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/pocket-id
|
||||||
id-token: write
|
|
||||||
attestations: write
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v5
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 24
|
node-version: 24
|
||||||
|
cache: "pnpm"
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v6
|
uses: actions/setup-go@v6
|
||||||
with:
|
with:
|
||||||
go-version-file: "backend/go.mod"
|
go-version-file: "backend/go.mod"
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up Depot CLI
|
||||||
uses: docker/setup-qemu-action@v3
|
uses: depot/setup-action@v1
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Set DOCKER_IMAGE_NAME
|
|
||||||
run: |
|
|
||||||
# Lowercase REPO_OWNER which is required for containers
|
|
||||||
REPO_OWNER=${{ github.repository_owner }}
|
|
||||||
DOCKER_IMAGE_NAME="ghcr.io/${REPO_OWNER,,}/pocket-id"
|
|
||||||
echo "DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME}" >>${GITHUB_ENV}
|
|
||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
@@ -54,6 +50,40 @@ jobs:
|
|||||||
username: ${{ github.repository_owner }}
|
username: ${{ github.repository_owner }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Container Image Metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: ${{ env.CONTAINER_IMAGE_NAME }}
|
||||||
|
tags: |
|
||||||
|
type=raw,value=next
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.authors=Pocket ID
|
||||||
|
org.opencontainers.image.url=https://github.com/pocket-id/pocket-id
|
||||||
|
org.opencontainers.image.documentation=https://github.com/pocket-id/pocket-id/blob/main/README.md
|
||||||
|
org.opencontainers.image.source=https://github.com/pocket-id/pocket-id
|
||||||
|
org.opencontainers.image.version=next
|
||||||
|
org.opencontainers.image.licenses=BSD-2-Clause
|
||||||
|
org.opencontainers.image.ref.name=pocket-id
|
||||||
|
org.opencontainers.image.title=Pocket ID
|
||||||
|
|
||||||
|
- name: Container Image Metadata
|
||||||
|
id: distroless-meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: ${{ env.CONTAINER_IMAGE_NAME }}
|
||||||
|
tags: |
|
||||||
|
type=raw,value=next-distroless
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.authors=Pocket ID
|
||||||
|
org.opencontainers.image.url=https://github.com/pocket-id/pocket-id
|
||||||
|
org.opencontainers.image.documentation=https://github.com/pocket-id/pocket-id/blob/main/README.md
|
||||||
|
org.opencontainers.image.source=https://github.com/pocket-id/pocket-id
|
||||||
|
org.opencontainers.image.version=next-distroless
|
||||||
|
org.opencontainers.image.licenses=BSD-2-Clause
|
||||||
|
org.opencontainers.image.ref.name=pocket-id
|
||||||
|
org.opencontainers.image.title=Pocket ID
|
||||||
|
|
||||||
- name: Install frontend dependencies
|
- name: Install frontend dependencies
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
@@ -66,31 +96,40 @@ jobs:
|
|||||||
|
|
||||||
- name: Build and push container image
|
- name: Build and push container image
|
||||||
id: build-push-image
|
id: build-push-image
|
||||||
uses: docker/build-push-action@v6
|
uses: depot/build-push-action@v1
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
|
file: docker/Dockerfile-prebuilt
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ env.DOCKER_IMAGE_NAME }}:next
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
file: docker/Dockerfile-prebuilt
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
sbom: true
|
||||||
|
provenance: true
|
||||||
|
|
||||||
- name: Build and push container image (distroless)
|
- name: Build and push container image (distroless)
|
||||||
uses: docker/build-push-action@v6
|
uses: depot/build-push-action@v1
|
||||||
id: container-build-push-distroless
|
id: container-build-push-distroless
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
|
file: docker/Dockerfile-distroless
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ env.DOCKER_IMAGE_NAME }}:next-distroless
|
tags: ${{ steps.distroless-meta.outputs.tags }}
|
||||||
file: docker/Dockerfile-distroless
|
labels: ${{ steps.distroless-meta.outputs.labels }}
|
||||||
|
sbom: true
|
||||||
|
provenance: true
|
||||||
|
|
||||||
- name: Container image attestation
|
- name: Container image attestation
|
||||||
uses: actions/attest-build-provenance@v2
|
uses: actions/attest-build-provenance@v2
|
||||||
with:
|
with:
|
||||||
subject-name: "${{ env.DOCKER_IMAGE_NAME }}"
|
subject-name: "${{ env.CONTAINER_IMAGE_NAME }}"
|
||||||
subject-digest: ${{ steps.build-push-image.outputs.digest }}
|
subject-digest: ${{ steps.build-push-image.outputs.digest }}
|
||||||
push-to-registry: true
|
push-to-registry: true
|
||||||
|
|
||||||
- name: Container image attestation (distroless)
|
- name: Container image attestation (distroless)
|
||||||
uses: actions/attest-build-provenance@v2
|
uses: actions/attest-build-provenance@v2
|
||||||
with:
|
with:
|
||||||
subject-name: "${{ env.DOCKER_IMAGE_NAME }}"
|
subject-name: "${{ env.CONTAINER_IMAGE_NAME }}"
|
||||||
subject-digest: ${{ steps.container-build-push-distroless.outputs.digest }}
|
subject-digest: ${{ steps.container-build-push-distroless.outputs.digest }}
|
||||||
push-to-registry: true
|
push-to-registry: true
|
||||||
|
|||||||
97
.github/workflows/e2e-tests.yml
vendored
97
.github/workflows/e2e-tests.yml
vendored
@@ -13,47 +13,15 @@ on:
|
|||||||
- "**.md"
|
- "**.md"
|
||||||
- ".github/**"
|
- ".github/**"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
actions: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
|
||||||
if: github.event.pull_request.head.ref != 'i18n_crowdin'
|
|
||||||
timeout-minutes: 20
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
actions: write
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v5
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Build and export
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: docker/Dockerfile
|
|
||||||
push: false
|
|
||||||
load: false
|
|
||||||
tags: pocket-id:test
|
|
||||||
outputs: type=docker,dest=/tmp/docker-image.tar
|
|
||||||
build-args: BUILD_TAGS=e2etest
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Upload Docker image artifact
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: docker-image
|
|
||||||
path: /tmp/docker-image.tar
|
|
||||||
retention-days: 1
|
|
||||||
|
|
||||||
test:
|
test:
|
||||||
if: github.event.pull_request.head.ref != 'i18n_crowdin'
|
if: github.event.pull_request.head.ref != 'i18n_crowdin'
|
||||||
permissions:
|
runs-on: depot-ubuntu-24.04-32
|
||||||
contents: read
|
|
||||||
actions: write
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: build
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -70,15 +38,22 @@ jobs:
|
|||||||
storage: database
|
storage: database
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v5
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 24
|
node-version: 24
|
||||||
|
cache: "pnpm"
|
||||||
|
|
||||||
|
- name: Set up Depot CLI
|
||||||
|
uses: depot/setup-action@v1
|
||||||
|
|
||||||
|
- name: Set up Depot Docker builder
|
||||||
|
run: depot configure-docker
|
||||||
|
|
||||||
- name: Cache Playwright Browsers
|
- name: Cache Playwright Browsers
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -102,21 +77,6 @@ jobs:
|
|||||||
if: matrix.db == 'postgres' && steps.postgres-cache.outputs.cache-hit == 'true'
|
if: matrix.db == 'postgres' && steps.postgres-cache.outputs.cache-hit == 'true'
|
||||||
run: docker load < /tmp/postgres-image.tar
|
run: docker load < /tmp/postgres-image.tar
|
||||||
|
|
||||||
- name: Cache LLDAP Docker image
|
|
||||||
uses: actions/cache@v4
|
|
||||||
id: lldap-cache
|
|
||||||
with:
|
|
||||||
path: /tmp/lldap-image.tar
|
|
||||||
key: lldap-stable-${{ runner.os }}
|
|
||||||
- name: Pull and save LLDAP image
|
|
||||||
if: steps.lldap-cache.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
docker pull lldap/lldap:2025-05-19
|
|
||||||
docker save lldap/lldap:2025-05-19 > /tmp/lldap-image.tar
|
|
||||||
- name: Load LLDAP image
|
|
||||||
if: steps.lldap-cache.outputs.cache-hit == 'true'
|
|
||||||
run: docker load < /tmp/lldap-image.tar
|
|
||||||
|
|
||||||
- name: Cache SCIM Test Server Docker image
|
- name: Cache SCIM Test Server Docker image
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
id: scim-cache
|
id: scim-cache
|
||||||
@@ -148,31 +108,6 @@ jobs:
|
|||||||
if: matrix.storage == 's3' && steps.s3-cache.outputs.cache-hit == 'true'
|
if: matrix.storage == 's3' && steps.s3-cache.outputs.cache-hit == 'true'
|
||||||
run: docker load < /tmp/localstack-s3-image.tar
|
run: docker load < /tmp/localstack-s3-image.tar
|
||||||
|
|
||||||
- name: Cache AWS CLI Docker image
|
|
||||||
if: matrix.storage == 's3'
|
|
||||||
uses: actions/cache@v4
|
|
||||||
id: aws-cli-cache
|
|
||||||
with:
|
|
||||||
path: /tmp/aws-cli-image.tar
|
|
||||||
key: aws-cli-latest-${{ runner.os }}
|
|
||||||
- name: Pull and save AWS CLI image
|
|
||||||
if: matrix.storage == 's3' && steps.aws-cli-cache.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
docker pull amazon/aws-cli:latest
|
|
||||||
docker save amazon/aws-cli:latest > /tmp/aws-cli-image.tar
|
|
||||||
- name: Load AWS CLI image
|
|
||||||
if: matrix.storage == 's3' && steps.aws-cli-cache.outputs.cache-hit == 'true'
|
|
||||||
run: docker load < /tmp/aws-cli-image.tar
|
|
||||||
|
|
||||||
- name: Download Docker image artifact
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: docker-image
|
|
||||||
path: /tmp
|
|
||||||
|
|
||||||
- name: Load Docker image
|
|
||||||
run: docker load -i /tmp/docker-image.tar
|
|
||||||
|
|
||||||
- name: Install test dependencies
|
- name: Install test dependencies
|
||||||
run: pnpm --filter pocket-id-tests install --frozen-lockfile
|
run: pnpm --filter pocket-id-tests install --frozen-lockfile
|
||||||
|
|
||||||
@@ -198,7 +133,7 @@ jobs:
|
|||||||
DOCKER_COMPOSE_FILE=docker-compose-s3.yml
|
DOCKER_COMPOSE_FILE=docker-compose-s3.yml
|
||||||
fi
|
fi
|
||||||
|
|
||||||
docker compose -f "$DOCKER_COMPOSE_FILE" up -d
|
docker compose -f "$DOCKER_COMPOSE_FILE" up -d --build
|
||||||
|
|
||||||
{
|
{
|
||||||
LOG_FILE="/tmp/backend.log"
|
LOG_FILE="/tmp/backend.log"
|
||||||
|
|||||||
90
.github/workflows/release.yml
vendored
90
.github/workflows/release.yml
vendored
@@ -5,42 +5,46 @@ on:
|
|||||||
tags:
|
tags:
|
||||||
- "v*.*.*"
|
- "v*.*.*"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
packages: write
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: depot-ubuntu-24.04-16
|
||||||
permissions:
|
|
||||||
contents: write
|
env:
|
||||||
packages: write
|
CONTAINER_IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/pocket-id
|
||||||
attestations: write
|
|
||||||
id-token: write
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
|
- name: Set up Depot CLI
|
||||||
|
uses: depot/setup-action@v1
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v5
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 24
|
node-version: 24
|
||||||
|
cache: "pnpm"
|
||||||
|
|
||||||
- uses: actions/setup-go@v6
|
- uses: actions/setup-go@v6
|
||||||
with:
|
with:
|
||||||
go-version-file: "backend/go.mod"
|
go-version-file: "backend/go.mod"
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v3
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
- name: Set DOCKER_IMAGE_NAME
|
|
||||||
run: |
|
|
||||||
# Lowercase REPO_OWNER which is required for containers
|
|
||||||
REPO_OWNER=${{ github.repository_owner }}
|
|
||||||
DOCKER_IMAGE_NAME="ghcr.io/${REPO_OWNER,,}/pocket-id"
|
|
||||||
echo "DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME}" >>${GITHUB_ENV}
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{github.repository_owner}}
|
username: ${{github.repository_owner}}
|
||||||
password: ${{secrets.GITHUB_TOKEN}}
|
password: ${{secrets.GITHUB_TOKEN}}
|
||||||
|
|
||||||
- name: Docker metadata
|
- name: Docker metadata
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@v5
|
uses: docker/metadata-action@v5
|
||||||
@@ -51,59 +55,89 @@ jobs:
|
|||||||
type=semver,pattern={{version}},prefix=v
|
type=semver,pattern={{version}},prefix=v
|
||||||
type=semver,pattern={{major}}.{{minor}},prefix=v
|
type=semver,pattern={{major}}.{{minor}},prefix=v
|
||||||
type=semver,pattern={{major}},prefix=v
|
type=semver,pattern={{major}},prefix=v
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.authors=Pocket ID
|
||||||
|
org.opencontainers.image.url=https://github.com/pocket-id/pocket-id
|
||||||
|
org.opencontainers.image.documentation=https://github.com/pocket-id/pocket-id/blob/main/README.md
|
||||||
|
org.opencontainers.image.source=https://github.com/pocket-id/pocket-id
|
||||||
|
org.opencontainers.image.version=next
|
||||||
|
org.opencontainers.image.licenses=BSD-2-Clause
|
||||||
|
org.opencontainers.image.ref.name=pocket-id
|
||||||
|
org.opencontainers.image.title=Pocket ID
|
||||||
|
|
||||||
- name: Docker metadata (distroless)
|
- name: Docker metadata (distroless)
|
||||||
id: meta-distroless
|
id: meta-distroless
|
||||||
uses: docker/metadata-action@v5
|
uses: docker/metadata-action@v5
|
||||||
with:
|
with:
|
||||||
images: |
|
images: |
|
||||||
${{ env.DOCKER_IMAGE_NAME }}
|
${{ env.CONTAINER_IMAGE_NAME }}
|
||||||
flavor: |
|
flavor: |
|
||||||
suffix=-distroless,onlatest=true
|
suffix=-distroless,onlatest=true
|
||||||
tags: |
|
tags: |
|
||||||
type=semver,pattern={{version}},prefix=v
|
type=semver,pattern={{version}},prefix=v
|
||||||
type=semver,pattern={{major}}.{{minor}},prefix=v
|
type=semver,pattern={{major}}.{{minor}},prefix=v
|
||||||
type=semver,pattern={{major}},prefix=v
|
type=semver,pattern={{major}},prefix=v
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.authors=Pocket ID
|
||||||
|
org.opencontainers.image.url=https://github.com/pocket-id/pocket-id
|
||||||
|
org.opencontainers.image.documentation=https://github.com/pocket-id/pocket-id/blob/main/README.md
|
||||||
|
org.opencontainers.image.source=https://github.com/pocket-id/pocket-id
|
||||||
|
org.opencontainers.image.version=next-distroless
|
||||||
|
org.opencontainers.image.licenses=BSD-2-Clause
|
||||||
|
org.opencontainers.image.ref.name=pocket-id
|
||||||
|
org.opencontainers.image.title=Pocket ID
|
||||||
|
|
||||||
- name: Install frontend dependencies
|
- name: Install frontend dependencies
|
||||||
run: pnpm --filter pocket-id-frontend install --frozen-lockfile
|
run: pnpm --filter pocket-id-frontend install --frozen-lockfile
|
||||||
|
|
||||||
- name: Build frontend
|
- name: Build frontend
|
||||||
run: pnpm --filter pocket-id-frontend build
|
run: pnpm --filter pocket-id-frontend build
|
||||||
|
|
||||||
- name: Build binaries
|
- name: Build binaries
|
||||||
run: sh scripts/development/build-binaries.sh
|
run: sh scripts/development/build-binaries.sh
|
||||||
|
|
||||||
- name: Build and push container image
|
- name: Build and push container image
|
||||||
uses: docker/build-push-action@v6
|
uses: depot/build-push-action@v1
|
||||||
id: container-build-push
|
id: container-build-push
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
|
file: docker/Dockerfile-prebuilt
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
file: docker/Dockerfile-prebuilt
|
sbom: true
|
||||||
|
provenance: true
|
||||||
|
|
||||||
- name: Build and push container image (distroless)
|
- name: Build and push container image (distroless)
|
||||||
uses: docker/build-push-action@v6
|
uses: depot/build-push-action@v1
|
||||||
id: container-build-push-distroless
|
id: container-build-push-distroless
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
|
file: docker/Dockerfile-distroless
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ steps.meta-distroless.outputs.tags }}
|
tags: ${{ steps.meta-distroless.outputs.tags }}
|
||||||
labels: ${{ steps.meta-distroless.outputs.labels }}
|
labels: ${{ steps.meta-distroless.outputs.labels }}
|
||||||
file: docker/Dockerfile-distroless
|
sbom: true
|
||||||
|
provenance: true
|
||||||
|
|
||||||
- name: Binary attestation
|
- name: Binary attestation
|
||||||
uses: actions/attest-build-provenance@v2
|
uses: actions/attest-build-provenance@v2
|
||||||
with:
|
with:
|
||||||
subject-path: "backend/.bin/pocket-id-**"
|
subject-path: "backend/.bin/pocket-id-**"
|
||||||
|
|
||||||
- name: Container image attestation
|
- name: Container image attestation
|
||||||
uses: actions/attest-build-provenance@v2
|
uses: actions/attest-build-provenance@v2
|
||||||
with:
|
with:
|
||||||
subject-name: "${{ env.DOCKER_IMAGE_NAME }}"
|
subject-name: "${{ env.CONTAINER_IMAGE_NAME }}"
|
||||||
subject-digest: ${{ steps.container-build-push.outputs.digest }}
|
subject-digest: ${{ steps.container-build-push.outputs.digest }}
|
||||||
push-to-registry: true
|
push-to-registry: true
|
||||||
|
|
||||||
- name: Container image attestation (distroless)
|
- name: Container image attestation (distroless)
|
||||||
uses: actions/attest-build-provenance@v2
|
uses: actions/attest-build-provenance@v2
|
||||||
with:
|
with:
|
||||||
subject-name: "${{ env.DOCKER_IMAGE_NAME }}"
|
subject-name: "${{ env.CONTAINER_IMAGE_NAME }}"
|
||||||
subject-digest: ${{ steps.container-build-push-distroless.outputs.digest }}
|
subject-digest: ${{ steps.container-build-push-distroless.outputs.digest }}
|
||||||
push-to-registry: true
|
push-to-registry: true
|
||||||
- name: Upload binaries to release
|
- name: Upload binaries to release
|
||||||
@@ -112,14 +146,12 @@ jobs:
|
|||||||
run: gh release upload ${{ github.ref_name }} backend/.bin/*
|
run: gh release upload ${{ github.ref_name }} backend/.bin/*
|
||||||
|
|
||||||
publish-release:
|
publish-release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: depot-ubuntu-latest
|
||||||
needs: [build]
|
needs: [build]
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
- name: Mark release as published
|
- name: Mark release as published
|
||||||
run: gh release edit ${{ github.ref_name }} --draft=false
|
run: gh release edit ${{ github.ref_name }} --draft=false
|
||||||
|
|||||||
17
.github/workflows/svelte-check.yml
vendored
17
.github/workflows/svelte-check.yml
vendored
@@ -21,28 +21,31 @@ on:
|
|||||||
- "frontend/svelte.config.js"
|
- "frontend/svelte.config.js"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
checks: write
|
||||||
|
pull-requests: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
type-check:
|
type-check:
|
||||||
name: Run Svelte Check
|
name: Run Svelte Check
|
||||||
# Don't run on dependabot branches
|
# Don't run on dependabot branches
|
||||||
if: github.actor != 'dependabot[bot]'
|
if: github.actor != 'dependabot[bot]'
|
||||||
runs-on: ubuntu-latest
|
runs-on: depot-ubuntu-latest
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
checks: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v4
|
uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v5
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 24
|
node-version: 24
|
||||||
|
cache: "pnpm"
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm --filter pocket-id-frontend install --frozen-lockfile
|
run: pnpm --filter pocket-id-frontend install --frozen-lockfile
|
||||||
|
|||||||
12
.github/workflows/unit-tests.yml
vendored
12
.github/workflows/unit-tests.yml
vendored
@@ -9,14 +9,16 @@ on:
|
|||||||
paths:
|
paths:
|
||||||
- "backend/**"
|
- "backend/**"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
actions: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test-backend:
|
test-backend:
|
||||||
permissions:
|
runs-on: depot-ubuntu-latest
|
||||||
contents: read
|
|
||||||
actions: write
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- uses: actions/setup-go@v6
|
- uses: actions/setup-go@v6
|
||||||
with:
|
with:
|
||||||
go-version-file: "backend/go.mod"
|
go-version-file: "backend/go.mod"
|
||||||
|
|||||||
5
.github/workflows/update-aaguids.yml
vendored
5
.github/workflows/update-aaguids.yml
vendored
@@ -8,14 +8,15 @@ on:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
update-aaguids:
|
update-aaguids:
|
||||||
runs-on: ubuntu-latest
|
runs-on: depot-ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Fetch JSON data
|
- name: Fetch JSON data
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
1
depot.json
Normal file
1
depot.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{ "id": "c36t29j6bz" }
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
# syntax=docker/dockerfile:1.7
|
||||||
|
|
||||||
# This file uses multi-stage builds to build the application from source, including the front-end
|
# This file uses multi-stage builds to build the application from source, including the front-end
|
||||||
|
|
||||||
# Tags passed to "go build"
|
# Tags passed to "go build"
|
||||||
@@ -9,27 +11,33 @@ RUN corepack enable
|
|||||||
|
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
|
|
||||||
COPY pnpm-workspace.yaml pnpm-lock.yaml ./
|
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
|
||||||
COPY frontend/package.json ./frontend/
|
COPY frontend/package.json ./frontend/
|
||||||
RUN pnpm --filter pocket-id-frontend install --frozen-lockfile
|
RUN --mount=type=cache,target=/root/.local/share/pnpm/store \
|
||||||
|
pnpm --filter pocket-id-frontend install --frozen-lockfile
|
||||||
|
|
||||||
COPY ./frontend ./frontend/
|
COPY ./frontend ./frontend/
|
||||||
|
|
||||||
RUN BUILD_OUTPUT_PATH=dist pnpm --filter pocket-id-frontend run build
|
RUN --mount=type=cache,target=/build/frontend/node_modules/.vite \
|
||||||
|
--mount=type=cache,target=/build/frontend/.svelte-kit \
|
||||||
|
BUILD_OUTPUT_PATH=dist pnpm --filter pocket-id-frontend run build
|
||||||
|
|
||||||
# Stage 2: Build Backend
|
# Stage 2: Build Backend
|
||||||
FROM golang:1.26-alpine AS backend-builder
|
FROM golang:1.26-alpine AS backend-builder
|
||||||
ARG BUILD_TAGS
|
ARG BUILD_TAGS
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
COPY ./backend/go.mod ./backend/go.sum ./
|
COPY ./backend/go.mod ./backend/go.sum ./
|
||||||
RUN go mod download
|
RUN --mount=type=cache,target=/go/pkg/mod \
|
||||||
|
go mod download
|
||||||
|
|
||||||
COPY ./backend ./
|
COPY ./backend ./
|
||||||
COPY --from=frontend-builder /build/frontend/dist ./frontend/dist
|
COPY --from=frontend-builder /build/frontend/dist ./frontend/dist
|
||||||
COPY .version .version
|
COPY .version .version
|
||||||
|
|
||||||
WORKDIR /build/cmd
|
WORKDIR /build/cmd
|
||||||
RUN VERSION=$(cat /build/.version) \
|
RUN --mount=type=cache,target=/go/pkg/mod \
|
||||||
|
--mount=type=cache,target=/root/.cache/go-build \
|
||||||
|
VERSION=$(cat /build/.version) && \
|
||||||
CGO_ENABLED=0 \
|
CGO_ENABLED=0 \
|
||||||
GOOS=linux \
|
GOOS=linux \
|
||||||
go build \
|
go build \
|
||||||
|
|||||||
@@ -9,21 +9,21 @@ services:
|
|||||||
service: scim-test-server
|
service: scim-test-server
|
||||||
localstack-s3:
|
localstack-s3:
|
||||||
image: localstack/localstack:s3-latest
|
image: localstack/localstack:s3-latest
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localstack-s3:4566"]
|
|
||||||
interval: 1s
|
|
||||||
timeout: 3s
|
|
||||||
retries: 10
|
|
||||||
create-bucket:
|
|
||||||
image: amazon/aws-cli:latest
|
|
||||||
environment:
|
environment:
|
||||||
AWS_ACCESS_KEY_ID: test
|
AWS_ACCESS_KEY_ID: test
|
||||||
AWS_SECRET_ACCESS_KEY: test
|
AWS_SECRET_ACCESS_KEY: test
|
||||||
AWS_DEFAULT_REGION: us-east-1
|
AWS_DEFAULT_REGION: us-east-1
|
||||||
depends_on:
|
volumes:
|
||||||
localstack-s3:
|
- ./localstack-init-s3.py:/etc/localstack/init/ready.d/10-init-s3.py
|
||||||
condition: service_healthy
|
healthcheck:
|
||||||
entrypoint: "aws --endpoint-url=http://localstack-s3:4566 s3 mb s3://pocket-id-test"
|
test:
|
||||||
|
[
|
||||||
|
"CMD-SHELL",
|
||||||
|
'curl -fs http://localstack-s3:4566/_localstack/init/ready | grep -q ''"completed": true''',
|
||||||
|
]
|
||||||
|
interval: 1s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 10
|
||||||
pocket-id:
|
pocket-id:
|
||||||
extends:
|
extends:
|
||||||
file: docker-compose.yml
|
file: docker-compose.yml
|
||||||
@@ -37,8 +37,8 @@ services:
|
|||||||
S3_SECRET_ACCESS_KEY: test
|
S3_SECRET_ACCESS_KEY: test
|
||||||
S3_FORCE_PATH_STYLE: true
|
S3_FORCE_PATH_STYLE: true
|
||||||
depends_on:
|
depends_on:
|
||||||
create-bucket:
|
localstack-s3:
|
||||||
condition: service_completed_successfully
|
condition: service_healthy
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
pocket-id-test-data:
|
pocket-id-test-data:
|
||||||
|
|||||||
22
tests/setup/localstack-init-s3.py
Normal file
22
tests/setup/localstack-init-s3.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import boto3
|
||||||
|
from botocore.exceptions import ClientError
|
||||||
|
|
||||||
|
BUCKET_NAME = "pocket-id-test"
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
s3 = boto3.client(
|
||||||
|
"s3",
|
||||||
|
endpoint_url="http://localhost:4566",
|
||||||
|
aws_access_key_id="test",
|
||||||
|
aws_secret_access_key="test",
|
||||||
|
region_name="us-east-1",
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
s3.head_bucket(Bucket=BUCKET_NAME)
|
||||||
|
except ClientError:
|
||||||
|
s3.create_bucket(Bucket=BUCKET_NAME)
|
||||||
|
|
||||||
|
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user