name: stable-linux

on:
  workflow_dispatch:
    inputs:
      new_release:
        type: boolean
        description: Force new Release
  schedule:
    - cron: '0 18 * * *'
  push:
    branches: [ master ]
    paths-ignore:
    - '**/*.md'
  pull_request:
    branches: [ master ]
    paths-ignore:
    - '**/*.md'

env:
  APP_NAME: VSCodium
  ASSETS_REPOSITORY: ${{ github.repository }}
  OS_NAME: linux
  VERSIONS_REPOSITORY: ${{ github.repository_owner }}/versions
  VSCODE_QUALITY: stable

jobs:
  check:
    runs-on: ubuntu-latest
    container:
      image: vscodium/vscodium-linux-build-agent:bionic-x64
    outputs:
      MS_COMMIT: ${{ env.MS_COMMIT }}
      MS_TAG: ${{ env.MS_TAG }}
      RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
      SHOULD_BUILD: ${{ env.SHOULD_BUILD }}
      SHOULD_DEPLOY: ${{ env.SHOULD_DEPLOY }}

    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ env.GITHUB_BRANCH }}

      - name: Clone VSCode repo
        run: ./get_repo.sh

      - name: Check PR or cron
        run: ./check_cron_or_pr.sh

  dependencies:
    needs:
      - check
    runs-on: ubuntu-latest
    env:
      MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
      MS_TAG: ${{ needs.check.outputs.MS_TAG }}
      RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
    strategy:
      fail-fast: false
      matrix:
        include:
        - vscode_arch: x64
          image: vscodium/vscodium-linux-build-agent:centos7-devtoolset8-x64
        # - vscode_arch: arm64
        #   image: vscodium/vscodium-linux-build-agent:bionic-x64
    container:
      image: ${{ matrix.image }}
    if: needs.check.outputs.SHOULD_BUILD == 'yes' || needs.check.outputs.SHOULD_DEPLOY == 'yes'

    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ env.GITHUB_BRANCH }}

      - name: Clone VSCode repo
        run: ./get_repo.sh

      - uses: docker/setup-qemu-action@v2
        if: matrix.vscode_arch == 'arm64'

      - name: Setup Node.js environment
        uses: actions/setup-node@v3
        with:
          node-version: 16

      - name: Install Yarn
        run: npm install -g yarn

      - name: Install remote dependencies (x64)
        env:
          npm_config_arch: x64
        run: ./install_remote_dependencies.sh
        if: matrix.vscode_arch == 'x64'

      # - name: Install remote dependencies (arm64)
      #   run: |
      #     set -e
      #     docker run -e VSCODE_QUALITY -e GITHUB_TOKEN -v $(pwd):/root/vscodium vscodium/vscodium-linux-build-agent:centos7-devtoolset8-arm64 /root/vscodium/install_remote_dependencies.sh
      #   if: matrix.vscode_arch == 'arm64'

      - name: Save remote dependencies
        uses: actions/upload-artifact@v3
        with:
          name: remote-dependencies-${{ matrix.vscode_arch }}
          path: ./remote-dependencies.tar
          retention-days: ${{ needs.check.outputs.SHOULD_DEPLOY == 'yes' && 30 || 1 }}

  build:
    needs:
      - check
      - dependencies
    runs-on: ubuntu-latest
    env:
      MS_COMMIT: ${{ needs.check.outputs.MS_COMMIT }}
      MS_TAG: ${{ needs.check.outputs.MS_TAG }}
      RELEASE_VERSION: ${{ needs.check.outputs.RELEASE_VERSION }}
      SHOULD_BUILD: ${{ needs.check.outputs.SHOULD_BUILD }}
      SHOULD_DEPLOY: ${{ needs.check.outputs.SHOULD_DEPLOY }}
    strategy:
      fail-fast: false
      matrix:
        include:
        - vscode_arch: x64
          npm_arch: x64
          image: vscodium/vscodium-linux-build-agent:bionic-x64
        - vscode_arch: arm64
          npm_arch: arm64
          image: vscodium/vscodium-linux-build-agent:stretch-arm64
        - vscode_arch: armhf
          npm_arch: armv7l
          image: vscodium/vscodium-linux-build-agent:stretch-armhf
    container:
      image: ${{ matrix.image }}
      env:
        VSCODE_ARCH: ${{ matrix.vscode_arch }}
    outputs:
      RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
      SHOULD_BUILD: ${{ env.SHOULD_BUILD }}
      SHOULD_DEPLOY: ${{ env.SHOULD_DEPLOY }}
    if: needs.check.outputs.SHOULD_BUILD == 'yes' || needs.check.outputs.SHOULD_DEPLOY == 'yes'

    steps:
      - uses: actions/checkout@v3

      - name: Clone VSCode repo
        run: ./get_repo.sh

      - name: Install GH
        run: ./install_gh.sh

      - name: Setup Node.js environment
        uses: actions/setup-node@v3
        with:
          node-version: 16

      - name: Install Yarn
        run: npm install -g yarn

      - name: Check existing VSCodium tags/releases
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          NEW_RELEASE: ${{ github.event.inputs.new_release }}
        run: ./check_tags.sh
        if: env.SHOULD_DEPLOY == 'yes'

      - name: Restore remote dependencies
        uses: actions/download-artifact@v3
        with:
          name: remote-dependencies-${{ matrix.vscode_arch }}
        if: env.SHOULD_BUILD == 'yes' && matrix.vscode_arch == 'x64'

      - name: Build
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          npm_config_arch: ${{ matrix.npm_arch }}
        run: ./build.sh
        if: env.SHOULD_BUILD == 'yes'

      - name: Prepare assets
        run: ./prepare_assets.sh
        if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'

      - name: Release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: ./release.sh
        if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'

      - name: Update versions repo
        env:
          GITHUB_TOKEN: ${{ secrets.STRONGER_GITHUB_TOKEN }}
          GITHUB_USERNAME: ${{ github.repository_owner }}
        run: ./update_version.sh
        if: env.SHOULD_BUILD == 'yes' && env.SHOULD_DEPLOY == 'yes'

  aur:
    needs:
      - build
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        include:
        - package_name: vscodium
          package_type: stable
        - package_name: vscodium-git
          package_type: rolling
    if: needs.build.outputs.SHOULD_DEPLOY == 'yes'

    steps:
      - name: Publish ${{ matrix.package_name }}
        uses: zokugun/github-actions-aur-releaser@v1
        with:
          package_name: ${{ matrix.package_name }}
          package_type: ${{ matrix.package_type }}
          aur_private_key: ${{ secrets.AUR_PRIVATE_KEY }}
          aur_username: ${{ secrets.AUR_USERNAME }}
          aur_email: ${{ secrets.AUR_EMAIL }}

  snap:
    needs:
      - build
    runs-on: ubuntu-latest
    env:
      APP_NAME: codium
    strategy:
      fail-fast: false
      matrix:
        platform:
        - amd64
        - arm64
    if: needs.build.outputs.SHOULD_DEPLOY == 'yes'

    steps:
      - uses: actions/checkout@v3

      - name: Check version
        env:
          ARCHITECTURE: ${{ matrix.platform }}
          SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
        run: ./stores/snapcraft/check_version.sh

      - uses: docker/setup-qemu-action@v1
        if: env.SHOULD_DEPLOY == 'yes'

      - uses: diddlesnaps/snapcraft-multiarch-action@v1
        with:
          path: stores/snapcraft/stable
          architecture: ${{ matrix.platform }}
        id: build
        if: env.SHOULD_DEPLOY == 'yes'

      - uses: diddlesnaps/snapcraft-review-action@v1
        with:
          snap: ${{ steps.build.outputs.snap }}
          isClassic: 'true'
        if: env.SHOULD_DEPLOY == 'yes'

      - uses: snapcore/action-publish@master
        env:
          SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
        with:
          snap: ${{ steps.build.outputs.snap }}
          release: stable
        if: env.SHOULD_DEPLOY == 'yes'

  deb-rpm-repo-hook:
    needs:
      - build
    runs-on: ubuntu-latest
    if: needs.build.outputs.SHOULD_DEPLOY == 'yes'

    steps:
      - name: Trigger repository rebuild
        env:
          GL_PAGES_TOKEN: ${{ secrets.GL_PAGES_TOKEN }}
        run: curl -X POST --fail -F token="${GL_PAGES_TOKEN}" -F ref=master https://gitlab.com/api/v4/projects/8762263/trigger/pipeline