name: CI

on:
  push:
    branches: ["**", "stable/**"]
  pull_request:
    branches: ["**", "stable/**"]

env:
  CARGO_TERM_COLOR: always

jobs:
  build:
    name: Build and Lint
    timeout-minutes: 10
    runs-on: ubuntu-latest
    steps:
      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: "1.20.1"
      - name: Check out code
        uses: actions/checkout@v3
      - name: cache go mod
        uses: actions/cache@v3
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go
      - name: Build
        run: |
          go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.51.2
          export PATH=$PATH:$(go env GOPATH)/bin
          make
          make test
          make check
  build-optimizer:
    name: Build optimizer
    timeout-minutes: 10
    runs-on: ubuntu-latest
    steps:
      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: "1.20.1"
      - name: Check out code
        uses: actions/checkout@v3
      - name: cache go mod
        uses: actions/cache@v3
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go
      - name: Build
        run: |
          go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.51.2
          export PATH=$PATH:$(go env GOPATH)/bin
          rustup component add rustfmt clippy
          make build-optimizer
  smoke:
    name: Smoke
    timeout-minutes: 10
    runs-on: ubuntu-latest
    steps:
      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: "1.19.6"
      - name: Check out code
        uses: actions/checkout@v3
      - name: cache go mod
        uses: actions/cache@v3
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go
      - name: Set up containerd
        uses: crazy-max/ghaction-setup-containerd@v2
      - name: Build
        run: |
          # Download nydus components
          NYDUS_VER=v$(curl --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' -s "https://api.github.com/repos/dragonflyoss/nydus/releases/latest" | jq -r .tag_name | sed 's/^v//')
          wget https://github.com/dragonflyoss/nydus/releases/download/$NYDUS_VER/nydus-static-$NYDUS_VER-linux-amd64.tgz
          tar xzvf nydus-static-$NYDUS_VER-linux-amd64.tgz
          mkdir -p /usr/bin
          sudo mv nydus-static/nydus-image nydus-static/nydusd nydus-static/nydusify /usr/bin/
          export PATH=$PATH:$(go env GOPATH)/bin
          make smoke

  cross-build-test:
    name: Cross Build Test
    timeout-minutes: 10
    runs-on: ubuntu-latest
    strategy:
      matrix:
        GOOS: ["linux", "windows", "darwin"]
        GOARCH: ["amd64", "arm64"]
    steps:
      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version: "1.19.6"
      - name: Check out code
        uses: actions/checkout@v3
      - name: cache go mod
        uses: actions/cache@v3
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go
      - name: Build
        run: |
          make -e GOOS=${{ matrix.GOOS }} GOARCH=${{ matrix.GOARCH }} converter

  coverage:
    name: Code coverage
    timeout-minutes: 10
    runs-on: ubuntu-latest
    needs: [build]
    steps:
      - name: Install Go
        uses: actions/setup-go@v3
        with:
          go-version: "1.19.6"
      - name: Checkout code
        uses: actions/checkout@v3
      - name: cache go mod
        uses: actions/cache@v3
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go
      - name: Run unit tests.
        run: make cover
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v3
        with:
          token: ${{ secrets.CODECOV_TOKEN }} # not required for public repos
          files: ./coverage.txt
