name: ci

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

jobs:
  fmt:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run ./ci/steps/fmt.sh
        uses: ./ci/images/debian10
        with:
          args: ./ci/steps/fmt.sh

  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run ./ci/steps/lint.sh
        uses: ./ci/images/debian10
        with:
          args: ./ci/steps/lint.sh

  test-unit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - name: Run unit tests
        uses: ./ci/images/debian10
        with:
          args: ./ci/steps/test-unit.sh
  test-e2e:
    needs: linux-amd64
    runs-on: ubuntu-latest
    env:
      PASSWORD: e45432jklfdsab
      CODE_SERVER_ADDRESS: http://localhost:8080
    steps:
      - uses: actions/checkout@v2
      - name: Download release packages
        uses: actions/download-artifact@v2
        with:
          name: release-packages
          path: ./release-packages
      - name: Untar code-server file
        run: |
          cd release-packages && tar -xzf code-server*-linux-amd64.tar.gz
      - uses: microsoft/playwright-github-action@v1
      - name: Install dependencies and run end-to-end tests
        run: |
          ./release-packages/code-server*-linux-amd64/bin/code-server &
          yarn --frozen-lockfile
          yarn test:e2e
      - name: Upload test artifacts
        if: always()
        uses: actions/upload-artifact@v2
        with:
          name: test-videos
          path: ./test/e2e/videos
      - name: Remove release packages and test artifacts
        run: rm -rf ./release-packages ./test/e2e/videos

  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run ./ci/steps/release.sh
        uses: ./ci/images/debian10
        with:
          args: ./ci/steps/release.sh
      - name: Upload npm package artifact
        uses: actions/upload-artifact@v2
        with:
          name: npm-package
          path: ./release-npm-package

  linux-amd64:
    needs: release
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Download npm package
        uses: actions/download-artifact@v2
        with:
          name: npm-package
          path: ./release-npm-package
      - name: Run ./ci/steps/release-packages.sh
        uses: ./ci/images/centos7
        with:
          args: ./ci/steps/release-packages.sh
      - name: Upload release artifacts
        uses: actions/upload-artifact@v2
        with:
          name: release-packages
          path: ./release-packages

  linux-arm64:
    needs: release
    runs-on: ubuntu-arm64-latest
    steps:
      - uses: actions/checkout@v2
      - name: Download npm package
        uses: actions/download-artifact@v2
        with:
          name: npm-package
          path: ./release-npm-package
      - name: Run ./ci/steps/release-packages.sh
        uses: ./ci/images/centos7
        with:
          args: ./ci/steps/release-packages.sh
      - name: Upload release artifacts
        uses: actions/upload-artifact@v2
        with:
          name: release-packages
          path: ./release-packages
      - name: Remove docker images
        run: docker system prune -af

  macos-amd64:
    needs: release
    runs-on: macos-latest
    # This job requires secrets, so can only run on the default branch
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v2
      - name: Download npm package
        uses: actions/download-artifact@v2
        with:
          name: npm-package
          path: ./release-npm-package
      - run: ./ci/steps/release-packages.sh
        env:
          # Otherwise we get rate limited when fetching the ripgrep binary.
          # For whatever reason only MacOS needs it.
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Upload release artifacts
        uses: actions/upload-artifact@v2
        with:
          name: release-packages
          path: ./release-packages

  docker-amd64:
    runs-on: ubuntu-latest
    needs: linux-amd64
    steps:
      - uses: actions/checkout@v2
      - name: Download release package
        uses: actions/download-artifact@v2
        with:
          name: release-packages
          path: ./release-packages
      - name: Run ./ci/steps/build-docker-image.sh
        uses: ./ci/images/debian10
        with:
          args: ./ci/steps/build-docker-image.sh
      - name: Upload release image
        uses: actions/upload-artifact@v2
        with:
          name: release-images
          path: ./release-images

  docker-arm64:
    runs-on: ubuntu-arm64-latest
    needs: linux-arm64
    steps:
      - uses: actions/checkout@v2
      - name: Download release package
        uses: actions/download-artifact@v2
        with:
          name: release-packages
          path: ./release-packages
      - name: Run ./ci/steps/build-docker-image.sh
        uses: ./ci/images/centos7
        with:
          args: ./ci/steps/build-docker-image.sh
      - name: Upload release image
        uses: actions/upload-artifact@v2
        with:
          name: release-images
          path: ./release-images
