Initial playwright integration #403
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Docker build and push | |
# limit concurrency | |
# https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#examples-using-concurrency-and-the-default-behavior | |
concurrency: docker_taqasta_main | |
on: | |
push: | |
# Only activate for `master` branch | |
branches: | |
- master | |
# Plus for all tags | |
tags: | |
- '*' | |
# Plus for any pull-requests | |
pull_request: | |
env: | |
IMAGE_NAME: taqasta | |
jobs: | |
# Lint the image Dockerfile syntax using https://github.com/replicatedhq/dockerfilelint | |
lint: | |
runs-on: ubuntu-latest | |
if: github.event_name == 'push' || github.event_name == 'pull_request' | |
steps: | |
- uses: actions/checkout@v4 | |
- | |
name: Run linter (hadolint) | |
uses: vedmaka/hadolint-action@master | |
with: | |
dockerfile: "Dockerfile" | |
config: "hadolint.yaml" | |
# Generate image tags | |
# The image tag pattern is: | |
# for pull-requests: <MW_CORE_VERSION>-<DATE>-<PR_NUMBER>, eg: 1.35.2-20210125-25 | |
# for tags: <TAG> | |
# for `master` branch: latest + <MW_VERSION>-latest + <MW_CORE_VERSION>-<DATE>-<SHA> | |
# <MW_CORE_VERSION> being parsed from the Dockerfile | |
tags: | |
runs-on: ubuntu-latest | |
if: github.event_name == 'push' || github.event_name == 'pull_request' | |
outputs: | |
REGISTRY_TAGS: ${{ steps.generate.outputs.REGISTRY_TAGS }} | |
REGISTRY_TAGS_VERSION: ${{ steps.generate.outputs.REGISTRY_TAGS_VERSION }} | |
REGISTRY_TAGS_PR_NUMBER: ${{ steps.generate.outputs.REGISTRY_TAGS_PR_NUMBER }} | |
SHA_SHORT: ${{ steps.generate.outputs.SHA_SHORT }} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Generate tags | |
id: generate | |
run: | | |
# Image ID | |
IMAGE_ID=ghcr.io/wikiteq/$IMAGE_NAME | |
# Date | |
BDATE=$(date +%Y%m%d) | |
# Extract MW version from Dockerfile | |
MEDIAWIKI_VERSION=$(sed -nr 's/MW_CORE_VERSION\=([0-9\.]+)/\1/p' Dockerfile | sed "s/ \\\//" | sed "s/\t//") | |
# Extract MW major version (like 1.35) | |
MEDIAWIKI_MAJOR_VERSION=${MEDIAWIKI_VERSION%.*} | |
# Change all uppercase to lowercase, just in case | |
IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') | |
# Strip git ref prefix from version and use it as suffix for version | |
VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\),\1,') | |
# Get the Taqasta version from the "VERSION" file | |
TAQASTA_VERSION=$(cat VERSION) | |
# For pull requests just extract the PR number | |
PR_NUMBER="" | |
[ "${{ github.event_name }}" == "pull_request" ] && VERSION=$(echo "${{ github.ref }}" | sed -e 's,.*/\(.*\)/merge,\1,') | |
[ "${{ github.event_name }}" == "pull_request" ] && PR_NUMBER=$VERSION | |
# Append version | |
[ "${{ github.event_name }}" == "pull_request" ] && VERSION=$MEDIAWIKI_VERSION-$BDATE-$VERSION | |
# Strip "v" prefix from tag name if it's a tag | |
# [[ "${{ github.ref }}" == "refs/tags/"* ]] && VERSION=$(echo $VERSION | sed -e 's/^v//') | |
# Use Docker `latest` tag convention if it's a master branch build | |
[ "$VERSION" == "master" ] && VERSION=latest | |
# Compose REGISTRY_TAGS variable | |
REGISTRY_TAGS=$IMAGE_ID:$VERSION | |
# For master branch also supply an extra tag: <MW_VERSION>-latest,<MW_VERSION>-<DATE>-<SHA> | |
[ "$VERSION" == "latest" ] && REGISTRY_TAGS=$REGISTRY_TAGS,$IMAGE_ID:$TAQASTA_VERSION,$IMAGE_ID:$MEDIAWIKI_MAJOR_VERSION-latest,$IMAGE_ID:$MEDIAWIKI_VERSION-latest,$IMAGE_ID:$MEDIAWIKI_VERSION-$BDATE-$(git rev-parse --short HEAD) | |
SHA_SHORT=${{ github.sha }} | |
[ "${{ github.event_name }}" == "pull_request" ] && SHA_SHORT=$(echo ${{ github.event.pull_request.head.sha }} | cut -c1-8) | |
echo IMAGE_ID=$IMAGE_ID | |
echo VERSION=$VERSION | |
echo REGISTRY_TAGS=$REGISTRY_TAGS | |
echo SHA_SHORT=$SHA_SHORT | |
echo EventName=${{ github.event_name }} | |
echo headref=${{ github.head_ref }} | |
echo "Final image tag to be pushed:" | |
echo $REGISTRY_TAGS | |
echo "REGISTRY_TAGS=$REGISTRY_TAGS" >> $GITHUB_OUTPUT | |
echo "REGISTRY_TAGS_VERSION=$VERSION" >> $GITHUB_OUTPUT | |
echo "REGISTRY_TAGS_PR_NUMBER=$PR_NUMBER" >> $GITHUB_OUTPUT | |
echo "SHA_SHORT=$SHA_SHORT" >> $GITHUB_OUTPUT | |
# Pre-build the image, deploy via compose and run e2e | |
deploy-e2e: | |
needs: [tags] | |
timeout-minutes: 60 | |
# services: | |
# registry: | |
# image: registry:2 | |
# ports: | |
# - 5000:5000 | |
runs-on: ubuntu-latest | |
if: github.event_name == 'push' || github.event_name == 'pull_request' | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
with: | |
install: true | |
- name: Cache Docker layers | |
uses: actions/cache@v3 | |
with: | |
path: /tmp/.buildx-cache | |
key: ${{ runner.os }}-buildx-${{ github.sha }} | |
restore-keys: | | |
${{ runner.os }}-buildx- | |
- name: Build and push | |
id: docker_build | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
platforms: linux/amd64 | |
secrets: | | |
COMPOSER_TOKEN=${{ secrets.GITHUB_TOKEN }} | |
push: false | |
builder: ${{ needs.build.outputs.builder_name }} | |
tags: ${{ needs.tags.outputs.REGISTRY_TAGS }} | |
cache-from: type=gha | |
cache-to: type=gha,mode=max | |
load: true | |
- name: Setup Docker Compose | |
env: | |
COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
DOCKER_BUILDKIT: 1 | |
shell: bash | |
run: DOCKER_BUILDKIT=1 docker compose up -d | |
# - name: Setup Docker Compose | |
# uses: yu-ichiro/spin-up-docker-compose-action@main | |
# env: | |
# COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
# DOCKER_BUILDKIT: 1 | |
# COMPOSE_DOCKER_CLI_BUILD: 1 | |
# with: | |
# file: docker-compose.yml | |
# cache-key: ${{ runner.os }}-buildx-${{ github.sha }} | |
- name: Give containers a moment to init | |
shell: bash | |
run: sleep 30s | |
- name: Test cURL | |
shell: bash | |
run: curl -IXGET http://locahost:8000 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- name: Install dependencies | |
working-directory: ./e2e | |
run: npm ci | |
- name: Install Playwright Browsers | |
working-directory: ./e2e | |
run: npx playwright install chromium --with-deps | |
- name: Run Playwright tests | |
working-directory: ./e2e | |
run: npx playwright test | |
- uses: actions/upload-artifact@v3 | |
if: always() | |
with: | |
name: playwright-report | |
path: e2e/playwright-report/ | |
retention-days: 7 | |
# Builds from cache & push the image to GitHub registry this time | |
push: | |
needs: [tags,deploy-e2e] | |
runs-on: ubuntu-latest | |
outputs: | |
digest: ${{ steps.docker_build.outputs.digest }} | |
imageid: ${{ steps.docker_build.outputs.imageid }} | |
if: github.event_name == 'push' || github.event_name == 'pull_request' | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- | |
name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- | |
name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
with: | |
install: true | |
- | |
name: Cache Docker layers | |
uses: actions/cache@v3 | |
with: | |
path: /tmp/.buildx-cache | |
key: ${{ runner.os }}-buildx-${{ github.sha }} | |
restore-keys: | | |
${{ runner.os }}-buildx- | |
- | |
name: Login to GitHub Container Registry | |
uses: docker/login-action@v2 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- | |
name: Build and push | |
id: docker_build | |
uses: docker/build-push-action@v5 | |
with: | |
context: . | |
platforms: linux/amd64, linux/arm64 | |
secrets: | | |
COMPOSER_TOKEN=${{ secrets.GITHUB_TOKEN }} | |
push: true | |
tags: ${{ needs.tags.outputs.REGISTRY_TAGS }} | |
cache-from: type=gha | |
cache-to: type=gha,mode=max | |
- | |
name: Image digest | |
run: echo ${{ steps.docker_build.outputs.digest }} | |
- | |
name: Image tags debug | |
run: echo ${{ needs.tags.outputs.REGISTRY_TAGS }} | |
# Send a message to the PR thread | |
notify: | |
needs: [tags,push] | |
runs-on: ubuntu-latest | |
if: github.event_name == 'push' || github.event_name == 'pull_request' | |
steps: | |
- | |
name: Notify about image tag | |
if: github.event_name == 'pull_request' && needs.push.outputs.digest != '' | |
uses: hasura/[email protected] | |
with: | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
repository: ${{ github.repository }} | |
number: ${{ github.event.number }} | |
id: comment | |
message: ":whale: The image based on [${{ needs.tags.outputs.SHA_SHORT }}](https://github.com/WikiTeq/Taqasta/pull/${{ needs.tags.outputs.REGISTRY_TAGS_PR_NUMBER }}/commits/${{ github.event.pull_request.head.sha }}) commit has been built with `${{ needs.tags.outputs.REGISTRY_TAGS_VERSION }}` tag as [${{ needs.tags.outputs.REGISTRY_TAGS }}](https://github.com/${{ github.repository }}/pkgs/container/${{ env.IMAGE_NAME }}/${{ needs.push.outputs.imageid }}?tag=${{ needs.tags.outputs.REGISTRY_TAGS_VERSION }})" | |
recreate: true | |
fail: false |