name: CI

on:
  pull_request:
  push:
    branches:
      - trunk
  schedule:
    - cron: "0 */12 * * *"
  workflow_dispatch:

jobs:
  check:
    name: Check
    runs-on: ubuntu-latest
    outputs:
      targets: ${{ steps.check-targets.outputs.bazel-targets }}
    steps:
      - name: Checkout source tree
        uses: actions/checkout@v4
        with:
          fetch-depth: 50
      - name: Setup Bazel
        uses: bazel-contrib/setup-bazel@0.8.5
        with:
          bazelisk-cache: true
          cache-version: 2
          external-cache: |
            name: ci-check
            manifest:
              crates: rust/Cargo.Bazel.lock
              rules_ruby~~ruby~ruby: rb/.ruby-version
          repository-cache: true
      - name: Check Bazel targets
        id: check-targets
        run: ./scripts/github-actions/check-bazel-targets.sh
        env:
          COMMIT_RANGE: ${{ github.event.pull_request.base.sha || github.event.before }}...${{ github.event.pull_request.head.sha || github.sha }}

  dotnet:
    name: .NET
    needs: check
    uses: ./.github/workflows/ci-dotnet.yml
    if: >
      github.event_name == 'schedule' ||
      github.event_name == 'workflow_dispatch' ||
      contains(needs.check.outputs.targets, '//dotnet') ||
      contains(join(github.event.commits.*.message), '[dotnet]') ||
      contains(github.event.pull_request.title, '[dotnet]')

  java:
    name: Java
    needs: check
    uses: ./.github/workflows/ci-java.yml
    if: >
      github.event_name == 'schedule' ||
      github.event_name == 'workflow_dispatch' ||
      contains(needs.check.outputs.targets, '//java') ||
      contains(join(github.event.commits.*.message), '[java]') ||
      contains(github.event.pull_request.title, '[java]')

  python:
    name: Python
    needs: check
    uses: ./.github/workflows/ci-python.yml
    if: >
      github.event_name == 'schedule' ||
      github.event_name == 'workflow_dispatch' ||
      contains(needs.check.outputs.targets, '//py') ||
      contains(join(github.event.commits.*.message), '[py]') ||
      contains(github.event.pull_request.title, '[py]')

  ruby:
    name: Ruby
    needs: check
    uses: ./.github/workflows/ci-ruby.yml
    if: >
      github.event_name == 'schedule' ||
      github.event_name == 'workflow_dispatch' ||
      contains(needs.check.outputs.targets, '//rb') ||
      contains(join(github.event.commits.*.message), '[rb]') ||
      contains(github.event.pull_request.title, '[rb]')

  rust:
    name: Rust
    needs: check
    uses: ./.github/workflows/ci-rust.yml
    secrets:
      SELENIUM_CI_TOKEN: ${{ secrets.SELENIUM_CI_TOKEN }}
    if: >
      github.event_name == 'schedule' ||
      github.event_name == 'workflow_dispatch' ||
      contains(needs.check.outputs.targets, '//rust') ||
      contains(join(github.event.commits.*.message), '[rust]') ||
      contains(github.event.pull_request.title, '[rust]')
