diff --git a/.github/workflows/docker-build-dev.yml b/.github/workflows/docker-build-dev.yml deleted file mode 100644 index e4630e0..0000000 --- a/.github/workflows/docker-build-dev.yml +++ /dev/null @@ -1,124 +0,0 @@ -name: Build and Push Docker Image for Preview - -on: - push: - pull_request: - workflow_dispatch: - -env: - REGISTRY: ghcr.io - IMAGE_NAME: excalidraw-full-preview - OWNER: betterandbetterii - -jobs: - test: - runs-on: ubuntu-latest - services: - postgres: - image: postgres:16-alpine - env: - POSTGRES_USER: excalidraw - POSTGRES_PASSWORD: excalidraw - POSTGRES_DB: excalidraw_test - ports: - - 5432:5432 - options: >- - --health-cmd "pg_isready -U excalidraw -d excalidraw_test" - --health-interval 5s - --health-timeout 5s - --health-retries 10 - env: - TEST_DATABASE_URL: postgres://excalidraw:excalidraw@localhost:5432/excalidraw_test?sslmode=disable - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: true - - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version-file: go.mod - - - name: Run Go tests - run: go test ./... -v -count=1 - - - name: Set up Node - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - cache-dependency-path: frontend/package-lock.json - - - name: Install frontend deps - run: cd frontend && npm ci --legacy-peer-deps - - - name: Build frontend - run: cd frontend && npm run build - - - name: Typecheck frontend - run: cd frontend && npm run typecheck - - - name: Run frontend tests - run: cd frontend && npm test -- --run - - build-and-push: - needs: test - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: true - - - name: Log in to Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=pr - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,value=latest,enable={{is_default_branch}} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build Docker image - if: github.event_name == 'pull_request' - uses: docker/build-push-action@v6 - with: - context: . - file: ./excalidraw-full.Dockerfile - push: false - platforms: linux/amd64,linux/arm64 - tags: ${{ steps.meta.outputs.tags }} - - - name: Build and push Docker image - if: github.event_name != 'pull_request' - uses: docker/build-push-action@v6 - with: - context: . - file: ./excalidraw-full.Dockerfile - push: true - platforms: linux/amd64,linux/arm64 - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }}:buildcache - cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }}:buildcache,mode=max diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml deleted file mode 100644 index 58ede34..0000000 --- a/.github/workflows/docker-build.yml +++ /dev/null @@ -1,126 +0,0 @@ -name: Build, Test and Push Docker Image - -on: - push: - branches: - - main - pull_request: - workflow_dispatch: - -env: - REGISTRY: ghcr.io - IMAGE_NAME: excalidraw-full - OWNER: betterandbetterii - -jobs: - test: - runs-on: ubuntu-latest - services: - postgres: - image: postgres:16-alpine - env: - POSTGRES_USER: excalidraw - POSTGRES_PASSWORD: excalidraw - POSTGRES_DB: excalidraw_test - ports: - - 5432:5432 - options: >- - --health-cmd "pg_isready -U excalidraw -d excalidraw_test" - --health-interval 5s - --health-timeout 5s - --health-retries 10 - env: - TEST_DATABASE_URL: postgres://excalidraw:excalidraw@localhost:5432/excalidraw_test?sslmode=disable - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: true - - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version-file: go.mod - - - name: Run Go tests - run: go test ./... -v -count=1 - - - name: Set up Node - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - cache-dependency-path: frontend/package-lock.json - - - name: Install frontend deps - run: cd frontend && npm ci --legacy-peer-deps - - - name: Build frontend - run: cd frontend && npm run build - - - name: Typecheck frontend - run: cd frontend && npm run typecheck - - - name: Run frontend tests - run: cd frontend && npm test -- --run - - build-and-push: - needs: test - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - submodules: true - - - name: Log in to Container Registry - if: github.event_name != 'pull_request' - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=pr - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,value=latest,enable={{is_default_branch}} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build Docker image - if: github.event_name == 'pull_request' - uses: docker/build-push-action@v6 - with: - context: . - file: ./excalidraw-full.Dockerfile - push: false - platforms: linux/amd64,linux/arm64 - tags: ${{ steps.meta.outputs.tags }} - - - name: Build and push Docker image - if: github.event_name != 'pull_request' - uses: docker/build-push-action@v6 - with: - context: . - file: ./excalidraw-full.Dockerfile - push: true - platforms: linux/amd64,linux/arm64 - tags: ${{ steps.meta.outputs.tags }} - cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }}:buildcache - cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.OWNER }}/${{ env.IMAGE_NAME }}:buildcache,mode=max diff --git a/.github/workflows/docker-images.yml b/.github/workflows/docker-images.yml new file mode 100644 index 0000000..37e9dbe --- /dev/null +++ b/.github/workflows/docker-images.yml @@ -0,0 +1,66 @@ +name: Docker Images + +on: + push: + branches: + - "**" + tags: + - "v*.*.*" + +permissions: + contents: read + packages: write + +concurrency: + group: docker-images-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + name: Build and push + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set image repository + id: image + run: echo "repository=ghcr.io/${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT" + + - name: Use GitHub token for GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ steps.image.outputs.repository }} + tags: | + type=sha,format=short,prefix=sha- + type=ref,event=branch + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=raw,value=latest,enable={{is_default_branch}} + + - name: Build and push image + uses: docker/build-push-action@v6 + with: + context: . + file: ./excalidraw-full.Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/README.md b/README.md index 5a4508c..0c58e53 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,18 @@ make docker-up # Or run via Docker Compose The application will be available at `http://localhost:3002`. +## Docker Images + +Pushing to GitHub automatically builds and publishes the production image to GitHub Container Registry: + +```bash +ghcr.io//:latest +ghcr.io//:sha- +ghcr.io//: +``` + +No registry secrets are required. The workflow uses GitHub's built-in `GITHUB_TOKEN`. + ## Requirements - Go 1.26.2+