hummingbird-me/kitsu-server

View on GitHub
.github/workflows/test.yml

Summary

Maintainability
Test Coverage
name: Kitsu Test Suite

on:
  push:
  pull_request:
    # Branches from forks have the form 'user:branch-name' so we only run
    # this job on pull_request events for branches that look like fork
    # branches. Without this we would end up running this job twice for non
    # forked PRs, once for the push and then once for opening the PR.
    branches:
    - '**:**'

env:
  STREAM_API_KEY: q3k9n9kqk3fb
  STREAM_API_SECRET: vkw87x3p323z6ma75n8dvnse98jrr9gkauf2zfjnzbgjpmm54ssnbync4yhhzugc
  CC_TEST_REPORTER_ID: 5e2172ea5a30b07e172058a3b33dfe08c6354699808e8f3010acc32b1ef41395
  BUNDLE_GITHUB__HTTPS: true
  LOG_LEVEL: warn
  AWS_DEFAULT_REGION: us-east-1
  IMAGEMAGICK_VERSION: 7.1.1-29
  SENTRY_ORG: kitsu
  SENTRY_PROJECT: server
  SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_TOKEN }}

jobs:
  check_secrets:
    runs-on: ubuntu-latest
    outputs:
      SECRETS_AVAILABLE: ${{ steps.check.outputs.SECRETS_AVAILABLE }}
    steps:
      - id: check
        run: |
          echo "SECRETS_AVAILABLE=${{ env.SECRETS_AVAILABLE == 'yes' }}" >> $GITHUB_OUTPUT
        env:
          SECRETS_AVAILABLE: ${{ secrets.AVAILABLE }}

  test:
    name: RSpec Test Suite
    runs-on: ubuntu-latest
    continue-on-error: ${{ matrix.experimental }}
    strategy:
      fail-fast: false
      matrix:
        ruby:
          - ruby-3.1
        experimental: [false]
        include:
          - ruby: ruby-3.2
            experimental: true

    services:
      minio:
        image: fclairamb/minio-github-actions
        options: --health-cmd "curl -s -o /dev/null -I http://127.0.0.1:9000/minio/index.html" --health-interval 10s --health-timeout 5s --health-retries 5
        ports:
          - 9000:9000
        env:
          MINIO_ACCESS_KEY: miniotest
          MINIO_SECRET_KEY: miniotest
      postgres:
        image: postgres:10-alpine
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
          POSTGRES_DB: kitsu_test
        ports:
          - 5432:5432
      redis:
        image: redis:alpine
        ports:
          - 6379:6379
      elasticsearch:
        image: elasticsearch:2-alpine
        ports:
          - 9200:9200
      typesense:
        image: typesense/typesense:0.25.0
        ports:
          - 8108:8108
        env:
          TYPESENSE_DATA_DIR: /tmp
          TYPESENSE_API_KEY: xyz


    env:
      AWS_ENDPOINT: http://localhost:9000
      AWS_BUCKET: kitsu-ugc-test
      AWS_ACCESS_KEY_ID: miniotest
      AWS_SECRET_ACCESS_KEY: miniotest
      DATABASE_URL: postgresql://postgres:postgres@localhost:5432/kitsu_test
      REDIS_URL: redis://localhost:6379/1
      ELASTICSEARCH_URL: localhost:9200
      TYPESENSUAL_API_KEY: xyz
      TYPESENSUAL_NODES: http://localhost:8108/

    steps:
    - name: Checkout Repository
      uses: actions/checkout@v3

    - name: Install Dependencies
      run: |
        sudo add-apt-repository universe
        sudo apt-get update
        sudo apt-get -yqq install libpq-dev libfuse2

    - name: Install libvips
      run: |
        sudo apt-get -yqq install libvips libvips-dev libraqm-dev ffmpeg

    - name: Set up Ruby (${{ matrix.ruby }})
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: ${{ matrix.ruby }}
        bundler-cache: true

    - name: Set up Test Environment
      if: "! contains(toJSON(github.event.commits.*.message), '[skip ci]')"
      run: |
        aws --endpoint-url $AWS_ENDPOINT s3 mb s3://$AWS_BUCKET
        bundle exec rake db:create db:schema:load

    - name: Run RSpec Suite
      if: "! contains(toJSON(github.event.commits.*.message), '[skip ci]')"
      run: |
        bundle exec rspec

    - name: Dump Schema
      run: |
        bundle exec rake graphql:dump_schema

    - uses: actions/upload-artifact@v3
      with:
        name: graphql-schema-${{ matrix.ruby }}
        path: schema.graphql

    - name: Publish code coverage
      uses: paambaati/codeclimate-action@v4.0.0
      if: "! contains(toJSON(github.event.commits.*.message), '[skip ci]')"
      continue-on-error: true

  build:
    needs: [check_secrets]
    name: Build Docker Image
    runs-on: ubuntu-latest
    if: github.event_name == 'push' && needs.check_secrets.outputs.SECRETS_AVAILABLE == 'true'

    steps:
    - name: Install Sentry CLI
      run: curl -sL https://sentry.io/get-cli/ | bash
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2
    - name: Checkout Repository
      uses: actions/checkout@v3
    - name: Connect to Container Registry
      uses: docker/login-action@v2
      with:
        registry: ghcr.io
        username: Senkosan
        password: ${{ secrets.SENKO_SAN_KEY }}

    - name: Set version
      run: |
        echo "version=${GITHUB_SHA::8}" >> $GITHUB_ENV
        echo "${GITHUB_SHA::8}" > .version
    - name: Report Release to Sentry
      run: sentry-cli releases new ${{ env.version }}
    - name: Add Commits to Sentry Release
      run: sentry-cli releases set-commits --auto ${{ env.version }}

    - name: Build Docker Image
      uses: docker/build-push-action@v4
      with:
        context: .
        push: true
        tags: ghcr.io/hummingbird-me/kitsu-server:${{ env.version }}
        cache-from: type=gha
        cache-to: type=gha,mode=max

    - name: Finalize Sentry Release
      if: success()
      run: sentry-cli releases finalize ${{ env.version }}

  deploy:
    name: Deploy to Staging
    runs-on: ubuntu-latest
    needs: [test, build]
    if: success() && github.ref == 'refs/heads/the-future'

    steps:
    - name: Trigger Deployment
      uses: octokit/request-action@v2.x
      with:
        route: POST /repos/:repo/deployments
        repo: ${{ github.repository }}
        ref: ${{ github.sha }}
        environment: staging
        auto_merge: false
        description: "Deploy ${{ github.sha }} to Staging"
        mediaType: '{"previews": ["flash"]}'
        required_contexts: "[]"
      env:
        GITHUB_TOKEN: ${{ secrets.SENKO_SAN_KEY }}