farmOS/.github/workflows/deliver.yml

248 lines
11 KiB
YAML

name: Tests and delivery
on:
schedule:
- cron: '0 8 * * *' # Run at 8AM UTC.
push:
branches:
- '2.x'
- '2.x-**'
tags:
- '2.*'
pull_request:
branches:
- '2.x'
jobs:
build:
name: Build Docker images
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v3
- name: Set default FARMOS_REPO and FARMOS_VERSION.
run: |
echo "FARMOS_REPO=${GITHUB_REPOSITORY}" >> $GITHUB_ENV
echo "FARMOS_VERSION=2.x" >> $GITHUB_ENV
- name: Set FARMOS_VERSION for branch push event.
if: github.event_name == 'push' && github.ref_type == 'branch'
run: echo "FARMOS_VERSION=${GITHUB_REF:11}" >> $GITHUB_ENV
- name: Set FARMOS_VERSION for tag push event.
if: github.event_name == 'push' && github.ref_type == 'tag'
run: echo "FARMOS_VERSION=${GITHUB_REF:10}" >> $GITHUB_ENV
- name: Set FARMOS_VERSION and FARMOS_REPO for pull request event.
if: github.event_name == 'pull_request'
run: |
echo "FARMOS_VERSION=${GITHUB_HEAD_REF}" >> $GITHUB_ENV
echo "FARMOS_REPO=${{ github.event.pull_request.head.repo.full_name }}" >> $GITHUB_ENV
- name: Build and save farmOS 2.x Docker image
run: |
docker build --build-arg FARMOS_REPO=https://github.com/${FARMOS_REPO} --build-arg FARMOS_VERSION=${FARMOS_VERSION} -t farmos/farmos:2.x docker
docker save farmos/farmos:2.x > /tmp/farmos-2x.tar
- name: Cache farmOS 2.x Docker image
uses: actions/cache@v3
with:
path: /tmp/farmos-2x.tar
key: farmos-2x-${{ github.run_id }}
# This builds the dev Docker image using the specified FARMOS_VERSION,
# but notably it does NOT override the default PROJECT_VERSION, so the
# farmOS Composer project 2.x branch is always used.
- name: Build and save farmOS 2.x-dev Docker image
run: |
docker build --build-arg FARMOS_REPO=https://github.com/${FARMOS_REPO} --build-arg FARMOS_VERSION=${FARMOS_VERSION} -t farmos/farmos:2.x-dev docker/dev
docker save farmos/farmos:2.x-dev > /tmp/farmos-2x-dev.tar
- name: Cache farmOS 2.x-dev Docker image
uses: actions/cache@v3
with:
path: /tmp/farmos-2x-dev.tar
key: farmos-2x-dev-${{ github.run_id }}
outputs:
farmos_version: ${{ env.FARMOS_VERSION }}
sniff:
name: Run PHP Codesniffer and PHPStan
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout the repository
uses: actions/checkout@v3
- name: Restore farmOS 2.x-dev Docker image from cache
uses: actions/cache@v3
with:
path: /tmp/farmos-2x-dev.tar
key: farmos-2x-dev-${{ github.run_id }}
- name: Load farmos/farmos:2.x-dev image
run: docker load < /tmp/farmos-2x-dev.tar
- name: Run PHP CodeSniffer
run: docker run farmos/farmos:2.x-dev phpcs /opt/drupal/web/profiles/farm
- name: Run PHPStan
run: docker run farmos/farmos:2.x-dev phpstan analyze --memory-limit 1G /opt/drupal/web/profiles/farm
- name: Check PHP compatibility of contrib modules and themes (ignore warnings).
run: |
docker run farmos/farmos:2.x-dev phpcs --standard=PHPCompatibility --runtime-set testVersion 7.4- --warning-severity=0 /opt/drupal/web/modules
docker run farmos/farmos:2.x-dev phpcs --standard=PHPCompatibility --runtime-set testVersion 7.4- --warning-severity=0 /opt/drupal/web/themes
test:
name: Run PHPUnit tests
runs-on: ubuntu-latest
needs: build
strategy:
matrix:
dbms:
- pgsql
- mariadb
- sqlite
include:
- dbms: pgsql
DB_URL: pgsql://farm:farm@db/farm
processes: auto
- dbms: mariadb
DB_URL: mysql://farm:farm@db/farm
processes: auto
- dbms: sqlite
DB_URL: sqlite://localhost/sites/default/files/db.sqlite
processes: 1
steps:
- name: Print test matrix variables
run: echo "matrix.dbms=${{ matrix.dbms }}, matrix.DB_URL=${{ matrix.DB_URL }}"
- name: Checkout the repository
uses: actions/checkout@v3
- name: Restore farmOS 2.x-dev Docker image from cache
uses: actions/cache@v3
with:
path: /tmp/farmos-2x-dev.tar
key: farmos-2x-dev-${{ github.run_id }}
- name: Load farmos/farmos:2.x-dev image
run: docker load < /tmp/farmos-2x-dev.tar
# Build a new docker-compose.yml file from docker-compose.testing.common + docker-compose.testing.{dbms}.yml.
# Copy to the current directory so that farmOS volume mounts don't change to the docker/www folder.
- name: Create docker-compose.yml
env:
DB_URL: ${{ matrix.DB_URL }}
run: |
cp docker/docker-compose.testing.* .
docker compose -f docker-compose.testing.common.yml -f docker-compose.testing.${{ matrix.dbms }}.yml config > docker-compose.yml
- name: Start containers
run: docker compose up -d
- name: Wait until www container is ready
# The www-container-fs-ready file is only created once we expect the containers to be online
# so waiting for that lets us know it is safe to start the tests
run: until [ -f ./www/www-container-fs-ready ]; do sleep 0.1; done
- name: Run PHPUnit tests
run: docker compose exec -u www-data -T www paratest -vv --processes=${{ matrix.processes }} /opt/drupal/web/profiles/farm
- name: Test Drush site install with all modules
run: docker compose exec -u www-data -T www drush site-install --db-url=${{ matrix.DB_URL }} farm farm.modules='all'
release:
name: Create release
# We only create a release if this is a tag push event to the official
# repository.
if: github.repository == 'farmOS/farmOS' && github.event_name == 'push' && github.ref_type == 'tag'
runs-on: ubuntu-latest
needs:
- build
- sniff
- test
steps:
- name: Set FARMOS_VERSION from previous output.
run: echo "FARMOS_VERSION=${{ needs.build.outputs.farmos_version }}" >> $GITHUB_ENV
- name: Restore farmOS 2.x Docker image from cache
uses: actions/cache@v3
with:
path: /tmp/farmos-2x.tar
key: farmos-2x-${{ github.run_id }}
- name: Load farmos/farmos:2.x image
run: docker load < /tmp/farmos-2x.tar
- name: Run farmOS Docker container
run: docker run --rm -v /tmp/farmOS:/opt/drupal farmos/farmos:2.x true
- name: Create artifact
run: cd /tmp && tar -czf farmOS-${FARMOS_VERSION}.tar.gz farmOS
- name: Create GitHub release
uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 #0.1.15
with:
body: |
For full release notes, see [CHANGELOG.md](https://github.com/farmOS/farmOS/blob/${{ env.FARMOS_VERSION }}/CHANGELOG.md).
files: /tmp/farmOS-${{ env.FARMOS_VERSION }}.tar.gz
draft: false
prerelease: false
- name: Checkout the farmOS/composer-project repository
uses: actions/checkout@v3
with:
repository: farmOS/composer-project
ref: 2.x
path: composer-project
- name: Tag a new release of farmOS/composer-project
run: |
cd composer-project
cp /tmp/farmOS/composer.json ./
cp /tmp/farmOS/composer.lock ./
git add .
git commit -m 'farmOS ${{ env.FARMOS_VERSION }}'
git tag ${{ env.FARMOS_VERSION }}
git push origin ${{ env.FARMOS_VERSION }}
publish:
name: Publish to Docker Hub
# We only publish to Docker Hub if this is a tag or 2.x branch push event
# to the official repository.
if: github.repository == 'farmOS/farmOS' && github.event_name == 'push' && (github.ref_type == 'tag' || (github.ref_type == 'branch' && needs.build.outputs.farmos_version == '2.x'))
runs-on: ubuntu-latest
needs:
- build
- sniff
- test
steps:
- name: Set FARMOS_VERSION from previous output.
run: echo "FARMOS_VERSION=${{ needs.build.outputs.farmos_version }}" >> $GITHUB_ENV
- name: Restore farmOS 2.x Docker image from cache
uses: actions/cache@v3
with:
path: /tmp/farmos-2x.tar
key: farmos-2x-${{ github.run_id }}
- name: Load farmos/farmos:2.x image
run: docker load < /tmp/farmos-2x.tar
- name: Restore farmOS 2.x-dev Docker image from cache
uses: actions/cache@v3
with:
path: /tmp/farmos-2x-dev.tar
key: farmos-2x-dev-${{ github.run_id }}
- name: Load farmos/farmos:2.x-dev image
run: docker load < /tmp/farmos-2x-dev.tar
- name: Login to Docker Hub.
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# If the 2.x branch was pushed...
- name: Publish farmos/farmos:2.x image to Docker Hub.
if: github.ref_type == 'branch' && env.FARMOS_VERSION == '2.x'
run: docker push farmos/farmos:2.x
- name: Publish farmos/farmos:2.x-dev image to Docker Hub.
if: github.ref_type == 'branch' && env.FARMOS_VERSION == '2.x'
run: docker push farmos/farmos:2.x-dev
# If a tag was pushed, tag the Docker image and push to Docker Hub.
# If the tag is a valid semantic versioning string, also tag "latest".
# Semver regex from https://github.com/semver/semver/issues/199#issuecomment-43640395
# If "latest" is tagged, we will also announce the release in a followup job.
- name: Tag and publish farmos/farmos:{tag} image to Docker Hub.
if: github.ref_type == 'tag'
run: |
docker tag farmos/farmos:2.x farmos/farmos:${{ env.FARMOS_VERSION }}
docker push farmos/farmos:${{ env.FARMOS_VERSION }}
if echo ${{ env.FARMOS_VERSION }} | grep -Pq '^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$'; then
docker tag farmos/farmos:2.x farmos/farmos:latest
docker push farmos/farmos:latest
echo "ANNOUNCE_RELEASE=1" >> $GITHUB_ENV
else
echo "ANNOUNCE_RELEASE=0" >> $GITHUB_ENV
fi
outputs:
announce: ${{ env.ANNOUNCE_RELEASE }}
announce:
name: Announce new release
if: needs.publish.outputs.announce
needs:
- build
- release
- publish
uses: farmOS/farmOS-microblog/.github/workflows/create-message.yml@main
with:
message: '#farmOS ${{ needs.build.outputs.farmos_version }} has been released! https://github.com/farmOS/farmOS/releases/${{ needs.build.outputs.farmos_version }}'
secrets:
MICROBLOG_DEPLOY_KEY: ${{ secrets.MICROBLOG_DEPLOY_KEY }}