name: CI on: push: branches: - main pull_request: paths-ignore: - '.vscode/**' - 'examples/**' # Automatically cancel in-progress actions on the same branch concurrency: group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }} cancel-in-progress: true defaults: run: shell: bash jobs: # Lint can run in parallel with Build. # We also run `yarn install` with the `--prefer-offline` flag to speed things up. lint: name: Lint runs-on: ubuntu-latest steps: - name: Check out repository uses: actions/checkout@v2 - name: Setup Node uses: actions/setup-node@v2 with: node-version: 16 cache: 'yarn' - name: Install NPM Dependencies run: yarn install --prefer-offline --frozen-lockfile --ignore-engines --registry https://registry.npmjs.org --network-timeout 300000 env: CI: true - name: Status run: git status # Lint autofix cannot run on forks, so just skip those! See https://github.com/wearerequired/lint-action/issues/13 - name: Lint (External) if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.owner.login != github.repository_owner }} run: yarn lint # Otherwise, run lint autofixer - name: Lint if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.owner.login == github.repository_owner }} uses: wearerequired/lint-action@v1.10.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: eslint: true eslint_args: --ignore-pattern test --ignore-pattern vendor eslint_dir: packages/astro eslint_extensions: ts prettier: false auto_fix: true git_name: github-actions[bot] git_email: github-actions[bot]@users.noreply.github.com commit_message: 'chore(lint): ${linter} fix' github_token: ${{ secrets.GITHUB_TOKEN }} neutral_check_on_warning: true # Checks that the formatter runs successfully on all files # In the future, we may have this fail PRs on unformatted code - name: Format Check run: yarn format --list # Build installs all devDependencies and runs our full build pipeline. # We upload all `dist/` artifacts to GitHub, which can be shared by all dependent jobs. build: name: Build Packages runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Node uses: actions/setup-node@v2 with: node-version: 16 cache: 'yarn' - name: Cache Node Modules id: cache-node uses: actions/cache@v2 with: path: "**/node_modules" key: cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }} restore-keys: | cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }} cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}- - name: Install NPM Dependencies run: yarn install --prefer-offline --frozen-lockfile --ignore-engines --registry https://registry.npmjs.org --network-timeout 300000 env: CI: true - name: Build Packages run: yarn build --force - name: Upload Package Artifacts uses: actions/upload-artifact@v2 with: name: artifacts path: packages/**/dist/** if-no-files-found: error # Test depends on Build's output, which allows us to skip any build process! # We also run `yarn install` with the `--prefer-offline` flag to speed things up. test: name: 'Test: ${{ matrix.os }} (node@${{ matrix.node_version }})' runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest] node_version: [14, 16] include: - os: windows-latest node_version: 16 - os: macos-latest node_version: 16 fail-fast: false needs: - build steps: - name: Checkout uses: actions/checkout@v2 - name: Setup node@${{ matrix.node_version }} uses: actions/setup-node@v2 with: node-version: ${{ matrix.node_version }} cache: 'yarn' - name: Download Build Artifacts uses: actions/download-artifact@v2 - name: Extract Artifacts run: ./.github/extract-artifacts.sh - name: Cache Node Modules id: cache-node uses: actions/cache@v2 with: path: "**/node_modules" key: cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }} restore-keys: | cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }} cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}- - name: Install NPM Dependencies run: yarn install --prefer-offline --frozen-lockfile --ignore-engines --registry https://registry.npmjs.org --network-timeout 300000 env: CI: true - name: Test if: ${{ matrix.os != 'windows-latest' }} run: yarn test # Turbo seems to make the tests hang on Windows, just run them directly - name: Test (Windows) if: ${{ matrix.os == 'windows-latest' }} run: yarn workspace astro run test smoke: name: 'Test (Smoke) ${{ matrix.os }}' runs-on: ${{ matrix.os }} strategy: matrix: os: [windows-latest, ubuntu-latest] needs: - build steps: - name: Checkout uses: actions/checkout@v3 with: submodules: 'recursive' - name: Setup Node uses: actions/setup-node@v2 with: node-version: 14 cache: 'yarn' - name: Download Build Artifacts uses: actions/download-artifact@v2 - name: Extract Artifacts run: ./.github/extract-artifacts.sh - name: Cache Node Modules id: cache-node uses: actions/cache@v2 with: path: "**/node_modules" key: cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }} restore-keys: | cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }} cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}- - name: Install NPM Dependencies # NOTE: Do NOT use `--frozen-lockfile` here! The lockfile needs to be updated in order to pull the submodules into the monorepo run: yarn install --prefer-offline --ignore-engines --registry https://registry.npmjs.org --network-timeout 300000 env: CI: true - name: Test run: yarn test:smoke - name: Memory Leak Test run: | node ./scripts/memory/mk.js node --expose-gc ./scripts/memory/index.js --ci # Changelog can only run _after_ build. # We download all `dist/` artifacts from GitHub to skip the build process. changelog: name: Changelog PR or Release if: ${{ (github.ref_name == 'main' || github.head_ref == 'next') && github.repository_owner == 'withastro' }} needs: [build] runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Setup Node uses: actions/setup-node@v2 with: node-version: 16 cache: 'yarn' - name: Download Build Artifacts uses: actions/download-artifact@v2 - name: Extract Artifacts run: ./.github/extract-artifacts.sh - name: Cache Node Modules id: cache-node uses: actions/cache@v2 with: path: "**/node_modules" key: cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }} restore-keys: | cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }} cache-node_modules-${{ runner.os }}-${{ hashFiles('**/yarn.lock') }}- - name: Install NPM Dependencies run: yarn install --prefer-offline --frozen-lockfile --ignore-engines --registry https://registry.npmjs.org --network-timeout 300000 env: CI: true - name: Create Release Pull Request or Publish id: changesets uses: changesets/action@v1 with: publish: yarn changeset publish commit: '[ci] release' title: '[ci] release' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Generate Notification id: notification if: steps.changesets.outputs.published == 'true' run: message=$(node scripts/notify/index.js '${{ steps.changesets.outputs.publishedPackages }}') && echo ::set-output name=message::${message//$'\n'/'%0A'} - name: Discord Notification if: steps.changesets.outputs.published == 'true' id: discord-notification env: DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} uses: Ilshidur/action-discord@0.3.2 with: args: ${{ steps.notification.outputs.message }}