qiwi/module-federation-manifest-plugin

View on GitHub
.github/workflows/ci.yaml

Summary

Maintainability
Test Coverage
# This is a Github Workflow that runs tests on any push or pull request.
# If the tests pass and this is a push to the master branch it also runs Semantic Release.
name: CI
on: [push, pull_request]

jobs:
  init:
    name: init
    runs-on: ubuntu-22.04
    outputs:
      yarn-cache-dir: ${{ steps.yarn-cache-dir-path.outputs.dir }}
      checksum: ${{ steps.checksum.outputs.checksum }}
    steps:
      - uses: actions/checkout@v3

      - name: Get yarn cache dir
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn config get cacheFolder)"

      - name: Get src checksum
        id: checksum
        run: echo "::set-output name=checksum::${{ hashFiles('yarn.lock') }}-${{ hashFiles('src/**/*') }}-${{ hashFiles('*.json') }}"

  build:
    name: build
    needs: init
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - uses: actions/setup-node@v3
        with:
          node-version: 18

      - name: Download artifact
        uses: qiwi-forks/action-download-artifact@v2
        with:
          name: artifact-${{ needs.init.outputs.checksum }}
          workflow: 'ci.yaml'
          workflow_conclusion: false
          nothrow: true
          search_artifacts: true
          search_depth: 10

      - name: Check artifact
        if: always()
        id: check-artifact
        run: echo "::set-output name=exists::$([ -e "artifact.tar" ] && echo true || echo false)"

      - uses: actions/cache@v3
        if: ${{ steps.check-artifact.outputs.exists == 'false' }}
        id: yarn-cache
        with:
          path: ${{ needs.init.outputs.yarn-cache-dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-
      - name: Install deps
        if: ${{ steps.check-artifact.outputs.exists == 'false' }}
        run: yarn

      - name: Build
        if: ${{ steps.check-artifact.outputs.exists == 'false' }}
        run: |
          yarn build
          tar -cvf artifact.tar docs target flow-typed typings buildstamp.json package.json

      - name: Save artifact
        if: ${{ steps.check-artifact.outputs.exists == 'false' }}
        uses: actions/upload-artifact@v3
        with:
          name: artifact-${{ needs.init.outputs.checksum }}
          retention-days: 30
          path: artifact.tar

      # https://github.com/actions/upload-artifact/issues/53
      - name: Cache artifact
        uses: actions/cache@v3
        id: artifact
        with:
          path: artifact.tar
          key: artifact-${{ needs.init.outputs.checksum }}

  test_push:
    needs: [build, init]
    if: github.event_name == 'push'
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - uses: actions/setup-node@v3
        with:
          node-version: 18

      - name: Restore artifact from cache (if exists)
        uses: actions/cache@v3
        with:
          path: artifact.tar
          key: artifact-${{ needs.init.outputs.checksum }}

      - name: Check artifact
        if: always()
        id: check-artifact
        run: echo "::set-output name=exists::$([ -e "artifact.tar" ] && echo true || echo false)"

      - name: Download artifact
        if: ${{ steps.check-artifact.outputs.exists == 'false' }}
        uses: qiwi-forks/action-download-artifact@v2
        with:
          name: artifact-${{ needs.init.outputs.checksum }}
          workflow: 'ci.yaml'
          workflow_conclusion: false
          search_artifacts: true
          search_depth: 10

      - name: Unpack artifact
        run: tar -xvf artifact.tar

      - uses: actions/cache@v3
        id: yarn-cache
        with:
          path: ${{ needs.init.outputs.yarn-cache-dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-
      - name: Install deps
        run: yarn

      - name: Test
        #        env:
        #          NODE_OPTIONS: "--max_old_space_size=4096"
        run: yarn test

      - name: Cache coverage
        if: github.ref == 'refs/heads/master'
        id: cache-coverage
        uses: actions/cache@v3
        with:
          path: |
            coverage
            package.json
          key: coverage-${{ needs.init.outputs.checksum }}

  test_pr:
    if: github.event_name == 'pull_request'
    needs: [build, init]
    strategy:
      matrix:
        os: [ubuntu-22.04]
        node-version: [16]
    name: Test (Node v${{ matrix.node-version }}, OS ${{ matrix.os }})
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}

      - uses: actions/cache@v3
        id: yarn-cache
        with:
          path: ${{ needs.init.outputs.yarn-cache-dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-
      - name: Restore artifact from cache (if exists)
        uses: actions/cache@v3
        with:
          path: artifact.tar
          key: artifact-${{ needs.init.outputs.checksum }}

      - name: Check artifact
        if: always()
        id: check-artifact
        run: echo "::set-output name=exists::$([ -e "artifact.tar" ] && echo true || echo false)"

      - name: Download artifact
        if: ${{ steps.check-artifact.outputs.exists == 'false' }}
        uses: qiwi-forks/action-download-artifact@v2
        with:
          name: artifact-${{ needs.init.outputs.checksum }}
          workflow: 'ci.yaml'
          workflow_conclusion: false
          search_artifacts: true
          search_depth: 10

      - name: Unpack artifact
        run: tar -xvf artifact.tar

      - name: Install deps
        run: yarn

      - name: Full test
        if: matrix.node-version == '16' && matrix.os == 'ubuntu-22.04'
        #        env:
        #          NODE_OPTIONS: "--max_old_space_size=4096"
        run: yarn test

  release:
    name: Release
    if: github.event_name == 'push' && github.ref == 'refs/heads/master'
    needs: [test_push, init]
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
          ref: master
          persist-credentials: false

      - name: Restore artifact from cache (if exists)
        uses: actions/cache@v3
        with:
          path: artifact.tar
          key: artifact-${{ needs.init.outputs.checksum }}

      - name: Check artifact
        if: always()
        id: check-artifact
        run: echo "::set-output name=exists::$([ -e "artifact.tar" ] && echo true || echo false)"

      - name: Download artifact
        if: ${{ steps.check-artifact.outputs.exists == 'false' }}
        uses: qiwi-forks/action-download-artifact@v2
        with:
          name: artifact-${{ needs.init.outputs.checksum }}
          workflow: 'ci.yaml'
          workflow_conclusion: false
          search_artifacts: true
          search_depth: 10
      
      - name: Restore coverage
        uses: actions/cache@v3
        with:
          path: |
            coverage
            package.json
          key: coverage-${{ needs.init.outputs.checksum }}

      - name: Unpack artifact
        run: tar -xvf artifact.tar

      - uses: actions/setup-node@v3
        with:
          node-version: 18
      
      - name: Codeclimate
        uses: paambaati/codeclimate-action@v3.2.0
        env:
          CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }}
        with:
          coverageLocations: |
            ${{github.workspace}}/coverage/*.lcov:lcov

      - name: Release
        env:
          GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
          GH_TOKEN: ${{ secrets.GH_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
          GIT_COMMITTER_EMAIL: 'opensource@qiwi.com'
          GIT_COMMITTER_NAME: 'qiwibot'
        run: npm_config_yes=true npx zx-semrel