Skip to content

Debugging Firefox startup issues on Ubuntu in GitHub CI #19539

Debugging Firefox startup issues on Ubuntu in GitHub CI

Debugging Firefox startup issues on Ubuntu in GitHub CI #19539

Workflow file for this run

name: CI
# Declare default permissions as read only.
permissions: read-all
on:
push:
branches:
- main
pull_request:
types:
# These are the defaults. See
# https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request
- opened
- reopened
- synchronize
# Used for `full-ci`
- labeled
branches:
- '**'
concurrency:
group: ci-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
inspect-code:
name: '[Required] Inspect code'
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
fetch-depth: 2
- name: Set up Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
cache: npm
node-version-file: '.nvmrc'
- name: Install dependencies
run: npm ci
env:
PUPPETEER_SKIP_DOWNLOAD: true
# Set up GitHub Actions caching for Wireit.
- uses: google/wireit@f21db1f3a6a4db31f42787a958cf2a18308effed # setup-github-actions-caching/v2.0.3
- name: Check code
run: npm run check
- name: Validate licenses
run: npm run validate-licenses
- name: Build every package
run: npm run build
- name: Tests types
run: npm run test-types
- name: Verify packages are synced
run: npm run validate-deps
- name: Lint code
run: npm run lint
- name: Generate documents
run: npm run docs
- name: Check if autogenerated docs differ
run: |
diff_file=$(mktemp doc_diff_XXXXXX)
git diff --color > $diff_file
if [[ -s $diff_file ]]; then
echo "Please update the documentation by running 'npm run docs'. The following was the diff"
cat $diff_file
rm $diff_file
exit 1
fi
rm $diff_file
check-changes:
uses: ./.github/workflows/changed-packages.yml
with:
check-mergeable-state: true
# deploy-docs:
# needs: check-changes
# name: Deploy docs (if needed)
# if: ${{ contains(fromJSON(needs.check-changes.outputs.changes), 'website') }}
# runs-on: ubuntu-latest
# permissions:
# contents: write
# steps:
# - name: Check out repository
# uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
# - name: Set up Node.js
# uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
# with:
# cache: npm
# node-version-file: '.nvmrc'
# - name: Install dependencies
# working-directory: ./website
# run: npm ci
# - name: Build website
# working-directory: ./website
# env:
# NODE_OPTIONS: --max-old-space-size=6144
# run: npm run build
# - name: Deploy to GitHub Pages
# # Only change on push to main
# if: ${{ github.event_name != 'pull_request'}}
# uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
# with:
# github_token: ${{ secrets.GITHUB_TOKEN }}
# publish_dir: ./website/build
# user_name: release-please[bot]
# user_email: 55107282+release-please[bot]@users.noreply.github.com
# - name: Test Algolia if Crawler is blocked
# # Only change on push to main
# if: ${{ github.event_name != 'pull_request'}}
# env:
# CRAWLER_USER_ID: ${{secrets.ALGOLIA_CRAWLER_USER_ID}}
# CRAWLER_API_KEY: ${{secrets.ALGOLIA_CRAWLER_API_KEY}}
# CRAWLER_ID: ${{secrets.ALGOLIA_CRAWLER_ID}}
# run: |
# RESPONSE=$(curl -H "Content-Type: application/json" -X GET --user "$CRAWLER_USER_ID:$CRAWLER_API_KEY" \
# "https://crawler.algolia.com/api/1/crawlers/$CRAWLER_ID" | grep "\"blocked\":true" || true ); \
# if [ ! -z "$RESPONSE" ]; then echo "Please go to https://crawler.algolia.com/" && exit 1; fi
# - name: Trigger Algolia reindexing
# # Only change on push to main
# if: ${{ github.event_name != 'pull_request'}}
# env:
# CRAWLER_USER_ID: ${{secrets.ALGOLIA_CRAWLER_USER_ID}}
# CRAWLER_API_KEY: ${{secrets.ALGOLIA_CRAWLER_API_KEY}}
# CRAWLER_ID: ${{secrets.ALGOLIA_CRAWLER_ID}}
# run: |
# curl -H "Content-Type: application/json" -X POST --user "$CRAWLER_USER_ID:$CRAWLER_API_KEY" \
# "https://crawler.algolia.com/api/1/crawlers/$CRAWLER_ID/reindex"
# # doctest:
# # name: Doctest
# # runs-on: ubuntu-latest
# # needs: check-changes
# # if: ${{ false && contains(fromJSON(needs.check-changes.outputs.changes), 'puppeteer') }}
# # steps:
# # - name: Check out repository
# # uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
# # - name: Set up Node.js
# # uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
# # with:
# # cache: npm
# # node-version-file: '.nvmrc'
# # - name: Disable AppArmor
# # run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns
# # - name: Install dependencies
# # run: npm ci
# # env:
# # PUPPETEER_SKIP_DOWNLOAD: true
# # - name: Run tests
# # run: npm run doctest
# # # chrome-tests:
# # # name: ${{ matrix.suite }} (${{ matrix.shard }}) on ${{ matrix.os }}
# # # runs-on: ${{ matrix.os }}
# # # needs: check-changes
# # # if: ${{ contains(fromJSON(needs.check-changes.outputs.changes), 'puppeteer') }}
# # # strategy:
# # # fail-fast: false
# # # matrix:
# # # linux-only:
# # # - ${{ github.event_name == 'pull_request' && !contains(github.head_ref, 'release-please') && !contains(github.event.pull_request.labels.*.name, 'full-ci') }}
# # # suite:
# # # - chrome-headless
# # # - chrome-headful
# # # - chrome-headless-shell
# # # - chrome-bidi
# # # os:
# # # - ubuntu-latest
# # # - windows-latest
# # # - macos-15
# # # shard:
# # # - 1-2
# # # - 2-2
# # # exclude:
# # # - linux-only: true
# # # os: windows-latest
# # # - linux-only: true
# # # os: macos-15
# # # - linux-only: true
# # # suite: chrome-headful
# # # - os: windows-latest
# # # suite: chrome-bidi
# # # - os: macos-15
# # # suite: chrome-headful
# # # steps:
# # # - name: Check out repository
# # # uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
# # # - name: Set up Node.js
# # # uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
# # # with:
# # # cache: npm
# # # node-version-file: '.nvmrc'
# # # - name: Disable AppArmor
# # # if: ${{ matrix.os == 'ubuntu-latest' }}
# # # run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns
# # # - name: Install dependencies
# # # run: npm ci
# # # env:
# # # PUPPETEER_SKIP_DOWNLOAD: true
# # # # Set up GitHub Actions caching for Wireit.
# # # - uses: google/wireit@f21db1f3a6a4db31f42787a958cf2a18308effed # setup-github-actions-caching/v2.0.3
# # # - name: Build packages
# # # run: npm run build --workspace @puppeteer-test/test
# # # - name: Setup cache for browsers
# # # uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
# # # with:
# # # path: ~/.cache/puppeteer/
# # # key: Browsers-${{ runner.os }}-${{ hashFiles('packages/puppeteer-core/src/revisions.ts') }}-${{ hashFiles('packages/puppeteer/src/node/install.ts') }}
# # # - name: Install browsers
# # # run: npm run postinstall
# # # - name: Run all tests (MacOS)
# # # if: ${{ matrix.os == 'macos-15' }}
# # # run: npm run test -- --shard '${{ matrix.shard }}' --test-suite ${{ matrix.suite }} --save-stats-to /tmp/artifacts/${{ github.event_name }}_INSERTID.json
# # # - name: Run all tests (Windows)
# # # if: ${{ matrix.os == 'windows-latest' }}
# # # run: npm run test -- --shard '${{ matrix.shard }}' --test-suite ${{ matrix.suite }} --save-stats-to /tmp/artifacts/${{ github.event_name }}_INSERTID.json
# # # - name: Run all tests (Linux)
# # # if: ${{ matrix.os == 'ubuntu-latest' }}
# # # run: xvfb-run --auto-servernum npm run test -- --shard '${{ matrix.shard }}' --test-suite ${{ matrix.suite }} --save-stats-to /tmp/artifacts/${{ github.event_name }}_INSERTID.json
# # # - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
# # # if: ${{ !cancelled() }}
# # # with:
# # # name: test-results-${{ matrix.os }}-${{ matrix.suite }}-${{ matrix.shard }}
# # # path: /tmp/artifacts/*.json
# chrome-tests-required:
# name: '[Required] Chrome tests'
# needs: [check-changes, chrome-tests]
# runs-on: ubuntu-latest
# if: ${{ !cancelled() }}
# steps:
# - if: ${{ needs.chrome-tests.result != 'success' && contains(fromJSON(needs.check-changes.outputs.changes), 'puppeteer') }}
# run: 'exit 1'
# - run: 'exit 0'
firefox-tests:
name: ${{ matrix.suite }} (${{ matrix.shard }}) on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
needs: check-changes
if: ${{ contains(fromJSON(needs.check-changes.outputs.changes), 'puppeteer') }}
strategy:
fail-fast: false
matrix:
linux-only:
- ${{ github.event_name == 'pull_request' && !contains(github.head_ref, 'release-please') && !contains(github.event.pull_request.labels.*.name, 'full-ci') }}
suite:
- firefox-headful
# - firefox-headless
os:
- ubuntu-latest
# - macos-15
# - windows-latest
shard:
- 1-4
- 2-4
- 3-4
- 4-4
exclude:
- linux-only: true
os: windows-latest
- linux-only: true
os: macos-15
steps:
- name: Checkout
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Set up Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
cache: npm
node-version-file: '.nvmrc'
- name: Disable AppArmor
if: ${{ matrix.os == 'ubuntu-latest' }}
run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns
- name: Download Firefox Nightly
run: |
URL="https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/firefox-144.0a1.en-US.linux-x86_64.tar.xz"
FILE_NAME="firefox.en-US.linux-x86_64.tar.xz"
echo "Downloading $FILE_NAME..."
wget -O $FILE_NAME $URL
tar -xvf $FILE_NAME
echo "Firefox Nightly extracted."
- name: Install dependencies
run: npm ci
env:
PUPPETEER_SKIP_DOWNLOAD: true
# Set up GitHub Actions caching for Wireit.
- uses: google/wireit@f21db1f3a6a4db31f42787a958cf2a18308effed # setup-github-actions-caching/v2.0.3
- name: Build packages
run: npm run build --workspace @puppeteer-test/test
- name: Setup cache for browsers
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
with:
path: ~/.cache/puppeteer/
key: Browsers-${{ runner.os }}-${{ hashFiles('packages/puppeteer-core/src/revisions.ts') }}-${{ hashFiles('packages/puppeteer/src/node/install.ts') }}
# - name: Install browsers
# run: npm run postinstall
# - name: Run all tests (MacOS)
# if: ${{ matrix.os == 'macos-15' }}
# run: npm run test -- --shard '${{ matrix.shard }}' --test-suite ${{ matrix.suite }} --save-stats-to /tmp/artifacts/${{ github.event_name }}_INSERTID.json
# - name: Run all tests (Windows)
# if: ${{ matrix.os == 'windows-latest' }}
# run: npm run test -- --shard '${{ matrix.shard }}' --test-suite ${{ matrix.suite }} --save-stats-to /tmp/artifacts/${{ github.event_name }}_INSERTID.json
- name: Run all tests (Linux)
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
# mkdir profile
# echo 'user_pref("remote.log.level", "Trace");' >> profile/prefs.js
# echo 'user_pref("browser.backup.enabled", false);' >> profile/prefs.js
# echo 'user_pref("browser.backup.log", true);' >> profile/prefs.js
# xvfb-run --auto-servernum ./firefox/firefox --remote-debugging-port=92923 --profile profile
BINARY="./firefox/firefox" DUMPIO="1" xvfb-run --auto-servernum npm run test -- --shard '${{ matrix.shard }}' --test-suite ${{ matrix.suite }} --save-stats-to /tmp/artifacts/${{ github.event_name }}_INSERTID.json
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: ${{ !cancelled() }}
with:
name: test-results-${{ matrix.os }}-${{ matrix.suite }}-${{ matrix.shard }}
path: /tmp/artifacts/*.json
firefox-tests-required:
name: '[Required] Firefox tests'
needs: [check-changes, firefox-tests]
runs-on: ubuntu-latest
if: ${{ !cancelled() }}
steps:
- if: ${{ needs.firefox-tests.result != 'success' && contains(fromJSON(needs.check-changes.outputs.changes), 'puppeteer') }}
run: 'exit 1'
- run: 'exit 0'
# installation-test:
# name: ${{ matrix.pkg_manager }} installation on ${{ matrix.os }}
# needs: check-changes
# if: ${{ !startsWith(github.ref_name, 'release-please') && contains(fromJSON(needs.check-changes.outputs.changes), 'puppeteer') }}
# runs-on: ${{ matrix.os }}
# strategy:
# fail-fast: false
# matrix:
# linux-only:
# - ${{ github.event_name == 'pull_request' && !contains(github.head_ref, 'release-please') && !contains(github.event.pull_request.labels.*.name, 'full-ci') }}
# pkg_manager:
# - npm
# os:
# - ubuntu-latest
# - windows-latest
# - macos-15
# exclude:
# - linux-only: true
# os: windows-latest
# - linux-only: true
# os: macos-15
# steps:
# - name: Check out repository
# uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
# - name: Set up Node.js
# uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
# with:
# cache: npm
# node-version-file: '.nvmrc'
# - name: Disable AppArmor
# if: ${{ matrix.os == 'ubuntu-latest' }}
# run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns
# - name: Install dependencies
# run: npm ci
# env:
# PUPPETEER_SKIP_DOWNLOAD: true
# # Set up GitHub Actions caching for Wireit.
# - uses: google/wireit@f21db1f3a6a4db31f42787a958cf2a18308effed # setup-github-actions-caching/v2.0.3
# - name: Test install
# env:
# PKG_MANAGER: ${{ matrix.pkg_manager }}
# run: ${{ matrix.pkg_manager }} run test-install
# installation-test-required:
# name: '[Required] Installation tests'
# needs: [check-changes, installation-test]
# runs-on: ubuntu-latest
# if: ${{ !cancelled() }}
# steps:
# - if: ${{ needs.installation-test.result != 'success' && contains(fromJSON(needs.check-changes.outputs.changes), 'puppeteer') }}
# run: 'exit 1'
# - run: 'exit 0'
docker-tests:
name: '[Required] Docker image test'
runs-on: ubuntu-latest
needs: check-changes
if: ${{ contains(fromJSON(needs.check-changes.outputs.changes), 'puppeteer') }}
steps:
- name: Check out repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
fetch-depth: 2
- name: Set up Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
cache: npm
node-version-file: '.nvmrc'
- name: Install dependencies
run: npm ci
env:
PUPPETEER_SKIP_DOWNLOAD: true
- name: Build packages
run: npm run build --workspace puppeteer
- name: Pack packages
run: docker/pack.sh
- name: Build docker image
working-directory: ./docker
run: |
docker build -t puppeteer-test-image .
- name: Run smoke test
working-directory: ./docker
run: |
docker run -i --init --cap-add=SYS_ADMIN --rm puppeteer-test-image node -e "`cat test/smoke-test.js`"
unit-tests:
name: '[Required] Puppeteer Unit tests'
runs-on: ubuntu-latest
needs: check-changes
if: ${{ contains(fromJSON(needs.check-changes.outputs.changes), 'puppeteer') }}
steps:
- name: Check out repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Set up Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
cache: npm
node-version-file: '.nvmrc'
- name: Install dependencies
run: npm ci
env:
PUPPETEER_SKIP_DOWNLOAD: true
- name: Run unit tests
run: |
npm run unit -w puppeteer-core -w puppeteer --if-present
ng-schematics-unit:
name: '[Required] Angular Schematics tests'
runs-on: ubuntu-latest
needs: check-changes
if: ${{ contains(fromJSON(needs.check-changes.outputs.changes), 'ng-schematics') }}
steps:
- name: Checkout
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Set up Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
cache: npm
node-version-file: '.nvmrc'
- name: Install dependencies
run: npm ci
env:
PUPPETEER_SKIP_DOWNLOAD: true
- name: Run tests
run: npm run unit --workspace @puppeteer/ng-schematics
ng-schematics-smoke-tests:
name: Angular Schematics smoke tests on ${{ matrix.os }} ${{ matrix.test-runner }}
runs-on: ${{ matrix.os }}
needs: check-changes
if: ${{ contains(fromJSON(needs.check-changes.outputs.changes), 'ng-schematics') }}
strategy:
fail-fast: false
matrix:
linux-only:
- ${{ github.event_name == 'pull_request' && !contains(github.head_ref, 'release-please') && !contains(github.event.pull_request.labels.*.name, 'full-ci') }}
os:
- ubuntu-latest
- windows-latest
- macos-15
test-runner:
- node
- jest
- jasmine
- mocha
exclude:
- linux-only: true
os: windows-latest
- linux-only: true
os: macos-15
steps:
- name: Checkout
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Set up Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
cache: npm
node-version-file: '.nvmrc'
- name: Disable AppArmor
if: ${{ matrix.os == 'ubuntu-latest' }}
run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns
- name: Install dependencies
run: npm ci
env:
PUPPETEER_SKIP_DOWNLOAD: true
- name: Build all and schematics
run: npm run build
- name: Install Browsers
run: npm run postinstall
- name: Run tests
run: node tools/smoke.mjs -r ${{ matrix.test-runner }}
working-directory: ./packages/ng-schematics
ng-schematics-smoke-tests-required:
name: '[Required] Angular Schematics smoke tests'
needs: [check-changes, ng-schematics-smoke-tests]
runs-on: ubuntu-latest
if: ${{ !cancelled() }}
steps:
- if: ${{ needs.ng-schematics-smoke-tests.result != 'success' && contains(fromJSON(needs.check-changes.outputs.changes), 'ng-schematics') }}
run: 'exit 1'
- run: 'exit 0'
browsers-tests:
name: Browsers tests on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
needs: check-changes
if: ${{ contains(fromJSON(needs.check-changes.outputs.changes), 'browsers') }}
strategy:
fail-fast: false
matrix:
linux-only:
- ${{ github.event_name == 'pull_request' && !contains(github.head_ref, 'release-please') && !contains(github.event.pull_request.labels.*.name, 'full-ci') }}
os:
- ubuntu-latest
- windows-latest
- macos-15
exclude:
- linux-only: true
os: windows-latest
- linux-only: true
os: macos-15
steps:
- name: Checkout
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Set up Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
cache: npm
node-version-file: '.nvmrc'
- name: Disable AppArmor
if: ${{ matrix.os == 'ubuntu-latest' }}
run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns
- name: Install dependencies
run: npm ci
env:
PUPPETEER_SKIP_DOWNLOAD: true
- name: Setup cache for browsers
uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
with:
path: packages/browsers/test/.cache/server
key: TestBrowsers-${{ runner.os }}-${{ hashFiles('packages/browsers/test/src/versions.ts') }}-${{ hashFiles('packages/browsers/tools/downloadTestBrowsers.mjs') }}
- name: Run tests
run: npm run test --workspace @puppeteer/browsers
browsers-tests-required:
name: '[Required] Test the browsers packages'
needs: [check-changes, browsers-tests]
runs-on: ubuntu-latest
if: ${{ !cancelled() }}
steps:
- if: ${{ needs.browsers-tests.result != 'success' && contains(fromJSON(needs.check-changes.outputs.changes), 'browsers') }}
run: 'exit 1'
- run: 'exit 0'