# github actions: https://docs.github.com/en/actions/use-cases-and-examples/building-and-testing/building-and-testing-nodejs # setup-node: https://github.com/actions/setup-node name: CI on: push: branches: [master, staging] pull_request: # By default, CI will trigger on opened/synchronize/reopened event types. # https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#pull_request # Note: To re-run `lint-commits` after fixing the PR title, close-and-reopen the PR. branches: [master, feature/*, staging] # Cancel old jobs when a pull request is updated. concurrency: group: ${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: lint-commits: # Note: To re-run `lint-commits` after fixing the PR title, close-and-reopen the PR. runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 20 - uses: actions/setup-node@v4 with: node-version: '20' - name: Validate Branch name if: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.ref != ''}} env: BRANCH_NAME: ${{ github.event.pull_request.head.ref }} run: | node "$GITHUB_WORKSPACE/.github/workflows/lintbranch.js" run "$BRANCH_NAME" - name: Check PR title run: | node "$GITHUB_WORKSPACE/.github/workflows/lintcommit.js" lint: needs: lint-commits runs-on: ubuntu-latest strategy: matrix: node-version: [18.x] vscode-version: [stable] env: NODE_OPTIONS: '--max-old-space-size=8192' steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm run testCompile - run: npm run lint lint-duplicate-code: needs: lint-commits if: ${{ github.event_name == 'pull_request'}} runs-on: ubuntu-latest strategy: matrix: node-version: [18.x] env: NODE_OPTIONS: '--max-old-space-size=8192' steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - name: Fetch fork upstream env: REPO_NAME: ${{ github.event.pull_request.head.repo.full_name }} run: | git remote add forkUpstream https://github.com/$REPO_NAME # URL of the fork git fetch forkUpstream # Fetch fork - name: Merge in target branch to avoid false negatives. env: TARGET_BRANCH: ${{ github.event.pull_request.base.ref }} # Note: "git merge" should always succeed here, because GHA won't # start the job if there are merge conflicts. https://github.com/orgs/community/discussions/11265 # Also, because `git merge` makes a commit, we need to establish an identity to avoid 'Committer identity unknown' error run: | git config --global user.name "aws-toolkit-automation" git config --global user.email "<>" git merge origin/$TARGET_BRANCH - name: Compute git diff env: CURRENT_BRANCH: ${{ github.head_ref }} TARGET_BRANCH: ${{ github.event.pull_request.base.ref }} run: git diff origin/$TARGET_BRANCH forkUpstream/$CURRENT_BRANCH > diff_output.txt - run: npm install -g jscpd - run: jscpd --config "$GITHUB_WORKSPACE/.github/workflows/jscpd.json" - if: always() uses: actions/upload-artifact@v4 with: name: unfiltered-jscpd-report path: ./jscpd-report.json - name: Check for Duplicates env: COMMIT_HASH: ${{ github.sha}} REPO_NAME: ${{ github.repository }} run: node "$GITHUB_WORKSPACE/.github/workflows/filterDuplicates.js" run diff_output.txt jscpd-report.json $COMMIT_HASH $REPO_NAME macos: needs: lint-commits name: test macOS runs-on: macos-latest strategy: fail-fast: false matrix: node-version: [18.x] vscode-version: [minimum, stable, insiders] package: [amazonq, toolkit] env: VSCODE_TEST_VERSION: ${{ matrix.vscode-version }} NODE_OPTIONS: '--max-old-space-size=8192' AWS_TOOLKIT_TEST_CACHE_DIR: '/tmp/.vscode-test/' AWS_TOOLKIT_TEST_USER_DIR: '/tmp/.vscode-test/user-data/' steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm ci - name: Tests uses: coactions/setup-xvfb@v1 with: run: npm run test -w packages/${{ matrix.package }} - name: Code coverage for ${{ matrix.package }} env: # Unset NODE_OPTIONS because of https://github.com/codecov/uploader/issues/475 NODE_OPTIONS: '' if: ${{ github.repository == 'aws/aws-toolkit-vscode' && github.event_name == 'pull_request' && github.base_ref == 'master' }} uses: codecov/codecov-action@v5 with: flags: macos-${{ matrix.package }}-unittests verbose: true file: ./coverage/${{ matrix.package }}/lcov.info token: ${{ secrets.CODECOV_TOKEN }} web: needs: lint-commits name: test Web runs-on: ubuntu-latest strategy: fail-fast: true matrix: node-version: [18.x] vscode-version: [stable, insiders] env: VSCODE_TEST_VERSION: ${{ matrix.vscode-version }} NODE_OPTIONS: '--max-old-space-size=8192' AWS_TOOLKIT_TEST_CACHE_DIR: '/tmp/.vscode-test/' AWS_TOOLKIT_TEST_USER_DIR: '/tmp/.vscode-test/user-data/' steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm ci - name: Tests uses: coactions/setup-xvfb@v1 with: run: npm run testWeb cloudformation-integ: needs: lint-commits name: CloudFormation LSP E2E Tests runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] node-version: [18.x] vscode-version: [stable] env: VSCODE_TEST_VERSION: ${{ matrix.vscode-version }} NODE_OPTIONS: '--max-old-space-size=8192' steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - name: Setup CloudFormation LSP shell: bash run: bash packages/core/src/testE2E/cloudformation/setup-local-lsp.sh - run: npm ci - name: Run CloudFormation E2E Tests (Unix) if: runner.os != 'Windows' uses: coactions/setup-xvfb@v1 with: run: npm run testE2ECfn -w packages/toolkit - name: Run CloudFormation E2E Tests (Windows) if: runner.os == 'Windows' run: npm run testE2ECfn -w packages/toolkit - name: Print Extension Logs if: failure() shell: bash run: | echo "=== AWS Toolkit Extension Logs ===" find packages/toolkit/.vscode-test/user-data/logs -name "*.log" -type f 2>/dev/null | while read logfile; do echo "--- $logfile ---" cat "$logfile" || echo "Could not read log file" done || echo "No extension logs found" echo "" echo "=== CloudFormation LSP Server Logs ===" echo "LSP Path: $__CLOUDFORMATIONLSP_PATH" if [ -n "$__CLOUDFORMATIONLSP_PATH" ]; then LSP_LOG_DIR="$__CLOUDFORMATIONLSP_PATH/.aws-cfn-storage/logs" echo "Checking directory: $LSP_LOG_DIR" if [ -d "$LSP_LOG_DIR" ]; then find "$LSP_LOG_DIR" -name "*.log" -type f 2>/dev/null | while read logfile; do echo "--- $logfile ---" cat "$logfile" || echo "Could not read log file" done else echo "LSP logs directory does not exist: $LSP_LOG_DIR" echo "Contents of LSP path:" ls -la "$__CLOUDFORMATIONLSP_PATH" 2>/dev/null || echo "Cannot list LSP path" fi else echo "Environment variable __CLOUDFORMATIONLSP_PATH is not set" fi windows: needs: lint-commits name: test Windows runs-on: windows-latest strategy: fail-fast: false matrix: node-version: [18.x] vscode-version: [stable, insiders] package: [amazonq, toolkit] env: VSCODE_TEST_VERSION: ${{ matrix.vscode-version }} NODE_OPTIONS: '--max-old-space-size=8192' steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm ci - name: Tests run: npm run test -w packages/${{ matrix.package }} - name: Code coverage for ${{ matrix.package }} env: # Unset NODE_OPTIONS because of https://github.com/codecov/uploader/issues/475 NODE_OPTIONS: '' if: ${{ github.repository == 'aws/aws-toolkit-vscode' && github.event_name == 'pull_request' && github.base_ref == 'master' }} uses: codecov/codecov-action@v5 with: flags: windows-${{ matrix.package }}-unittests verbose: true file: ./coverage/${{ matrix.package }}/lcov.info token: ${{ secrets.CODECOV_TOKEN }}