name: Invidious CI

on:
  schedule:
    - cron: "0 0 * * *" # Every day at 00:00
  push:
    branches:
      - "master"
      - "api-only"
  pull_request:
    branches: "*"
    paths-ignore:
      - "*.md"
      - LICENCE
      - TRANSLATION
      - invidious.service
      - .git*
      - .editorconfig

      - screenshots/*
      - assets/**
      - locales/*
      - config/**
      - .github/ISSUE_TEMPLATE/*
      - kubernetes/**

jobs:
  build:

    runs-on: ubuntu-latest

    name: "build - crystal: ${{ matrix.crystal }}, stable: ${{ matrix.stable }}"

    continue-on-error: ${{ !matrix.stable }}

    strategy:
      fail-fast: false
      matrix:
        stable: [true]
        crystal:
          - 1.9.2
          - 1.10.1
          - 1.11.2
          - 1.12.1
        include:
          - crystal: nightly
            stable: false

    steps:
      - uses: actions/checkout@v4
        with:
          submodules: true

      - name: Install Crystal
        uses: crystal-lang/install-crystal@v1.8.0
        with:
          crystal: ${{ matrix.crystal }}

      - name: Cache Shards
        uses: actions/cache@v3
        with:
          path: ./lib
          key: shards-${{ hashFiles('shard.lock') }}

      - name: Install Shards
        run: |
          if ! shards check; then
            shards install
          fi

      - name: Run tests
        run: crystal spec

      - name: Run lint
        run: |
          if ! crystal tool format --check; then
            crystal tool format
            git diff
            exit 1
          fi

      - name: Build
        run: crystal build --warnings all --error-on-warnings --error-trace src/invidious.cr

  build-docker:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Build Docker
        run: docker compose build --build-arg release=0

      - name: Run Docker
        run: docker compose up -d

      - name: Test Docker
        run: while curl -Isf http://localhost:3000; do sleep 1; done

  build-docker-arm64:

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        with:
          platforms: arm64

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Build Docker ARM64 image
        uses: docker/build-push-action@v5
        with:
          context: .
          file: docker/Dockerfile.arm64
          platforms: linux/arm64/v8
          build-args: release=0

      - name: Test Docker
        run: while curl -Isf http://localhost:3000; do sleep 1; done

  ameba_lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: true

      - name: Install Crystal
        uses: crystal-lang/install-crystal@v1.8.0
        with:
          crystal: latest

      - name: Cache Shards
        uses: actions/cache@v3
        with:
          path: |
            ./lib
            ./bin
          key: shards-${{ hashFiles('shard.lock') }}

      - name: Install Shards
        run: shards install

      - name: Run Ameba linter
        run: bin/ameba
