name: Pipeline Linux on: workflow_call: inputs: is-release: description: 'Whether this build job is a release job' required: true type: boolean default: false gn-config: description: 'The gn arg configuration to use' required: true type: string default: //electron/build/args/testing.gn gn-build-type: description: 'The gn build type - testing or release' required: true type: string default: testing generate-symbols: description: 'Whether or not to generate symbols' required: true type: boolean default: false upload-to-storage: description: 'Whether or not to upload build artifacts to external storage' required: true type: string default: '0' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true env: AZURE_STORAGE_ACCOUNT: ${{ secrets.AZURE_STORAGE_ACCOUNT }} AZURE_STORAGE_KEY: ${{ secrets.AZURE_STORAGE_KEY }} AZURE_STORAGE_CONTAINER_NAME: ${{ secrets.AZURE_STORAGE_CONTAINER_NAME }} ELECTRON_ARTIFACTS_BLOB_STORAGE: ${{ secrets.ELECTRON_ARTIFACTS_BLOB_STORAGE }} ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }} ELECTRON_GITHUB_TOKEN: ${{ secrets.ELECTRON_GITHUB_TOKEN }} GN_CONFIG: ${{ inputs.gn-config }} # Disable pre-compiled headers to reduce out size - only useful for rebuilds GN_BUILDFLAG_ARGS: 'enable_precompiled_headers = false' GCLIENT_EXTRA_ARGS: '--custom-var=checkout_mac=True --custom-var=host_os=mac' CHECK_DIST_MANIFEST: '1' IS_GHA_RELEASE: true ELECTRON_OUT_DIR: Default jobs: checkout: runs-on: LargeLinuxRunner steps: - name: Checkout Electron uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 with: path: src/electron - name: Set GIT_CACHE_PATH to make gclient to use the cache run: | echo "GIT_CACHE_PATH=$(pwd)/git-cache" >> $GITHUB_ENV - name: Setup Node.js/npm uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 with: node-version: 20.11.x cache: yarn cache-dependency-path: src/electron/yarn.lock - name: Install Dependencies run: | cd src/electron node script/yarn install - name: Get Depot Tools timeout-minutes: 5 run: | git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git if [ "`uname`" == "Darwin" ]; then # remove ninjalog_uploader_wrapper.py from autoninja since we don't use it and it causes problems sed -i '' '/ninjalog_uploader_wrapper.py/d' ./depot_tools/autoninja else sed -i '/ninjalog_uploader_wrapper.py/d' ./depot_tools/autoninja # Remove swift-format dep from cipd on macOS until we send a patch upstream. cd depot_tools git apply --3way ../src/electron/.github/workflows/config/gclient.diff fi # Ensure depot_tools does not update. test -d depot_tools && cd depot_tools touch .disable_auto_update - name: Add Depot Tools to PATH run: echo "$(pwd)/depot_tools" >> $GITHUB_PATH - name: Generate DEPS Hash run: | node src/electron/script/generate-deps-hash.js && cat src/electron/.depshash-target echo "DEPSHASH=v1-src-cache-$(shasum src/electron/.depshash | cut -f1 -d' ')" >> $GITHUB_ENV - name: Check If Cache Exists id: check-cache run: | exists_json=$(az storage blob exists \ --account-name $AZURE_STORAGE_ACCOUNT \ --account-key $AZURE_STORAGE_KEY \ --container-name $AZURE_STORAGE_CONTAINER_NAME \ --name $DEPSHASH) cache_exists=$(echo $exists_json | jq -r '.exists') echo "cache_exists=$cache_exists" >> $GITHUB_OUTPUT if (test "$cache_exists" = "true"); then echo "Cache Exists for $DEPSHASH" else echo "Cache Does Not Exist for $DEPSHASH" fi - name: Gclient Sync if: steps.check-cache.outputs.cache_exists == 'false' run: | gclient config \ --name "src/electron" \ --unmanaged \ ${GCLIENT_EXTRA_ARGS} \ "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY" ELECTRON_USE_THREE_WAY_MERGE_FOR_PATCHES=1 gclient sync --with_branch_heads --with_tags -vvvvv if [ ${{ inputs.is-release != true }} ]; then # Re-export all the patches to check if there were changes. python3 src/electron/script/export_all_patches.py src/electron/patches/config.json cd src/electron git update-index --refresh || true if ! git diff-index --quiet HEAD --; then # There are changes to the patches. Make a git commit with the updated patches git add patches GIT_COMMITTER_NAME="PatchUp" GIT_COMMITTER_EMAIL="73610968+patchup[bot]@users.noreply.github.com" git commit -m "chore: update patches" --author="PatchUp <73610968+patchup[bot]@users.noreply.github.com>" # Export it mkdir -p ../../patches git format-patch -1 --stdout --keep-subject --no-stat --full-index > ../../patches/update-patches.patch if (node ./script/push-patch.js 2> /dev/null > /dev/null); then echo echo "======================================================================" echo "Changes to the patches when applying, we have auto-pushed the diff to the current branch" echo "A new CI job will kick off shortly" echo "======================================================================" exit 1 else echo echo "======================================================================" echo "There were changes to the patches when applying." echo "Check the CI artifacts for a patch you can apply to fix it." echo "======================================================================" exit 1 fi fi fi # delete all .git directories under src/ except for # third_party/angle/ and third_party/dawn/ because of build time generation of files # gen/angle/commit.h depends on third_party/angle/.git/HEAD # https://chromium-review.googlesource.com/c/angle/angle/+/2074924 # and dawn/common/Version_autogen.h depends on third_party/dawn/.git/HEAD # https://dawn-review.googlesource.com/c/dawn/+/83901 # TODO: maybe better to always leave out */.git/HEAD file for all targets ? - name: Delete .git directories under src to free space if: steps.check-cache.outputs.cache_exists == 'false' run: | cd src ( find . -type d -name ".git" -not -path "./third_party/angle/*" -not -path "./third_party/dawn/*" -not -path "./electron/*" ) | xargs rm -rf - name: Minimize Cache Size for Upload if: steps.check-cache.outputs.cache_exists == 'false' run: | rm -rf src/android_webview rm -rf src/ios/chrome rm -rf src/third_party/blink/web_tests rm -rf src/third_party/blink/perf_tests rm -rf src/chrome/test/data/xr/webvr_info rm -rf src/third_party/angle/third_party/VK-GL-CTS/src rm -rf src/third_party/swift-toolchain rm -rf src/third_party/swiftshader/tests/regres/testlists rm -rf src/electron - name: Compress Src Directory if: steps.check-cache.outputs.cache_exists == 'false' run: | echo "Uncompressed src size: $(du -sh src | cut -f1 -d' ')" tar -cvf $DEPSHASH.tar src echo "Compressed src to $(du -sh $DEPSHASH.tar | cut -f1 -d' ')" - name: Upload Compressed Src Cache to Azure if: steps.check-cache.outputs.cache_exists == 'false' run: | az storage blob upload \ --account-name $AZURE_STORAGE_ACCOUNT \ --account-key $AZURE_STORAGE_KEY \ --container-name $AZURE_STORAGE_CONTAINER_NAME \ --file $DEPSHASH.tar \ --name $DEPSHASH \ --debug