name: Release concurrency: build on: push: tags: - "*" jobs: build: runs-on: ubuntu-latest steps: - name: Prepare - Checkout uses: actions/checkout@v4.2.2 - name: Prepare - Setup Docker Buildx uses: docker/setup-buildx-action@v3.11.1 - name: Build uses: docker/build-push-action@v6.18.0 env: DOCKER_BUILD_RECORD_UPLOAD: false with: cache-from: type=gha cache-to: type=gha,mode=max test-containers: runs-on: ubuntu-latest needs: build steps: - name: Prepare - Checkout uses: actions/checkout@v4.2.2 - name: Prepare - Setup dotnet id: dotnet uses: actions/setup-dotnet@v4.3.1 with: dotnet-version: 10.0.x # Note: Unless a concrete version is specified in the `global.json` file, # the latest .NET version installed on the runner (including preinstalled # versions) will be used by default. To control this behavior, you may want # to use temporary `global.json` files. # https://github.com/actions/setup-dotnet/blob/main/README.md#matrix-testing - name: Create `global.json` run: | echo '{"sdk":{"version": "${{ steps.dotnet.outputs.dotnet-version }}"}}' > ./global.json - name: Test - TestContainers run: dotnet test backend/Squidex.slnx --filter Category=TestContainer test-mongo: runs-on: ubuntu-latest needs: build steps: - name: Prepare - Checkout uses: actions/checkout@v4.2.2 - name: Prepare - Setup Docker Buildx uses: docker/setup-buildx-action@v3.11.1 - name: Prepare - Setup dotnet uses: actions/setup-dotnet@v4.3.1 with: dotnet-version: 10.0.x - name: Prepare - Setup Node uses: actions/setup-node@v4.4.0 with: node-version: 18 - name: Build uses: docker/build-push-action@v6.18.0 env: DOCKER_BUILD_RECORD_UPLOAD: false DOCKER_BUILD_SUMMARY: false with: load: true cache-from: type=gha cache-to: tags: squidex-local - name: Start Compose run: docker compose up -d working-directory: tools/TestSuite - name: RUN on Mongo run: dotnet test tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj --filter Category!=NotAutomated env: CONFIG__BACKUPURL: http://localhost:5000 CONFIG__WAIT: 60 CONFIG__SERVER__URL: http://localhost:8080 WEBHOOKCATCHER__HOST__ENDPOINT: webhookcatcher - name: RUN on Mongo on path with worker run: dotnet test tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj --filter Category!=NotAutomated env: CONFIG__BACKUPURL: http://localhost:5000 CONFIG__WAIT: 60 CONFIG__SERVER__URL: http://localhost:8081/squidex WEBHOOKCATCHER__HOST__ENDPOINT: webhookcatcher - name: Install Playwright Dependencies run: npm ci working-directory: './tools/e2e' - name: Install Playwright Browsers run: npx playwright install --with-deps working-directory: './tools/e2e' - name: Run Playwright Tests run: npx playwright test --retries=3 working-directory: './tools/e2e' env: BASE__URL: http://localhost:8080 - name: Upload Playwright Artifacts if: always() uses: actions/upload-artifact@v4.6.2 with: name: playwright-report path: tools/e2e/playwright-report/ retention-days: 30 - name: Dump docker logs on failure if: failure() uses: jwalton/gh-docker-logs@v2.2.2 with: dest: './docker-logs' - name: Upload docker logs if: failure() uses: actions/upload-artifact@v4.6.2 with: name: docker-logs path: './docker-logs' - name: Cleanup if: always() run: docker compose down working-directory: tools/TestSuite test-sql: runs-on: ubuntu-latest needs: build strategy: matrix: include: - name: mysql compose: docker-compose-mysql.yml optional: false - name: postgres compose: docker-compose-postgres.yml optional: false - name: sqlserver compose: docker-compose-sqlserver.yml optional: false - name: ferretdb compose: docker-compose-ferretdb.yml optional: true continue-on-error: ${{ matrix.optional == true }} steps: - name: Prepare - Checkout uses: actions/checkout@v4.2.2 - name: Prepare - Setup Docker Buildx uses: docker/setup-buildx-action@v3.11.1 - name: Prepare - Setup dotnet uses: actions/setup-dotnet@v4.3.1 with: dotnet-version: 10.0.x - name: Prepare - Setup Node uses: actions/setup-node@v4.4.0 with: node-version: 18 - name: Build uses: docker/build-push-action@v6.18.0 env: DOCKER_BUILD_RECORD_UPLOAD: false DOCKER_BUILD_SUMMARY: false with: load: true cache-from: type=gha cache-to: tags: squidex-local - name: Start Compose run: docker compose -f ${{ matrix.compose }} up -d working-directory: tools/TestSuite - name: RUN on ${{ matrix.name }} run: dotnet test tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj --filter "Category!=NotAutomated & Category!=MongoOnly" env: CONFIG__BACKUPURL: http://localhost:5000 CONFIG__WAIT: 60 CONFIG__SERVER__URL: http://localhost:8080 WEBHOOKCATCHER__HOST__ENDPOINT: webhookcatcher - name: Dump docker logs on failure if: failure() uses: jwalton/gh-docker-logs@v2.2.2 with: dest: './docker-logs' - name: Upload docker logs if: failure() uses: actions/upload-artifact@v4.6.2 with: name: docker-logs-${{ matrix.name }} path: './docker-logs' - name: Cleanup if: always() run: docker compose down working-directory: tools/TestSuite publish: runs-on: ubuntu-latest needs: [test-containers, test-mongo, test-sql] steps: - name: Prepare - Checkout uses: actions/checkout@v4.2.2 - name: Prepare - Inject short Variables uses: rlespinasse/github-slug-action@v5.1.0 - name: Prepare - Setup QEMU uses: docker/setup-qemu-action@v3.6.0 - name: Prepare - Setup Docker Buildx uses: docker/setup-buildx-action@v3.11.1 - name: Prepare - Remove unnecessary files run: | sudo rm -rf /usr/share/dotnet sudo rm -rf "$AGENT_TOOLSDIRECTORY" - name: Version - Calculate Major id: version uses: rishabhgupta/split-by@v1.0.1 with: string: "${{ env.GITHUB_REF_SLUG }}" split-by: "." - name: Version - Check Tag id: normal-version run: | if [[ ${{ env.GITHUB_REF_SLUG }} =~ ^[0-9]+\.[0-9]+(\.[0-9]+){0,2}$ ]]; then echo "STABLE_VERSION=true" >> $GITHUB_ENV fi - name: Login to Docker Hub uses: docker/login-action@v3.4.0 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build & Push for Multi-Platforms uses: docker/build-push-action@v6.18.0 env: DOCKER_BUILD_RECORD_UPLOAD: false with: push: true build-args: "SQUIDEX__BUILD__VERSION=${{ env.GITHUB_REF_SLUG }},SQUIDEX__RUNTIME__VERSION=${{ env.GITHUB_REF_SLUG }}" cache-from: type=gha cache-to: type=gha,mode=max platforms: linux/amd64,linux/arm64 tags: squidex/squidex:${{ env.GITHUB_REF_SLUG }},squidex/squidex:${{ steps.version.outputs._0 }}${{env.STABLE_VERSION == 'true' && ',squidex/squidex:latest'}} - name: Release - Make directories run: sudo mkdir /build /release - name: Release - Create container run: docker create --name squidex-container squidex/squidex:${{ env.GITHUB_REF_SLUG }} - name: Release - Get binaries run: sudo docker cp squidex-container:/app/. /build - name: Release - Zip Binaries run: sudo zip -r /release/binaries.zip . working-directory: /build - name: Release - Get Changelog Entry id: changelog_reader uses: mindsers/changelog-reader-action@v2.2.3 with: version: ${{ env.GITHUB_REF_SLUG }} path: ./CHANGELOG.md - name: Release - Publish Binaries uses: ncipollo/release-action@v1.18.0 with: allowUpdates: true artifactErrorsFailBuild: true artifacts: "/release/binaries.zip" body: ${{ steps.changelog_reader.outputs.changes }} name: ${{ env.GITHUB_REF_SLUG }} removeArtifacts: false replacesArtifacts: true token: ${{ secrets.GITHUB_TOKEN }} - name: Release - Cleanup Binaries if: always() run: docker rm squidex-container