name: 🧪 e2e test

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  youki-build:
    runs-on: ubuntu-22.04
    timeout-minutes: 15
    strategy:
      matrix:
        arch: [ "x86_64", "aarch64" ]
        libc: [ "gnu", "musl" ]
    steps:
      - uses: actions/checkout@v3
      - name: Setup Rust toolchain and cache
        uses: actions-rust-lang/setup-rust-toolchain@v1.3.7
        env:
          RUST_CACHE_KEY_OS: rust-cache-${{ matrix.arch }}-${{ matrix.libc }}
      - name: Install just
        uses: taiki-e/install-action@just
      - name: Install cross-rs
        run: cargo install cross --git https://github.com/cross-rs/cross
      - name: Setup target
        run: |
          echo "CARGO=cross" >> ${GITHUB_ENV}
          echo "TARGET=${{ matrix.arch }}-unknown-linux-${{ matrix.libc }}" >> ${GITHUB_ENV}
      - name: Build youki
        run: just youki-release
      - name: Upload youki binary
        if: ${{ matrix.arch == 'x86_64' }}
        uses: actions/upload-artifact@v3
        with:
          name: youki-${{ matrix.arch }}-${{ matrix.libc }}
          path: youki

  containerd-integration-tests:
    runs-on: ubuntu-22.04
    needs: [youki-build]
    timeout-minutes: 40
    strategy:
      matrix:
        arch: [ "x86_64" ]
        libc: [ "gnu", "musl" ]
    steps:
      - uses: actions/checkout@v3
        with:
          repository: containerd/containerd
          ref: v1.7.11
      - uses: actions/setup-go@v4
        with:
          go-version: '1.20.12'
          cache: true
      - run: sudo apt-get -y update
      - run: sudo apt-get install -y pkg-config libsystemd-dev libelf-dev libseccomp-dev btrfs-progs libbtrfs-dev
      - name: Build containerd
        run: |
          make build
          make binaries
          sudo make install
          ./script/setup/install-cni
          ./script/setup/install-critools
      - name: Download youki binary
        uses: actions/download-artifact@v3
        with:
          name: youki-${{ matrix.arch }}-${{ matrix.libc }}
      - name: Replace runc to youki
        run: |
          sudo rm -f /usr/bin/runc /usr/local/bin/runc /usr/sbin/runc
          sudo chmod 755 youki
          sudo cp youki /usr/bin/runc
          runc --version
      - name: Integration Test
        run: sudo make RUNC_FLAVOR=crun TEST_RUNTIME=io.containerd.runc.v2 TESTFLAGS="-timeout 40m" integration

  k8s-tests:
    runs-on: ubuntu-22.04
    needs: [youki-build]
    timeout-minutes: 40
    strategy:
      matrix:
        arch: [ "x86_64" ]
        libc: [ "gnu", "musl" ]
    steps:
      - uses: actions/checkout@v3
      - name: Download youki binary
        uses: actions/download-artifact@v3
        with:
          name: youki-${{ matrix.arch }}-${{ matrix.libc }}
      - name: Add the permission to run
        run: chmod +x ./youki
      - name: Install just
        uses: taiki-e/install-action@just
      - name: test/k8s/deploy
        run: just test-kind

  oci-validation-go:
    runs-on: ubuntu-22.04
    needs: [youki-build]
    timeout-minutes: 15
    strategy:
      matrix:
        arch: [ "x86_64" ]
        libc: [ "gnu", "musl" ]
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
      - name: Setup Rust toolchain and cache
        uses: actions-rust-lang/setup-rust-toolchain@v1
      - name: Install just
        uses: taiki-e/install-action@just
      - uses: actions/setup-go@v4
        with:
          go-version: '1.20'
          cache: true
          cache-dependency-path: tests/oci-runtime-tests/src/github.com/opencontainers/runtime-tools/go.sum
      - name: Download youki binary
        uses: actions/download-artifact@v3
        with:
          name: youki-${{ matrix.arch }}-${{ matrix.libc }}
      - name: Add the permission to run
        run: chmod +x ./youki
      - name: Run integration tests
        run: just test-oci

  oci-validation-rust:
    runs-on: ubuntu-22.04
    needs: [youki-build]
    timeout-minutes: 20
    strategy:
      matrix:
        arch: [ "x86_64" ]
        libc: [ "gnu", "musl" ]
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
      - name: Setup Rust toolchain and cache
        uses: actions-rust-lang/setup-rust-toolchain@v1
      - name: Install just
        uses: taiki-e/install-action@just
      - name: Install requirements
        run: sudo env PATH=$PATH just ci-prepare
      - name: Download youki binary
        uses: actions/download-artifact@v3
        with:
          name: youki-${{ matrix.arch }}-${{ matrix.libc }}
      - name: Add the permission to run
        run: chmod +x ./youki
      - name: Validate tests on youki
        run: just test-contest

  rootless-podman-test:
    runs-on: ubuntu-22.04
    needs: [youki-build]
    timeout-minutes: 20
    strategy:
      matrix:
        arch: [ "x86_64" ]
        libc: [ "gnu", "musl" ]
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
      - name: Setup Rust toolchain and cache
        uses: actions-rust-lang/setup-rust-toolchain@v1
      - name: Install just
        uses: taiki-e/install-action@just
      - name: Install requirements
        run: sudo env PATH=$PATH just ci-prepare
      - name: Download youki binary
        uses: actions/download-artifact@v3
        with:
          name: youki-${{ matrix.arch }}-${{ matrix.libc }}
      - name: Add the permission to run
        run: chmod +x ./youki
      - name: Run tests
        run: just test-rootless-podman
  
  docker-in-docker:
    runs-on: ${{ matrix.os }}
    needs: [youki-build]
    timeout-minutes: 5
    strategy:
      matrix:
        # ubuntu 20.04 has cgroups-v1
        # ubuntu 22.04 has cgroups-v2
        os: [ "ubuntu-22.04", "ubuntu-20.04" ]
    steps:
      - uses: actions/checkout@v3
      - name: Install just
        uses: taiki-e/install-action@just
      - name: Download youki binary
        uses: actions/download-artifact@v3
        with:
          name: youki-x86_64-musl
      - name: Add the permission to run
        run: chmod +x ./youki
      - name: Run tests
        run: just test-dind

    
