name: "Docker" on: pull_request: paths-ignore: - 'doc/**' push: branches: - 'develop' paths-ignore: - 'doc/**' tags: - 'v?[0-9]+.[0-9]+.[0-9]+' env: TEST_TAG: etherpad/etherpad:test permissions: contents: read jobs: build-test: runs-on: ubuntu-latest permissions: contents: read env: PNPM_HOME: ~/.pnpm-store steps: - name: Check out uses: actions/checkout@v6 with: path: etherpad - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - name: Build and export to Docker uses: docker/build-push-action@v7 with: context: ./etherpad target: production load: true tags: ${{ env.TEST_TAG }} cache-from: type=gha cache-to: type=gha,mode=max - uses: actions/cache@v5 name: Setup gnpm cache if: always() with: path: | ${{ env.PNPM_HOME }} ~/.local/share/gnpm /usr/local/bin/gnpm /usr/local/bin/gnpm-0.0.12 key: ${{ runner.os }}-gnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-gnpm-store- - name: Setup gnpm uses: SamTV12345/gnpm-setup@main with: version: 0.0.12 - name: Test working-directory: etherpad run: | docker run --rm -d -p 9001:9001 --name test ${{ env.TEST_TAG }} ./bin/installDeps.sh docker logs -f test & while true; do echo "Waiting for Docker container to start..." status=$(docker container inspect -f '{{.State.Health.Status}}' test) || exit 1 case ${status} in healthy) break;; starting) sleep 2;; *) printf %s\\n "unexpected status: ${status}" >&2; exit 1;; esac done (cd src && gnpm run test-container) git clean -dxf . build-test-mysql: runs-on: ubuntu-latest permissions: contents: read services: mysql: image: mysql:8 env: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: etherpad MYSQL_USER: etherpad MYSQL_PASSWORD: password ports: - 3306:3306 options: >- --health-cmd="mysqladmin ping -h 127.0.0.1 -uroot -ppassword" --health-interval=5s --health-timeout=5s --health-retries=10 steps: - name: Check out uses: actions/checkout@v6 with: path: etherpad - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - name: Build and export to Docker uses: docker/build-push-action@v7 with: context: ./etherpad target: production load: true tags: ${{ env.TEST_TAG }} cache-from: type=gha cache-to: type=gha,mode=max - name: Test with MySQL database run: | docker run --rm -d \ --network host \ -e DB_TYPE=mysql \ -e DB_HOST=127.0.0.1 \ -e DB_PORT=3306 \ -e DB_NAME=etherpad \ -e DB_USER=etherpad \ -e DB_PASS=password \ -e DB_CHARSET=utf8mb4 \ --name test-mysql ${{ env.TEST_TAG }} docker logs -f test-mysql & attempt=0 while true; do echo "Waiting for Docker container to start (attempt $attempt)..." status=$(docker container inspect -f '{{.State.Health.Status}}' test-mysql 2>/dev/null) || { echo "Container exited"; docker logs test-mysql; exit 1; } case ${status} in healthy) echo "Container is healthy!"; break;; starting) sleep 2;; *) printf %s\\n "unexpected status: ${status}" >&2; docker logs test-mysql; exit 1;; esac attempt=$((attempt + 1)) if [ $attempt -gt 60 ]; then echo "Timed out waiting for container" docker logs test-mysql exit 1 fi done publish: needs: build-test if: github.event_name == 'push' runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Check out uses: actions/checkout@v6 with: path: etherpad - name: Set up QEMU uses: docker/setup-qemu-action@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - name: Docker meta id: meta uses: docker/metadata-action@v6 with: images: | etherpad/etherpad ghcr.io/ether/etherpad tags: | type=ref,event=branch type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} - name: Log in to Docker Hub uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Log in to GHCR uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push id: build-docker uses: docker/build-push-action@v7 with: context: ./etherpad target: production platforms: linux/amd64,linux/arm64 push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha - name: Update repo description uses: peter-evans/dockerhub-description@v5 if: github.ref == 'refs/heads/master' with: readme-filepath: ./etherpad/README.md username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} repository: etherpad/etherpad enable-url-completion: true - name: Check out ether-charts if: github.ref == 'refs/heads/develop' uses: actions/checkout@v6 with: path: ether-charts repository: ether/ether-charts token: ${{ secrets.ETHER_CHART_TOKEN }} - name: Update tag in values-dev.yaml if: success() && github.ref == 'refs/heads/develop' working-directory: ether-charts run: | sed -i 's/tag: ".*"/tag: "${{ steps.build-docker.outputs.digest }}"/' values-dev.yaml - name: Commit and push changes working-directory: ether-charts if: success() && github.ref == 'refs/heads/develop' run: | git config --global user.name 'github-actions[bot]' git config --global user.email 'github-actions[bot]@users.noreply.github.com' git add values-dev.yaml git commit -m 'Update develop image tag' git push