name: Test Suite
on:
  pull_request:
  push:
    branches:
      - main
      - 3.x
      - 2.x
      - 'renovate/*'
env:
  FORCE_COLOR: 1
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
        with:
          node-version: '12.10.0'
      - 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:
        DB: ['sqlite3', 'mysql']
    env:
      database__client: ${{ matrix.DB }}
      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.DB }}
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
          submodules: true
      - uses: actions/setup-node@v2
        with:
          node-version: '12.10.0'

      - name: Shutdown MySQL
        run: sudo service mysql stop
        if: matrix.DB == 'mysql'

      - uses: mirromutth/mysql-action@v1.1
        if: matrix.DB == 'mysql'
        with:
          mysql version: '5.7'
          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

  test:
    runs-on: ubuntu-18.04
    if: github.event_name == 'push' || (github.event_name == 'pull_request' && !startsWith(github.head_ref, 'renovate/'))
    strategy:
      matrix:
        node: [ '10.13.0', '12.10.0', '14.15.0' ]
        env:
          - DB: sqlite3
            NODE_ENV: testing
          - DB: mysql
            NODE_ENV: testing-mysql
    env:
      DB: ${{ matrix.env.DB }}
      NODE_ENV: ${{ matrix.env.NODE_ENV }}
      database__connection__password: root
    name: Node ${{ matrix.node }} - ${{ matrix.env.DB }}
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: ${{ matrix.node }}

      - name: Shutdown MySQL
        run: sudo service mysql stop
        if: matrix.env.DB == 'mysql'

      - uses: mirromutth/mysql-action@v1.1
        if: matrix.env.DB == 'mysql'
        with:
          mysql version: '5.7'
          mysql database: 'ghost_testing'
          mysql root password: 'root'

      - run: yarn
      - run: grunt test-acceptance --verbose
        env:
          database__connection__filename: /dev/shm/ghost-test.db
      - run: grunt test-unit --verbose
      - run: grunt test-regression --verbose
        env:
          database__connection__filename: /dev/shm/ghost-test.db

      - 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
        with:
          node-version: '10.13.0'
      - 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

      - 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, test, ghost-cli]
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    name: Canary
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
          submodules: true
      - uses: actions/setup-node@v2
        with:
          node-version: '12.18.0'

      - name: Set up Git
        run: |
          git config --global pull.rebase true
          git config --global user.name "Ghost CI"
          git config --global user.email "ghost@example.com"

      - run: yarn
      - run: grunt master

      - run: echo "ghost_hash=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
      - run: echo "ghost_admin_hash=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
        working-directory: core/client
      - run: if [ -n "$(git status --porcelain)" ]; then git add core/client content/themes/casper && git commit -m "Updated Ghost-Admin and Casper"; fi

      - run: npm version prerelease --preid="pre.$ghost_hash.$ghost_admin_hash"
      - run: npm version prerelease --preid="pre.$ghost_hash.$ghost_admin_hash"
        working-directory: core/client

      - run: grunt release --skip-update

      - uses: actions/upload-artifact@v2
        with:
          name: ghost-canary
          path: .dist/release/*
          retention-days: 7
