Ghost/.github/workflows/test.yml
Daniel Lockyer 08eaed152b Added yarn test:ci command
refs https://github.com/TryGhost/Toolbox/issues/208

- we currently run all test commands separately in CI and this can make
  it harder to replicate any issues we see in CI because we have to
  manually go and copy the order of the tests
- it's also nicer if there's just one command that runs so we can make
  changes globally to CI
- this commit adds a test:ci yarn command which will run the tests in
  order of speed/importance, with the -b AKA fail-fast flag so we
  don't have to wait for all tests to run before finding out about
  issues
- this also cleans up running unit tests in the DB matrix
2022-02-16 19:22:20 +01:00

299 lines
9.2 KiB
YAML

name: Test Suite
on:
pull_request:
push:
branches:
- main
- 'v4.*'
- 3.x
- 2.x
- 'renovate/*'
env:
FORCE_COLOR: 1
concurrency:
group: ${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
lint:
runs-on: ubuntu-18.04
if: github.event_name == 'push' || (github.event_name == 'pull_request' && !startsWith(github.head_ref, 'renovate/'))
name: Lint
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
env:
FORCE_COLOR: 0
with:
node-version: '14.17.0'
cache: yarn
- run: yarn
- run: yarn lint
- uses: daniellockyer/action-slack-build@master
if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main'
with:
status: ${{ job.status }}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
migrations:
runs-on: ubuntu-18.04
if: github.event_name == 'push' || (github.event_name == 'pull_request' && !startsWith(github.head_ref, 'renovate/'))
strategy:
matrix:
env:
- DB: sqlite3
DB_CLIENT: sqlite3
- DB: mysql5
DB_CLIENT: mysql
- DB: mysql8
DB_CLIENT: mysql
env:
database__client: ${{ matrix.env.DB_CLIENT }}
database__connection__filename: /dev/shm/ghost-test.db
database__connection__host: 127.0.0.1
database__connection__user: root
database__connection__password: root
database__connection__database: ghost_testing
name: Migrations (${{ matrix.env.DB }})
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: true
- uses: actions/setup-node@v2
env:
FORCE_COLOR: 0
with:
node-version: '14.17.0'
cache: yarn
- name: Shutdown MySQL
run: sudo service mysql stop
if: matrix.env.DB == 'mysql5' || matrix.env.DB == 'mysql8'
- uses: daniellockyer/mysql-action@main
if: matrix.env.DB == 'mysql5'
with:
mysql version: '5.7'
mysql database: 'ghost_testing'
mysql root password: 'root'
- uses: daniellockyer/mysql-action@main
if: matrix.env.DB == 'mysql8'
with:
mysql version: '8.0'
mysql database: 'ghost_testing'
mysql root password: 'root'
- run: yarn
- run: |
node index.js &
sleep 20 && { kill $! && wait $!; } 2>/dev/null
- run: yarn knex-migrator rollback --v 4.0 --force
- run: yarn knex-migrator migrate --force
unit-tests:
runs-on: ubuntu-18.04
if: github.event_name == 'push' || (github.event_name == 'pull_request' && !startsWith(github.head_ref, 'renovate/'))
strategy:
matrix:
node: [ '12.22.1', '14.17.0', '16.13.0' ]
name: Unit Tests (Node ${{ matrix.node }})
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
env:
FORCE_COLOR: 0
with:
node-version: ${{ matrix.node }}
cache: yarn
- run: yarn
- run: yarn test:unit
- name: Unit test coverage
run: yarn cov:unit
- uses: codecov/codecov-action@v2
- uses: daniellockyer/action-slack-build@master
if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main'
with:
status: ${{ job.status }}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
database-tests:
runs-on: ubuntu-18.04
if: github.event_name == 'push' || (github.event_name == 'pull_request' && !startsWith(github.head_ref, 'renovate/'))
strategy:
matrix:
node: [ '12.22.1', '14.17.0', '16.13.0' ]
env:
- DB: sqlite3
NODE_ENV: testing
- DB: mysql5
NODE_ENV: testing-mysql
- DB: mysql8
NODE_ENV: testing-mysql
env:
DB: ${{ matrix.env.DB }}
NODE_ENV: ${{ matrix.env.NODE_ENV }}
database__connection__password: root
name: Database Tests (Node ${{ matrix.node }}, ${{ matrix.env.DB }})
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
env:
FORCE_COLOR: 0
with:
node-version: ${{ matrix.node }}
cache: yarn
- name: Shutdown MySQL
run: sudo service mysql stop
if: matrix.env.DB == 'mysql5' || matrix.env.DB == 'mysql8'
- uses: daniellockyer/mysql-action@main
if: matrix.env.DB == 'mysql5'
with:
mysql version: '5.7'
mysql database: 'ghost_testing'
mysql root password: 'root'
- uses: daniellockyer/mysql-action@main
if: matrix.env.DB == 'mysql8'
with:
mysql version: '8.0'
mysql database: 'ghost_testing'
mysql root password: 'root'
- run: yarn
- run: date +%s > ${{ runner.temp }}/startTime # Get start time for test suite
- name: Run tests
run: yarn test:ci
env:
database__connection__filename: /dev/shm/ghost-test.db
# Get runtime in seconds for test suite
- run: |
startTime="$(cat ${{ runner.temp }}/startTime)"
endTime="$(date +%s)"
echo "test_time=$(($endTime-$startTime))" >> $GITHUB_ENV
# Continue on error if TailScale service is down
- name: Tailscale Action
timeout-minutes: 2
continue-on-error: true
if: (github.event_name == 'push' && github.repository_owner == 'TryGhost') || (github.event_name == 'pull_request' && startsWith(github.head_ref, 'TryGhost/'))
uses: tailscale/github-action@v1
with:
authkey: ${{ secrets.TAILSCALE_AUTHKEY }}
# Report time taken to metrics service
# Continue on error if previous TailScale step fails
- uses: sam-lord/action-trigger-metric@main
timeout-minutes: 1
continue-on-error: true
if: (github.event_name == 'push' && github.repository_owner == 'TryGhost') || (github.event_name == 'pull_request' && startsWith(github.head_ref, 'TryGhost/'))
with:
metricName: 'test-time'
metricValue: ${{ env.test_time }}
configuration: |
{
"metrics": {
"transports": ["elasticsearch"],
"metadata": {
"database": "${{ matrix.env.DB }}",
"node": "${{ matrix.node }}"
}
},
"elasticsearch": {
"host": "${{ secrets.ELASTICSEARCH_HOST }}",
"username": "${{ secrets.ELASTICSEARCH_USERNAME }}",
"password": "${{ secrets.ELASTICSEARCH_PASSWORD }}"
}
}
- uses: daniellockyer/action-slack-build@master
if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main'
with:
status: ${{ job.status }}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
ghost-cli:
name: Ghost-CLI
if: github.event_name == 'push' || (github.event_name == 'pull_request' && !startsWith(github.head_ref, 'renovate/'))
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: true
- uses: actions/setup-node@v2
env:
FORCE_COLOR: 0
with:
node-version: '12.22.1'
cache: yarn
- run: npm install -g ghost-cli@latest
- run: npm --no-git-tag-version version minor # We need to artificially bump the minor version to get migrations to run
- run: zip -r ghost.zip .
- name: Clean Install
run: |
DIR=$(mktemp -d)
ghost install local -d $DIR --zip $GITHUB_WORKSPACE/ghost.zip
- name: Latest Release
run: |
DIR=$(mktemp -d)
ghost install local -d $DIR
ghost update -d $DIR --zip $GITHUB_WORKSPACE/ghost.zip
#- name: Update from latest v1
#run: |
#DIR=$(mktemp -d)
#ghost install v1 --local -d $DIR
#ghost update -f -d $DIR --zip $GITHUB_WORKSPACE/ghost.zip
#- name: Update from latest v2
#run: |
#DIR=$(mktemp -d)
#ghost install v2 --local -d $DIR
#ghost update -f -d $DIR --zip $GITHUB_WORKSPACE/ghost.zip
- name: Update from latest v3
run: |
DIR=$(mktemp -d)
ghost install v3 --local -d $DIR
ghost update -f -d $DIR --zip $GITHUB_WORKSPACE/ghost.zip
- name: Print debug logs
if: failure()
run: |
[ -f ~/.ghost/logs/*.log ] && cat ~/.ghost/logs/*.log
- uses: daniellockyer/action-slack-build@master
if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main'
with:
status: ${{ job.status }}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
canary:
runs-on: ubuntu-18.04
needs: [lint, migrations, unit-tests, database-tests, ghost-cli]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
name: Canary
steps:
- name: Invoke Canary Build
uses: benc-uk/workflow-dispatch@v1
with:
workflow: Canary Build
token: ${{ secrets.RELEASE_TOKEN }}