Update extension-test.yml #388
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
# If you see this message on 'femiwiki/.github' repository, please keep in mind that all changes of | |
# this workflow file is for being copied to other repositories. If you see this message on any other | |
# repositories, DO NOT EDIT this file itself. You should edit | |
# https://github.com/femiwiki/.github/blob/main/workflow-templates/.github/workflows/extension-test.yml | |
# Instead of this. | |
name: Quibble and Phan | |
on: | |
push: | |
branches: | |
- '*' | |
tags-ignore: | |
- '*.*' | |
pull_request: | |
env: | |
DOCKER_REGISTRY: docker-registry.wikimedia.org | |
DOCKER_ORG: releng | |
QUIBBLE_DOCKER_IMAGE: quibble-buster-php81 | |
# There is no quibble-buster-php81-coverage yet | |
COVERAGE_DOCKER_IMAGE: quibble-buster-php74-coverage | |
PHAN_DOCKER_IMAGE: mediawiki-phan-php81 | |
jobs: | |
test: | |
strategy: | |
fail-fast: false | |
matrix: | |
stage: | |
- phan | |
- coverage | |
- phpunit-unit | |
- phpunit | |
- phpunit-standalone | |
- npm-test | |
- composer-test | |
- selenium | |
# - qunit | |
# - api-testing | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
# /home/runner/cache/ Cache | |
# /home/runner/src/ Mediawiki installation | |
# /home/runner/src/<TYPE>s/<EXTENSION_NAME>/ Clone of the extension repository | |
# /home/runner/docker-images/ Docker images which exported with docker-save command | |
# $GITHUB_WORKSPACE/.github/workflows/dependencies Dependency extensions and skins | |
- name: Set up | |
run: | | |
if [ -e skin.json ]; then | |
echo "TYPE=skin" >> $GITHUB_ENV | |
echo "EXTENSION_NAME=$(cat skin.json | | |
python3 -c 'import json;import sys;print(json.loads("".join(sys.stdin.readlines()))["name"])')" >> $GITHUB_ENV | |
else | |
echo "TYPE=extension" >> $GITHUB_ENV | |
echo "EXTENSION_NAME=$(cat extension.json | | |
python3 -c 'import json;import sys;print(json.loads("".join(sys.stdin.readlines()))["name"])')" >> $GITHUB_ENV | |
fi | |
# Export the target version of MediaWiki | |
# An example of GITHUB_REF: refs/heads/feature-branch-1 | |
BRANCH_NAME=$(echo "$GITHUB_REF" | cut -d'/' -f3 | cut -d'-' -f1) | |
BASE_BRANCH_NAME=$(echo "$GITHUB_BASE_REF" | cut -d'/' -f3) | |
if [[ "$BRANCH_NAME" =~ ^(master|REL[0-9]+_[0-9]+)$ ]]; then | |
# branch name starts with the version (ex: master-new-feature, REL1_34-bug-fix) | |
export MEDIAWIKI_VERSION="$BRANCH_NAME" | |
elif [ "$GITHUB_EVENT_NAME" == 'pull_request' ] && [[ "$BASE_BRANCH_NAME" =~ ^(master|REL[0-9]+_[0-9]+)$ ]]; then | |
export MEDIAWIKI_VERSION="$BASE_BRANCH_NAME" | |
else | |
export MEDIAWIKI_VERSION=master | |
fi | |
echo MEDIAWIKI_VERSION="${MEDIAWIKI_VERSION}" >> $GITHUB_ENV | |
if [ "${{ matrix.stage }}" == 'phan' ]; then | |
export DOCKER_IMAGE="${PHAN_DOCKER_IMAGE}" | |
elif [ "${{ matrix.stage }}" == coverage ]; then | |
export DOCKER_IMAGE="${COVERAGE_DOCKER_IMAGE}" | |
else | |
export DOCKER_IMAGE="${QUIBBLE_DOCKER_IMAGE}" | |
fi | |
echo "DOCKER_IMAGE=${DOCKER_IMAGE}" >> $GITHUB_ENV | |
# Get the latest docker tag (Ref: https://github.com/thcipriani/dockerregistry) | |
DOCKER_LATEST_TAG="$(curl -sL "https://${DOCKER_REGISTRY}/v2/${DOCKER_ORG}/${DOCKER_IMAGE}/tags/list" | | |
python3 -c 'import json;print("\n".join(json.loads(input())["tags"]))' | | |
grep -v latest | sort -Vr | head -1)" | |
echo "DOCKER_LATEST_TAG=${DOCKER_LATEST_TAG}" >> $GITHUB_ENV | |
if [ "${{ matrix.stage }}" == 'phan' ]; then | |
echo "PHAN_DOCKER_LATEST_TAG=$(curl -sL "https://${DOCKER_REGISTRY}/v2/${DOCKER_ORG}/${PHAN_DOCKER_IMAGE}/tags/list" | | |
python3 -c 'import json;print("\n".join(json.loads(input())["tags"]))' | | |
grep -v latest | sort -Vr | head -1)" >> $GITHUB_ENV | |
elif [ "${{ matrix.stage }}" == 'coverage' ]; then | |
echo "COVERAGE_DOCKER_LATEST_TAG=${DOCKER_LATEST_TAG}" >> $GITHUB_ENV | |
fi | |
# Resolve dependencies | |
if [ -e .github/workflows/dependencies ]; then | |
cd .github/workflows | |
curl -sL https://raw.githubusercontent.com/wikimedia/integration-config/master/zuul/parameter_functions.py -o pf.py | |
curl -sL https://raw.githubusercontent.com/femiwiki/.github/main/scripts/resolve_dependencies.py -o rd.py | |
echo "DEPENDENCIES=$(python3 rd.py)" >> $GITHUB_ENV | |
fi | |
- name: Cache docker image | |
uses: actions/cache@v3 | |
with: | |
path: /home/runner/docker-images/${{ env.DOCKER_IMAGE }} | |
key: ${{ env.DOCKER_IMAGE }}:${{ env.DOCKER_LATEST_TAG }} | |
- name: Load or pull docker image | |
run: | | |
if [ -f /home/runner/docker-images/"${DOCKER_IMAGE}" ]; then | |
docker load -i /home/runner/docker-images/"${DOCKER_IMAGE}" | |
else | |
docker pull "${DOCKER_REGISTRY}/${DOCKER_ORG}/${DOCKER_IMAGE}:${DOCKER_LATEST_TAG}" | |
fi | |
- name: Cache quibble coverage docker image | |
if: matrix.stage == 'coverage' | |
uses: actions/cache@v3 | |
with: | |
path: /home/runner/docker-images/${{ env.COVERAGE_DOCKER_IMAGE }} | |
key: ${{ env.COVERAGE_DOCKER_IMAGE }}:${{ env.COVERAGE_DOCKER_LATEST_TAG }} | |
- name: Cache phan docker image | |
if: matrix.stage == 'phan' | |
uses: actions/cache@v3 | |
with: | |
path: /home/runner/docker-images/${{ env.PHAN_DOCKER_IMAGE }} | |
key: ${{ env.PHAN_DOCKER_IMAGE }}:${{ env.PHAN_DOCKER_LATEST_TAG }} | |
- name: Load or pull quibble coverage docker image | |
if: matrix.stage == 'coverage' | |
run: | | |
if [ -f /home/runner/docker-images/"${COVERAGE_DOCKER_IMAGE}" ]; then | |
docker load -i /home/runner/docker-images/"${COVERAGE_DOCKER_IMAGE}" | |
else | |
docker pull "${DOCKER_REGISTRY}/${DOCKER_ORG}/${COVERAGE_DOCKER_IMAGE}:${COVERAGE_DOCKER_LATEST_TAG}" | |
fi | |
- name: Load or pull phan docker image | |
if: matrix.stage == 'phan' | |
run: | | |
if [ -f /home/runner/docker-images/"${PHAN_DOCKER_IMAGE}" ]; then | |
docker load -i /home/runner/docker-images/"${PHAN_DOCKER_IMAGE}" | |
else | |
docker pull "${DOCKER_REGISTRY}/${DOCKER_ORG}/${PHAN_DOCKER_IMAGE}:${PHAN_DOCKER_LATEST_TAG}" | |
fi | |
- name: Cache MediaWiki installation | |
uses: actions/cache@v3 | |
with: | |
path: /home/runner/src | |
key: ${{ runner.os }}-${{ env.MEDIAWIKI_VERSION }}-${{ hashFiles('.github/workflows/dependencies') }} | |
- name: Download MediaWiki and extensions | |
run: | | |
cd /home/runner | |
if [ ! -d src ]; then | |
git clone -b "${MEDIAWIKI_VERSION}" --depth 1 https://gerrit.wikimedia.org/r/mediawiki/core src | |
git clone --recurse-submodules -b "${MEDIAWIKI_VERSION}" --depth 1 https://gerrit.wikimedia.org/r/mediawiki/skins/Vector src/skins/Vector | |
for dep in $DEPENDENCIES; do | |
if [ "$dep" = 'mediawiki/extensions/Wikibase' ]; then | |
git clone -b "${MEDIAWIKI_VERSION}" --depth 1 "https://gerrit.wikimedia.org/r/${dep}" src/"$(echo $dep | cut -d'/' -f2,3)" | |
cd src/"$(echo $dep | cut -d'/' -f2,3)" | |
# https://gerrit.wikimedia.org/r/q/I2037cd8bb5d568021472e048900649028b5dcc62 | |
git apply << 'EOF' | |
diff --git a/.gitmodules b/.gitmodules | |
index df41c768af..e9926d6ddd 100644 | |
--- a/.gitmodules | |
+++ b/.gitmodules | |
@@ -3,13 +3,13 @@ | |
url = https://gerrit.wikimedia.org/r/data-values/value-view | |
[submodule "view/lib/wikibase-serialization"] | |
path = view/lib/wikibase-serialization | |
- url = https://phabricator.wikimedia.org/source/wikibase-serialization.git | |
+ url = https://github.com/wmde/WikibaseSerializationJavaScript.git | |
[submodule "view/lib/wikibase-data-values"] | |
path = view/lib/wikibase-data-values | |
- url = https://phabricator.wikimedia.org/source/datavalues-javascript.git | |
+ url = https://github.com/wmde/DataValuesJavaScript.git | |
[submodule "view/lib/wikibase-data-model"] | |
path = view/lib/wikibase-data-model | |
- url = https://phabricator.wikimedia.org/source/wikibase-data-model.git | |
+ url = https://github.com/wmde/WikibaseDataModelJavaScript.git | |
[submodule "view/lib/wikibase-termbox"] | |
path = view/lib/wikibase-termbox | |
url = https://gerrit.wikimedia.org/r/wikibase/termbox | |
EOF | |
git submodule update --init | |
cd - | |
elif [ "$dep" = 'mediawiki/extensions/WikibaseLexeme' ]; then | |
git clone -b "${MEDIAWIKI_VERSION}" --depth 1 "https://gerrit.wikimedia.org/r/${dep}" src/"$(echo $dep | cut -d'/' -f2,3)" | |
cd src/"$(echo $dep | cut -d'/' -f2,3)" | |
# https://gerrit.wikimedia.org/r/q/I2037cd8bb5d568021472e048900649028b5dcc62 | |
git apply << 'EOF' | |
diff --git a/.gitmodules b/.gitmodules | |
index 51ab4cd..97dff70 100644 | |
--- a/.gitmodules | |
+++ b/.gitmodules | |
@@ -1,3 +1,3 @@ | |
[submodule "resources/special/new-lexeme"] | |
path = resources/special/new-lexeme | |
- url = https://phabricator.wikimedia.org/diffusion/NLSP/new-lexeme-special-page.git | |
+ url = https://github.com/wmde/new-lexeme-special-page.git | |
EOF | |
git submodule update --init | |
cd - | |
else | |
git clone --recurse-submodules -b "${MEDIAWIKI_VERSION}" --depth 1 "https://gerrit.wikimedia.org/r/${dep}" src/"$(echo $dep | cut -d'/' -f2,3)" | |
fi | |
done | |
fi | |
git -C src/ log -n 1 --format="%H" | |
- name: Cache dependencies (composer and npm) | |
uses: actions/cache@v3 | |
with: | |
path: /home/runner/cache | |
key: ${{ runner.os }}-${{ env.MEDIAWIKI_VERSION }}-${{ hashFiles('**/*.lock') }} | |
- name: Setup PHP Action | |
if: ${{ matrix.stage == 'phan' }} | |
uses: shivammathur/setup-php@v2 | |
with: | |
php-version: '7.4' | |
- name: Composer install | |
if: ${{ matrix.stage == 'phan' }} | |
run: | | |
composer install --prefer-dist --no-progress --no-interaction # $GITHUB_WORKSPACE | |
- name: Setup Node.js environment | |
uses: actions/setup-node@v3 | |
with: | |
node-version: '16' | |
cache: 'npm' | |
- name: Run npm because Quibble is not compatible with yarn. | |
run: | | |
if [ -f yarn.lock ]; then | |
npm install | |
fi | |
- name: Main Test | |
run: | | |
cd /home/runner | |
# Move our repository | |
mkdir -p cache cover src/skins src/extensions | |
sudo cp -r "${GITHUB_WORKSPACE}" "src/${{ env.TYPE }}s/${{ env.EXTENSION_NAME }}" | |
chmod 777 src cache cover | |
# https://github.com/femiwiki/.github/issues/3 | |
sudo chown -R nobody:nogroup src cache | |
sudo chown $(id -u):$(id -g) src cache | |
# Composer install | |
if [ "${{ matrix.stage }}" == 'phan' ] || [ "${{ matrix.stage }}" == 'coverage' ]; then | |
docker run \ | |
--entrypoint quibble-with-supervisord \ | |
-e "ZUUL_PROJECT=mediawiki/${{ env.TYPE }}s/${{ env.EXTENSION_NAME }}" \ | |
-v "$(pwd)"/cache:/cache \ | |
-v "$(pwd)"/src:/workspace/src \ | |
"${DOCKER_REGISTRY}/${DOCKER_ORG}/${QUIBBLE_DOCKER_IMAGE}:${QUIBBLE_DOCKER_LATEST_TAG}" \ | |
--skip-zuul \ | |
--packages-source composer \ | |
--skip-install \ | |
--skip all \ | |
$DEPENDENCIES | |
fi | |
if [ "${{ matrix.stage }}" == 'phan' ]; then | |
docker run \ | |
-e "THING_SUBNAME=${{ env.TYPE }}s/${{ env.EXTENSION_NAME }}" \ | |
-v "$(pwd)"/src:/mediawiki \ | |
"${DOCKER_REGISTRY}/${DOCKER_ORG}/${DOCKER_IMAGE}:${DOCKER_LATEST_TAG}" \ | |
--color | |
elif [ "${{ matrix.stage }}" == 'coverage' ]; then | |
if [ -d tests/phpunit ]; then | |
# MW1.35+ requires PHP7.3 but quibble-coverage is not. | |
if [ "${MEDIAWIKI_VERSION}" == 'master' ]; then | |
if [ "${TYPE}" == 'skin' ]; then | |
COMMEND=mwskin-phpunit-coverage | |
else | |
COMMEND=mwext-phpunit-coverage | |
fi | |
docker run \ | |
--entrypoint quibble-with-supervisord \ | |
-e "ZUUL_PROJECT=mediawiki/${{ env.TYPE }}s/${{ env.EXTENSION_NAME }}" \ | |
-v "$(pwd)"/cache:/cache \ | |
-v "$(pwd)"/src:/workspace/src \ | |
-v "$(pwd)"/cover:/workspace/cover \ | |
"${DOCKER_REGISTRY}/${DOCKER_ORG}/${DOCKER_IMAGE}:${DOCKER_LATEST_TAG}" \ | |
--skip-zuul \ | |
--skip-deps \ | |
-c "${COMMEND}" | |
fi | |
fi | |
else | |
docker run \ | |
--entrypoint quibble-with-supervisord \ | |
-e "ZUUL_PROJECT=mediawiki/${{ env.TYPE }}s/${{ env.EXTENSION_NAME }}" \ | |
-v "$(pwd)"/cache:/cache \ | |
-v "$(pwd)"/src:/workspace/src \ | |
"${DOCKER_REGISTRY}/${DOCKER_ORG}/${DOCKER_IMAGE}:${DOCKER_LATEST_TAG}" \ | |
--skip-zuul \ | |
--packages-source composer \ | |
--run "${{ matrix.stage }}" \ | |
$DEPENDENCIES | |
fi | |
- name: Upload coverage to Codecov | |
if: ${{ matrix.stage == 'coverage' }} | |
uses: codecov/codecov-action@v3 | |
with: | |
directory: /home/runner/cover | |
- name: Tear down | |
run: | | |
cd /home/runner | |
sudo rm -rf "src/${{ env.TYPE }}s/${{ env.EXTENSION_NAME }}" | |
# See https://doc.wikimedia.org/quibble/index.html#remove-localsettings-php-between-runs | |
rm "$(pwd)"/src/LocalSettings.php || true | |
mkdir -p docker-images | |
docker save -o "$(pwd)/docker-images/${DOCKER_IMAGE}" \ | |
"${DOCKER_REGISTRY}/${DOCKER_ORG}/${DOCKER_IMAGE}:${DOCKER_LATEST_TAG}" |