From aafb1ba72c6abc66c81bd530658d3642f9a34f71 Mon Sep 17 00:00:00 2001 From: Keeley Hammond Date: Thu, 23 Jan 2025 11:10:24 -0800 Subject: [PATCH] build: migrate Windows release builds to GHA (#45137) * build: migrate release builds to GHA * build: alter CI jobs release script --- .../pipeline-segment-electron-build.yml | 2 +- .github/workflows/windows-publish.yml | 86 +++++ appveyor-bake.yml | 107 ------ appveyor-woa.yml | 352 ------------------ appveyor.yml | 350 ----------------- script/release/bin/run-release-builds.ts | 10 +- script/release/run-release-ci-jobs.ts | 121 +----- 7 files changed, 93 insertions(+), 935 deletions(-) create mode 100644 .github/workflows/windows-publish.yml delete mode 100644 appveyor-bake.yml delete mode 100644 appveyor-woa.yml delete mode 100644 appveyor.yml diff --git a/.github/workflows/pipeline-segment-electron-build.yml b/.github/workflows/pipeline-segment-electron-build.yml index d8b4314ada..9cc2965675 100644 --- a/.github/workflows/pipeline-segment-electron-build.yml +++ b/.github/workflows/pipeline-segment-electron-build.yml @@ -13,7 +13,7 @@ on: required: true target-arch: type: string - description: 'Arch to build for, can be x64, arm64 or arm' + description: 'Arch to build for, can be x64, arm64, ia32 or arm' required: true target-variant: type: string diff --git a/.github/workflows/windows-publish.yml b/.github/workflows/windows-publish.yml new file mode 100644 index 0000000000..f9ed6930cd --- /dev/null +++ b/.github/workflows/windows-publish.yml @@ -0,0 +1,86 @@ +name: Publish Windows + +on: + workflow_dispatch: + inputs: + build-image-sha: + type: string + description: 'SHA for electron/build image' + default: 'bc2f48b2415a670de18d13605b1cf0eb5fdbaae1' + required: true + upload-to-storage: + description: 'Uploads to Azure storage' + required: false + default: '1' + type: string + run-macos-publish: + description: 'Run the publish jobs vs just the build jobs' + type: boolean + default: false + +jobs: + checkout-windows: + runs-on: electron-arc-linux-amd64-32core + container: + image: ghcr.io/electron/build:${{ inputs.build-image-sha }} + options: --user root --device /dev/fuse --cap-add SYS_ADMIN + volumes: + - /mnt/cross-instance-cache:/mnt/cross-instance-cache + env: + GCLIENT_EXTRA_ARGS: '--custom-var=checkout_win=True' + TARGET_OS: 'win' + ELECTRON_DEPOT_TOOLS_WIN_TOOLCHAIN: '1' + outputs: + build-image-sha: ${{ inputs.build-image-sha }} + steps: + - name: Checkout Electron + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 + with: + path: src/electron + fetch-depth: 0 + - name: Checkout & Sync & Save + uses: ./src/electron/.github/actions/checkout + with: + generate-sas-token: 'true' + + publish-x64-win: + uses: ./.github/workflows/pipeline-segment-electron-build.yml + needs: checkout-windows + with: + environment: production-release + build-runs-on: macos-14-xlarge + target-platform: win + target-arch: x64 + is-release: true + gn-build-type: release + generate-symbols: true + upload-to-storage: ${{ inputs.upload-to-storage }} + secrets: inherit + + publish-arm64-win: + uses: ./.github/workflows/pipeline-segment-electron-build.yml + needs: checkout-windows + with: + environment: production-release + build-runs-on: macos-14-xlarge + target-platform: win + target-arch: arm64 + is-release: true + gn-build-type: release + generate-symbols: true + upload-to-storage: ${{ inputs.upload-to-storage }} + secrets: inherit + + publish-x86-win: + uses: ./.github/workflows/pipeline-segment-electron-build.yml + needs: checkout-windows + with: + environment: production-release + build-runs-on: macos-14-xlarge + target-platform: win + target-arch: x86 + is-release: true + gn-build-type: release + generate-symbols: true + upload-to-storage: ${{ inputs.upload-to-storage }} + secrets: inherit diff --git a/appveyor-bake.yml b/appveyor-bake.yml deleted file mode 100644 index 41d3189dbc..0000000000 --- a/appveyor-bake.yml +++ /dev/null @@ -1,107 +0,0 @@ -# The config is used to bake appveyor images, not for running CI jobs. -# The config expects the following environment variables to be set: -# - "APPVEYOR_BAKE_IMAGE" e.g. 'electron-99.0.4767.0'. Name of the image to be baked. -# Typically named after the Chromium version on which the image is built. -# This can be set dynamically in the prepare-appveyor script. - -version: 1.0.{build} -build_cloud: electronhq-16-core -image: base-bake-image -environment: - GIT_CACHE_PATH: C:\Users\appveyor\libcc_cache - ELECTRON_OUT_DIR: Default - ELECTRON_ENABLE_STACK_DUMPING: 1 - MOCHA_REPORTER: mocha-multi-reporters - MOCHA_MULTI_REPORTERS: mocha-appveyor-reporter, tap - DEPOT_TOOLS_WIN_TOOLCHAIN: 0 - PYTHONIOENCODING: UTF-8 - -# The following lines are needed when baking from a completely new image (eg MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest via image: base-windows-server2019) -# init: -# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) -# - appveyor version -# - ps: $ErrorActionPreference = 'Stop' -# - ps: 'Write-Host "OS Build: $((Get-CimInstance Win32_OperatingSystem).BuildNumber)"' - -# clone_folder: '%USERPROFILE%\image-bake-scripts' - -# clone_script: -# - ps: Invoke-WebRequest "https://github.com/appveyor/build-images/archive/1f90d94e74c8243c909a09b994e527584dfcb838.zip" -OutFile "$env:temp\scripts.zip" -# - ps: Expand-Archive -Path "$env:temp\scripts.zip" -DestinationPath "$env:temp\scripts" -Force -# - ps: Copy-Item -Path "$env:temp\scripts\build-images-1f90d94e74c8243c909a09b994e527584dfcb838\scripts\Windows\*" -Destination $env:APPVEYOR_BUILD_FOLDER -Recurse - -build_script: -# The following lines are needed when baking from a completely new image (eg MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest via image: base-windows-server2019) - # - ps: .\init_server.ps1 - # - ps: .\extend_system_volume.ps1 - - # # Restart VM - # - ps: Start-Sleep -s 5; Restart-Computer - # - ps: Start-Sleep -s 5 - - # - appveyor version - # - ps: .\install_path_utils.ps1 - # - ps: .\install_powershell_core.ps1 - # - ps: .\install_powershell_get.ps1 - # - ps: .\install_7zip.ps1 - # - ps: .\install_chocolatey.ps1 - # - ps: .\install_webpi.ps1 - # - ps: .\install_nuget.ps1 - # - ps: .\install_pstools.ps1 - - # - ps: .\install_git.ps1 - # - ps: .\install_git_lfs.ps1 - - # # Restart VM - # - ps: Start-Sleep -s 5; Restart-Computer - # - ps: Start-Sleep -s 5 -# END LINES FOR COMPLETELY NEW IMAGE - - - git config --global core.longpaths true - - ps: >- - if (-not (Test-Path -Path C:\projects\src)) { - New-Item -Path C:\projects\src -ItemType Directory - } - - cd C:\projects\ - - git clone -q --branch=%APPVEYOR_REPO_BRANCH% https://github.com/electron/electron.git C:\projects\src\electron - - git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git - - ps: $env:PATH="$pwd\depot_tools;$env:PATH" - - update_depot_tools.bat - # Uncomment the following line if windows deps change - - src\electron\script\setup-win-for-dev.bat - - >- - gclient config - --name "src\electron" - --unmanaged - %GCLIENT_EXTRA_ARGS% - "https://github.com/electron/electron" - - ps: cd src\electron - - ps: node script\generate-deps-hash.js - - ps: $depshash = Get-Content .\.depshash -Raw - - ps: Copy-Item -path .\.depshash -destination ..\.depshash - - ps: cd ..\.. - - gclient sync --with_branch_heads --with_tags --nohooks - - ps: regsvr32 /s "C:\Program Files\Microsoft Visual Studio\2022\Community\DIA SDK\bin\amd64\msdia140.dll" - - ps: set vs2022_install="C:\Program Files\Microsoft Visual Studio\2022\Community" - -# The following lines are needed when baking from a completely new image (eg MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest via image: base-windows-server2019) - # # Restart VM - # - ps: Start-Sleep -s 5; Restart-Computer - # - ps: Start-Sleep -s 5 - - # - cd %USERPROFILE%\image-bake-scripts - # - appveyor version - # - ps: .\optimize_dotnet_runtime.ps1 - # - ps: .\disable_windows_background_services.ps1 - # - ps: .\enforce_windows_firewall.ps1 - # - ps: .\cleanup_windows.ps1 -# END LINES FOR COMPLETELY NEW IMAGE -on_image_bake: - - ps: >- - echo "Baking image: $env:APPVEYOR_BAKE_IMAGE at dir $PWD" - - ps: Remove-Item -Recurse -Force C:\projects\depot_tools - - ps: Remove-Item -Recurse -Force C:\projects\src\electron -# Uncomment these lines and set APPVEYOR_RDP_PASSWORD in project settings to enable RDP after bake is done -# # on_finish: -# - ps: >- -# $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) \ No newline at end of file diff --git a/appveyor-woa.yml b/appveyor-woa.yml deleted file mode 100644 index 7dd4b3ca1d..0000000000 --- a/appveyor-woa.yml +++ /dev/null @@ -1,352 +0,0 @@ -# NOTE IF CHANGING THIS FILE, ALSO APPLY THE CHANGE TO appveyor.yml -# IF APPLICABLE!!!! -# -# -# The config expects the following environment variables to be set: -# - "GN_CONFIG" Build type. One of {'testing', 'release'}. -# - "GN_EXTRA_ARGS" Additional gn arguments for a build config, -# e.g. 'target_cpu="x86"' to build for a 32bit platform. -# https://gn.googlesource.com/gn/+/main/docs/reference.md#var_target_cpu -# Don't forget to set up "NPM_CONFIG_ARCH" and "TARGET_ARCH" accordingly -# if you pass a custom value for 'target_cpu'. -# - "ELECTRON_RELEASE" Set it to '1' upload binaries on success. -# - "NPM_CONFIG_ARCH" E.g. 'x86'. Is used to build native Node.js modules. -# Must match 'target_cpu' passed to "GN_EXTRA_ARGS" and "TARGET_ARCH" value. -# - "TARGET_ARCH" Choose from {'ia32', 'x64', 'arm', 'arm64'}. -# Is used in some publishing scripts, but does NOT affect the Electron binary. -# Must match 'target_cpu' passed to "GN_EXTRA_ARGS" and "NPM_CONFIG_ARCH" value. -# - "UPLOAD_TO_STORAGE" Set it to '1' upload a release to the Azure bucket. -# Otherwise the release will be uploaded to the GitHub Releases. -# (The value is only checked if "ELECTRON_RELEASE" is defined.) -# -# The publishing scripts expect access tokens to be defined as env vars, -# but those are not covered here. -# -# AppVeyor docs on variables: -# https://www.appveyor.com/docs/environment-variables/ -# https://www.appveyor.com/docs/build-configuration/#secure-variables -# https://www.appveyor.com/docs/build-configuration/#custom-environment-variables - -version: 1.0.{build} -build_cloud: electronhq-16-core -image: e-133.0.6878.0 -environment: - GIT_CACHE_PATH: C:\Users\appveyor\libcc_cache - ELECTRON_OUT_DIR: Default - ELECTRON_ENABLE_STACK_DUMPING: 1 - ELECTRON_ALSO_LOG_TO_STDERR: 1 - MOCHA_REPORTER: mocha-multi-reporters - MOCHA_MULTI_REPORTERS: "@marshallofsound/mocha-appveyor-reporter, mocha-junit-reporter, tap" - DEPOT_TOOLS_WIN_TOOLCHAIN: 1 - DEPOT_TOOLS_WIN_TOOLCHAIN_BASE_URL: "https://dev-cdn.electronjs.org/windows-toolchains/_" - GYP_MSVS_HASH_7393122652: 3ba76c5c20 - PYTHONIOENCODING: UTF-8 - - matrix: - - - job_name: Build Arm on X64 Windows - - job_name: Test On Windows On Arm Hardware 1 - job_depends_on: Build Arm on X64 Windows - APPVEYOR_BUILD_WORKER_IMAGE: base-woa - APPVEYOR_BUILD_WORKER_CLOUD: electronhq-woa - shard: 1 - - job_name: Test On Windows On Arm Hardware 2 - job_depends_on: Build Arm on X64 Windows - APPVEYOR_BUILD_WORKER_IMAGE: base-woa - APPVEYOR_BUILD_WORKER_CLOUD: electronhq-woa - shard: 2 - -clone_script: -- ps: git clone -q $("--branch=" + $Env:APPVEYOR_REPO_BRANCH) $("https://github.com/" + $Env:APPVEYOR_REPO_NAME + ".git") $Env:APPVEYOR_BUILD_FOLDER -- ps: if (!$Env:APPVEYOR_PULL_REQUEST_NUMBER) {$("git checkout -qf " + $Env:APPVEYOR_REPO_COMMIT)} -- ps: if ($Env:APPVEYOR_PULL_REQUEST_NUMBER) {git fetch -q origin +refs/pull/$($Env:APPVEYOR_PULL_REQUEST_NUMBER)/head; git checkout -qf FETCH_HEAD} - -clone_folder: C:\projects\src\electron - -skip_branch_with_pr: true - -# the first failed job cancels other jobs and fails entire build -matrix: - fast_finish: true - -for: - - - matrix: - only: - - job_name: Build Arm on X64 Windows - - build_script: - # TODO: Remove --ignore-engines once WOA image is up to node 20 - - ps: | - node script/yarn.js install --frozen-lockfile --ignore-engines - node script/doc-only-change.js --prNumber=$env:APPVEYOR_PULL_REQUEST_NUMBER - $env:SHOULD_SKIP_ARTIFACT_VALIDATION = "false" - if ($LASTEXITCODE -eq 0) { - Write-warning "Skipping build for doc-only change" - $env:SHOULD_SKIP_ARTIFACT_VALIDATION = "true" - Exit-AppveyorBuild - } else { - $global:LASTEXITCODE = 0 - } - - cd .. - - ps: Write-Host "Building $env:GN_CONFIG build" - - git config --global core.longpaths true - - ps: >- - if (Test-Path -Path "$pwd\depot_tools") { - Remove-Item -Recurse -Force $pwd\depot_tools - } - - ps: >- - if (Test-Path -Path "$pwd\build-tools") { - Remove-Item -Recurse -Force $pwd\build-tools - } - - git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git - - ps: New-Item -Name depot_tools\.disable_auto_update -ItemType File - - depot_tools\bootstrap\win_tools.bat - - ps: | - Set-Content -Path $pwd\depot_tools\build_telemetry.cfg -Value '{"user": "info@electronjs.org", "status": "opt-out", "countdown": 10, "version": 1}' - - ps: $env:PATH="$pwd\depot_tools;$env:PATH" - - ps: >- - if (Test-Path -Path "$pwd\src\electron") { - Remove-Item -Recurse -Force $pwd\src\electron - } - - git clone https://github.com/electron/build-tools.git - - cd build-tools - - npx yarn --ignore-engines - - mkdir third_party - - ps: >- - node -e "require('./src/utils/reclient.js').downloadAndPrepare({})" - - ps: $env:RECLIENT_HELPER = node -p "require('./src/utils/reclient.js').helperPath({})" - - ps: >- - & $env:RECLIENT_HELPER login - - ps: >- - $env:RBE_service = node -e "console.log(require('./src/utils/reclient.js').serviceAddress)" - - ps: >- - $env:RBE_credentials_helper = $env:RECLIENT_HELPER - - ps: >- - $env:RBE_credentials_helper_args = "print" - - ps: >- - if ($env:ELECTRON_RBE_JWT -eq '') { - $env:RBE_fail_early_min_action_count = "0" - $env:RBE_fail_early_min_fallback_ratio = "0" - } - - cd ..\.. - - ps: $env:CHROMIUM_BUILDTOOLS_PATH="$pwd\src\buildtools" - - ps: >- - if ($env:GN_CONFIG -ne 'release') { - $env:NINJA_STATUS="[%r processes, %f/%t @ %o/s : %es] " - } - - gclient config --name "src\electron" --unmanaged %GCLIENT_EXTRA_ARGS% "https://github.com/electron/electron" - # Patches are applied in the image bake. Check depshash to see if patches have changed. - - ps: $env:RUN_GCLIENT_SYNC="false" - - ps: $depshash_baked = Get-Content .\src\.depshash -Raw - - ps: cd src\electron - - ps: node script\generate-deps-hash.js - - ps: $depshash = Get-Content .\.depshash -Raw - - ps: cd ..\.. - - ps: >- - if ($depshash_baked -ne $depshash) { - $env:RUN_GCLIENT_SYNC="true" - } - - if "%RUN_GCLIENT_SYNC%"=="true" ( gclient sync --with_branch_heads --with_tags ) else ( gclient runhooks ) - - cd src - - ps: $env:PATH="$pwd\third_party\ninja;$env:PATH" - - set BUILD_CONFIG_PATH=//electron/build/args/%GN_CONFIG%.gn - - gn gen out/Default "--args=import(\"%BUILD_CONFIG_PATH%\") use_remoteexec=true %GN_EXTRA_ARGS% " - - gn check out/Default //electron:electron_lib - - gn check out/Default //electron:electron_app - - gn check out/Default //electron/shell/common:mojo - - gn check out/Default //electron/shell/common:plugin - - autoninja -j 300 -C out/Default electron:electron_app - - if "%GN_CONFIG%"=="testing" ( python C:\depot_tools\post_build_ninja_summary.py -C out\Default ) - - gn gen out/ffmpeg "--args=import(\"//electron/build/args/ffmpeg.gn\") use_remoteexec=true %GN_EXTRA_ARGS%" - - autoninja -C out/ffmpeg electron:electron_ffmpeg_zip - - autoninja -C out/Default electron:electron_dist_zip - - gn desc out/Default v8:run_mksnapshot_default args > out/Default/default_mksnapshot_args - # Remove unused args from mksnapshot_args - - ps: >- - Get-Content out/Default/default_mksnapshot_args | Where-Object { -not $_.Contains('--turbo-profiling-input') -And -not $_.Contains('builtins-pgo') } | Set-Content out/Default/mksnapshot_args - - autoninja -C out/Default electron:electron_mksnapshot_zip - - cd out\Default - - 7z a mksnapshot.zip mksnapshot_args gen\v8\embedded.S - - cd ..\.. - - autoninja -C out/Default electron:hunspell_dictionaries_zip - - autoninja -C out/Default electron:electron_chromedriver_zip - - autoninja -C out/Default electron:node_headers - - ps: >- - Get-CimInstance -Namespace root\cimv2 -Class Win32_product | Select vendor, description, @{l='install_location';e='InstallLocation'}, @{l='install_date';e='InstallDate'}, @{l='install_date_2';e='InstallDate2'}, caption, version, name, @{l='sku_number';e='SKUNumber'} | ConvertTo-Json | Out-File -Encoding utf8 -FilePath .\installed_software.json - - python3 electron/build/profile_toolchain.py --output-json=out/Default/windows_toolchain_profile.json - - 7z a node_headers.zip out\Default\gen\node_headers - - 7z a nan.zip third_party\nan - - ps: >- - if ($env:GN_CONFIG -eq 'release') { - # Needed for msdia140.dll on 64-bit windows - $env:Path += ";$pwd\third_party\llvm-build\Release+Asserts\bin" - } - - if "%GN_CONFIG%"=="release" ( autoninja -C out/Default electron:electron_symbols ) - - ps: >- - if ($env:GN_CONFIG -eq 'release') { - python3 electron\script\zip-symbols.py - appveyor-retry appveyor PushArtifact out/Default/symbols.zip - } else { - # It's useful to have pdb files when debugging testing builds that are - # built on CI. - 7z a pdb.zip out\Default\*.pdb - } - - ps: | - $manifest_file = "electron/script/zip_manifests/dist_zip.win.$env:TARGET_ARCH.manifest" - python3 electron/script/zip_manifests/check-zip-manifest.py out/Default/dist.zip $manifest_file - if ($LASTEXITCODE -ne 0) { - throw "Zip contains files not listed in the manifest $manifest_file" - } - - ps: | - cd C:\projects\src - $missing_artifacts = $false - if ($env:SHOULD_SKIP_ARTIFACT_VALIDATION -eq 'true') { - Write-warning "Skipping artifact validation for doc-only $env:APPVEYOR_PROJECT_NAME" - } else { - $artifacts_to_validate = 'dist.zip','windows_toolchain_profile.json','chromedriver.zip','ffmpeg.zip','node_headers.zip','mksnapshot.zip','electron.lib','hunspell_dictionaries.zip','nan.zip' - foreach($artifact_name in $artifacts_to_validate) { - if ($artifact_name -eq 'ffmpeg.zip') { - $artifact_file = "out\ffmpeg\ffmpeg.zip" - } elseif ( - $artifact_name -eq 'node_headers.zip') { - $artifact_file = $artifact_name - } elseif ( - $artifact_name -eq 'nan.zip') { - $artifact_file = $artifact_name - } else { - $artifact_file = "out\Default\$artifact_name" - } - if (-not(Test-Path $artifact_file)) { - Write-warning "$artifact_name is missing and cannot be added to artifacts" - $missing_artifacts = $true - } - } - } - if ($missing_artifacts) { - throw "Build failed due to missing artifacts" - } - - deploy_script: - - cd electron - - ps: >- - if (Test-Path Env:\ELECTRON_RELEASE) { - if (Test-Path Env:\UPLOAD_TO_STORAGE) { - Write-Output "Uploading Electron release distribution to azure" - & python3 script\release\uploaders\upload.py --verbose --upload_to_storage - } else { - Write-Output "Uploading Electron release distribution to github releases" - & python3 script\release\uploaders\upload.py --verbose - } - } - on_finish: - # Uncomment this lines to enable RDP - # - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) - - cd C:\projects\src - - if exist out\Default\windows_toolchain_profile.json ( appveyor-retry appveyor PushArtifact out\Default\windows_toolchain_profile.json ) - - if exist out\Default\dist.zip (appveyor-retry appveyor PushArtifact out\Default\dist.zip) - - if exist out\Default\chromedriver.zip (appveyor-retry appveyor PushArtifact out\Default\chromedriver.zip) - - if exist out\ffmpeg\ffmpeg.zip (appveyor-retry appveyor PushArtifact out\ffmpeg\ffmpeg.zip) - - if exist node_headers.zip (appveyor-retry appveyor PushArtifact node_headers.zip) - - if exist nan.zip (appveyor-retry appveyor PushArtifact nan.zip) - - if exist out\Default\mksnapshot.zip (appveyor-retry appveyor PushArtifact out\Default\mksnapshot.zip) - - if exist out\Default\hunspell_dictionaries.zip (appveyor-retry appveyor PushArtifact out\Default\hunspell_dictionaries.zip) - - if exist out\Default\electron.lib (appveyor-retry appveyor PushArtifact out\Default\electron.lib) - - ps: >- - if ((Test-Path "pdb.zip") -And ($env:GN_CONFIG -ne 'release')) { - appveyor-retry appveyor PushArtifact pdb.zip - } - - matrix: - only: - - job_name: Test On Windows On Arm Hardware 1 - - job_name: Test On Windows On Arm Hardware 2 - - environment: - IGNORE_YARN_INSTALL_ERROR: 1 - ELECTRON_TEST_RESULTS_DIR: C:\projects\src\electron\junit - MOCHA_MULTI_REPORTERS: "@marshallofsound/mocha-appveyor-reporter, mocha-junit-reporter, tap" - MOCHA_REPORTER: mocha-multi-reporters - ELECTRON_SKIP_NATIVE_MODULE_TESTS: true - DD_ENV: ci - DD_SERVICE: electron - DD_CIVISIBILITY_LOGS_ENABLED: true - DD_GIT_REPOSITORY_URL: "https://github.com/electron/electron.git" - - build_script: - - ps: | - node script/yarn.js install --frozen-lockfile --ignore-engines - node script/doc-only-change.js --prNumber=$env:APPVEYOR_PULL_REQUEST_NUMBER - if ($LASTEXITCODE -eq 0) { - Write-warning "Skipping build for doc only change" - Exit-AppveyorBuild - } else { - $global:LASTEXITCODE = 0 - } - - ps: Invoke-WebRequest -Uri "https://github.com/DataDog/datadog-ci/releases/latest/download/datadog-ci_win-x64" -OutFile "C:\projects\src\electron\datadog-ci.exe" - - cd .. - - mkdir out\Default - - cd .. - - ps: | - # Download build artifacts - $apiUrl = 'https://ci.appveyor.com/api' - $build_info = Invoke-RestMethod -Method Get -Uri "$apiUrl/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/builds/$env:APPVEYOR_BUILD_ID" - $artifacts_to_download = @('dist.zip','ffmpeg.zip','node_headers.zip','electron.lib', 'nan.zip') - foreach ($job in $build_info.build.jobs) { - if ($job.name -eq "Build Arm on X64 Windows") { - $jobId = $job.jobId - foreach($artifact_name in $artifacts_to_download) { - if ($artifact_name -eq 'electron.lib') { - $outfile = "src\out\Default\$artifact_name" - } else { - $outfile = $artifact_name - } - Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/$artifact_name" -OutFile $outfile - } - # Uncomment the following lines to download the pdb.zip to show real stacktraces when crashes happen during testing - Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/pdb.zip" -OutFile pdb.zip - 7z x -y -osrc pdb.zip - } - } - - ps: | - $out_default_zips = @('dist.zip') - foreach($zip_name in $out_default_zips) { - 7z x -y -osrc\out\Default $zip_name - } - - ps: 7z x -y -osrc\out\ffmpeg ffmpeg.zip - - ps: 7z x -y -osrc node_headers.zip - - ps: 7z x -y -osrc nan.zip - - test_script: - # Workaround for https://github.com/appveyor/ci/issues/2420 - - set "PATH=%PATH%;C:\Program Files\Git\mingw64\libexec\git-core" - - ps: | - cd src - New-Item .\out\Default\gen\node_headers\Release -Type directory - Copy-Item -path .\out\Default\electron.lib -destination .\out\Default\gen\node_headers\Release\node.lib - - set npm_config_nodedir=%cd%\out\Default\gen\node_headers - - set npm_config_arch=arm64 - - cd electron - # Explicitly set npm_config_arch because the .env doesn't persist - - ps: >- - if ($env:TARGET_ARCH -eq 'ia32') { - $env:npm_config_arch = "ia32" - } - - ps: $env:tests_files=node script\split-tests $env:shard 2 - - echo "Running shard %shard% specs %tests_files%" - - echo Running main test suite & node script/yarn test --runners=main --enable-logging --disable-features=CalculateNativeWinOcclusion --files %tests_files% - - cd .. - - echo Verifying non proprietary ffmpeg & python electron\script\verify-ffmpeg.py --build-dir out\Default --source-root %cd% --ffmpeg-path out\ffmpeg - - on_finish: - # Uncomment these lines to enable RDP - # - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) - - if exist electron\junit\test-results-main.xml ( appveyor-retry appveyor PushArtifact electron\junit\test-results-main.xml ) - - ps: | - if ($env:DD_API_KEY) { - $env:DD_GIT_COMMIT_SHA = $env:APPVEYOR_REPO_COMMIT - $env:DD_GIT_BRANCH = $env:APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH - $env:DD_TAGS = "os.architecture:$env:TARGET_ARCH,os.family:windows,os.platform:win32" - if (Test-Path -Path "C:\projects\src\electron\junit\test-results-main.xml") { - C:\projects\src\electron\datadog-ci.exe junit upload --verbose C:\projects\src\electron\junit\test-results-main.xml - } - } diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index ea97d3851c..0000000000 --- a/appveyor.yml +++ /dev/null @@ -1,350 +0,0 @@ -# NOTE IF CHANGING THIS FILE, ALSO APPLY THE CHANGE TO appveyor-woa.yml -# IF APPLICABLE!!!! -# -# -# The config expects the following environment variables to be set: -# - "GN_CONFIG" Build type. One of {'testing', 'release'}. -# - "GN_EXTRA_ARGS" Additional gn arguments for a build config, -# e.g. 'target_cpu="x86"' to build for a 32bit platform. -# https://gn.googlesource.com/gn/+/main/docs/reference.md#var_target_cpu -# Don't forget to set up "NPM_CONFIG_ARCH" and "TARGET_ARCH" accordingly -# if you pass a custom value for 'target_cpu'. -# - "ELECTRON_RELEASE" Set it to '1' upload binaries on success. -# - "NPM_CONFIG_ARCH" E.g. 'x86'. Is used to build native Node.js modules. -# Must match 'target_cpu' passed to "GN_EXTRA_ARGS" and "TARGET_ARCH" value. -# - "TARGET_ARCH" Choose from {'ia32', 'x64', 'arm', 'arm64'}. -# Is used in some publishing scripts, but does NOT affect the Electron binary. -# Must match 'target_cpu' passed to "GN_EXTRA_ARGS" and "NPM_CONFIG_ARCH" value. -# - "UPLOAD_TO_STORAGE" Set it to '1' upload a release to the Azure bucket. -# Otherwise the release will be uploaded to the GitHub Releases. -# (The value is only checked if "ELECTRON_RELEASE" is defined.) -# -# The publishing scripts expect access tokens to be defined as env vars, -# but those are not covered here. -# -# AppVeyor docs on variables: -# https://www.appveyor.com/docs/environment-variables/ -# https://www.appveyor.com/docs/build-configuration/#secure-variables -# https://www.appveyor.com/docs/build-configuration/#custom-environment-variables - -version: 1.0.{build} -build_cloud: electronhq-16-core -image: e-133.0.6878.0 -environment: - GIT_CACHE_PATH: C:\Users\appveyor\libcc_cache - ELECTRON_OUT_DIR: Default - ELECTRON_ENABLE_STACK_DUMPING: 1 - ELECTRON_ALSO_LOG_TO_STDERR: 1 - MOCHA_REPORTER: mocha-multi-reporters - MOCHA_MULTI_REPORTERS: "@marshallofsound/mocha-appveyor-reporter, mocha-junit-reporter, tap" - DEPOT_TOOLS_WIN_TOOLCHAIN: 1 - DEPOT_TOOLS_WIN_TOOLCHAIN_BASE_URL: "https://dev-cdn.electronjs.org/windows-toolchains/_" - GYP_MSVS_HASH_7393122652: 3ba76c5c20 - PYTHONIOENCODING: UTF-8 - - matrix: - - - job_name: Build - - job_name: Test 1 - job_depends_on: Build - shard: 1 - - job_name: Test 2 - job_depends_on: Build - shard: 2 - -clone_script: -- ps: git clone -q $("--branch=" + $Env:APPVEYOR_REPO_BRANCH) $("https://github.com/" + $Env:APPVEYOR_REPO_NAME + ".git") $Env:APPVEYOR_BUILD_FOLDER -- ps: if (!$Env:APPVEYOR_PULL_REQUEST_NUMBER) {$("git checkout -qf " + $Env:APPVEYOR_REPO_COMMIT)} -- ps: if ($Env:APPVEYOR_PULL_REQUEST_NUMBER) {git fetch -q origin +refs/pull/$($Env:APPVEYOR_PULL_REQUEST_NUMBER)/head; git checkout -qf FETCH_HEAD} - -clone_folder: C:\projects\src\electron - -skip_branch_with_pr: true - -# the first failed job cancels other jobs and fails entire build -matrix: - fast_finish: true - -for: - - - matrix: - only: - - job_name: Build - - build_script: - - ps: | - node script/yarn.js install --frozen-lockfile - node script/doc-only-change.js --prNumber=$env:APPVEYOR_PULL_REQUEST_NUMBER - $env:SHOULD_SKIP_ARTIFACT_VALIDATION = "false" - if ($LASTEXITCODE -eq 0) { - Write-warning "Skipping build for doc-only change" - $env:SHOULD_SKIP_ARTIFACT_VALIDATION = "true" - Exit-AppveyorBuild - } else { - $global:LASTEXITCODE = 0 - } - - cd .. - - ps: Write-Host "Building $env:GN_CONFIG build" - - git config --global core.longpaths true - - ps: >- - if (Test-Path -Path "$pwd\depot_tools") { - Remove-Item -Recurse -Force $pwd\depot_tools - } - - ps: >- - if (Test-Path -Path "$pwd\build-tools") { - Remove-Item -Recurse -Force $pwd\build-tools - } - - git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git - - ps: New-Item -Name depot_tools\.disable_auto_update -ItemType File - - depot_tools\bootstrap\win_tools.bat - - ps: | - Set-Content -Path $pwd\depot_tools\build_telemetry.cfg -Value '{"user": "info@electronjs.org", "status": "opt-out", "countdown": 10, "version": 1}' - - ps: $env:PATH="$pwd\depot_tools;$env:PATH" - - ps: >- - if (Test-Path -Path "$pwd\src\electron") { - Remove-Item -Recurse -Force $pwd\src\electron - } - - git clone https://github.com/electron/build-tools.git - - cd build-tools - - npx yarn --ignore-engines - - mkdir third_party - - ps: >- - node -e "require('./src/utils/reclient.js').downloadAndPrepare({})" - - ps: $env:RECLIENT_HELPER = node -p "require('./src/utils/reclient.js').helperPath({})" - - ps: >- - & $env:RECLIENT_HELPER login - - ps: >- - $env:RBE_service = node -e "console.log(require('./src/utils/reclient.js').serviceAddress)" - - ps: >- - $env:RBE_credentials_helper = $env:RECLIENT_HELPER - - ps: >- - $env:RBE_credentials_helper_args = "print" - - ps: >- - if ($env:ELECTRON_RBE_JWT -eq '') { - $env:RBE_fail_early_min_action_count = "0" - $env:RBE_fail_early_min_fallback_ratio = "0" - } - - cd ..\.. - - ps: $env:CHROMIUM_BUILDTOOLS_PATH="$pwd\src\buildtools" - - ps: >- - if ($env:GN_CONFIG -ne 'release') { - $env:NINJA_STATUS="[%r processes, %f/%t @ %o/s : %es] " - } - - gclient config --name "src\electron" --unmanaged %GCLIENT_EXTRA_ARGS% "https://github.com/electron/electron" - # Patches are applied in the image bake. Check depshash to see if patches have changed. - - ps: $env:RUN_GCLIENT_SYNC="false" - - ps: $depshash_baked = Get-Content .\src\.depshash -Raw - - ps: cd src\electron - - ps: node script\generate-deps-hash.js - - ps: $depshash = Get-Content .\.depshash -Raw - - ps: cd ..\.. - - ps: >- - if ($depshash_baked -ne $depshash) { - $env:RUN_GCLIENT_SYNC="true" - } - - if "%RUN_GCLIENT_SYNC%"=="true" ( gclient sync --with_branch_heads --with_tags ) else ( gclient runhooks ) - - cd src - - ps: $env:PATH="$pwd\third_party\ninja;$env:PATH" - - set BUILD_CONFIG_PATH=//electron/build/args/%GN_CONFIG%.gn - - gn gen out/Default "--args=import(\"%BUILD_CONFIG_PATH%\") use_remoteexec=true %GN_EXTRA_ARGS% " - - gn check out/Default //electron:electron_lib - - gn check out/Default //electron:electron_app - - gn check out/Default //electron/shell/common:mojo - - gn check out/Default //electron/shell/common:plugin - - autoninja -j 300 -C out/Default electron:electron_app - - if "%GN_CONFIG%"=="testing" ( python C:\depot_tools\post_build_ninja_summary.py -C out\Default ) - - gn gen out/ffmpeg "--args=import(\"//electron/build/args/ffmpeg.gn\") use_remoteexec=true %GN_EXTRA_ARGS%" - - autoninja -C out/ffmpeg electron:electron_ffmpeg_zip - - autoninja -C out/Default electron:electron_dist_zip - - gn desc out/Default v8:run_mksnapshot_default args > out/Default/default_mksnapshot_args - # Remove unused args from mksnapshot_args - - ps: >- - Get-Content out/Default/default_mksnapshot_args | Where-Object { -not $_.Contains('--turbo-profiling-input') -And -not $_.Contains('builtins-pgo') } | Set-Content out/Default/mksnapshot_args - - autoninja -C out/Default electron:electron_mksnapshot_zip - - cd out\Default - - 7z a mksnapshot.zip mksnapshot_args gen\v8\embedded.S - - cd ..\.. - - autoninja -C out/Default electron:hunspell_dictionaries_zip - - autoninja -C out/Default electron:electron_chromedriver_zip - - autoninja -C out/Default electron:node_headers - - ps: >- - Get-CimInstance -Namespace root\cimv2 -Class Win32_product | Select vendor, description, @{l='install_location';e='InstallLocation'}, @{l='install_date';e='InstallDate'}, @{l='install_date_2';e='InstallDate2'}, caption, version, name, @{l='sku_number';e='SKUNumber'} | ConvertTo-Json | Out-File -Encoding utf8 -FilePath .\installed_software.json - - python3 electron/build/profile_toolchain.py --output-json=out/Default/windows_toolchain_profile.json - - 7z a node_headers.zip out\Default\gen\node_headers - - ps: >- - if ($env:GN_CONFIG -eq 'release') { - # Needed for msdia140.dll on 64-bit windows - $env:Path += ";$pwd\third_party\llvm-build\Release+Asserts\bin" - } - - if "%GN_CONFIG%"=="release" ( autoninja -C out/Default electron:electron_symbols ) - - ps: >- - if ($env:GN_CONFIG -eq 'release') { - python3 electron\script\zip-symbols.py - appveyor-retry appveyor PushArtifact out/Default/symbols.zip - } else { - # It's useful to have pdb files when debugging testing builds that are - # built on CI. - 7z a pdb.zip out\Default\*.pdb - } - - ps: | - if ($env:TARGET_ARCH -eq 'ia32') { - $env:MANIFEST_ARCH = "x86" - } else { - $env:MANIFEST_ARCH = $env:TARGET_ARCH - } - $manifest_file = "electron/script/zip_manifests/dist_zip.win.$env:MANIFEST_ARCH.manifest" - python3 electron/script/zip_manifests/check-zip-manifest.py out/Default/dist.zip $manifest_file - if ($LASTEXITCODE -ne 0) { - throw "Zip contains files not listed in the manifest $manifest_file" - } - - ps: | - cd C:\projects\src - $missing_artifacts = $false - if ($env:SHOULD_SKIP_ARTIFACT_VALIDATION -eq 'true') { - Write-warning "Skipping artifact validation for doc-only $env:APPVEYOR_PROJECT_NAME" - } else { - $artifacts_to_validate = 'dist.zip','windows_toolchain_profile.json','chromedriver.zip','ffmpeg.zip','node_headers.zip','mksnapshot.zip','electron.lib','hunspell_dictionaries.zip' - foreach($artifact_name in $artifacts_to_validate) { - if ($artifact_name -eq 'ffmpeg.zip') { - $artifact_file = "out\ffmpeg\ffmpeg.zip" - } elseif ( - $artifact_name -eq 'node_headers.zip') { - $artifact_file = $artifact_name - } else { - $artifact_file = "out\Default\$artifact_name" - } - if (-not(Test-Path $artifact_file)) { - Write-warning "$artifact_name is missing and cannot be added to artifacts" - $missing_artifacts = $true - } - } - } - if ($missing_artifacts) { - throw "Build failed due to missing artifacts" - } - - deploy_script: - - cd electron - - ps: >- - if (Test-Path Env:\ELECTRON_RELEASE) { - if (Test-Path Env:\UPLOAD_TO_STORAGE) { - Write-Output "Uploading Electron release distribution to azure" - & python3 script\release\uploaders\upload.py --verbose --upload_to_storage - } else { - Write-Output "Uploading Electron release distribution to github releases" - & python3 script\release\uploaders\upload.py --verbose - } - } - on_finish: - # Uncomment this lines to enable RDP - # - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) - - cd C:\projects\src - - if exist out\Default\windows_toolchain_profile.json ( appveyor-retry appveyor PushArtifact out\Default\windows_toolchain_profile.json ) - - if exist out\Default\dist.zip (appveyor-retry appveyor PushArtifact out\Default\dist.zip) - - if exist out\Default\chromedriver.zip (appveyor-retry appveyor PushArtifact out\Default\chromedriver.zip) - - if exist out\ffmpeg\ffmpeg.zip (appveyor-retry appveyor PushArtifact out\ffmpeg\ffmpeg.zip) - - if exist node_headers.zip (appveyor-retry appveyor PushArtifact node_headers.zip) - - if exist out\Default\mksnapshot.zip (appveyor-retry appveyor PushArtifact out\Default\mksnapshot.zip) - - if exist out\Default\hunspell_dictionaries.zip (appveyor-retry appveyor PushArtifact out\Default\hunspell_dictionaries.zip) - - if exist out\Default\electron.lib (appveyor-retry appveyor PushArtifact out\Default\electron.lib) - - ps: >- - if ((Test-Path "pdb.zip") -And ($env:GN_CONFIG -ne 'release')) { - appveyor-retry appveyor PushArtifact pdb.zip - } - - matrix: - only: - - job_name: Test 1 - - job_name: Test 2 - - environment: - DD_ENV: ci - DD_SERVICE: electron - DD_CIVISIBILITY_LOGS_ENABLED: true - DD_GIT_REPOSITORY_URL: "https://github.com/electron/electron.git" - ELECTRON_TEST_RESULTS_DIR: C:\projects\src\electron\junit - - init: - - ps: | - if ($env:RUN_TESTS -ne 'true') { - Write-warning "Skipping tests for $env:APPVEYOR_PROJECT_NAME"; Exit-AppveyorBuild - } - build_script: - - ps: | - node script/yarn.js install --frozen-lockfile - node script/doc-only-change.js --prNumber=$env:APPVEYOR_PULL_REQUEST_NUMBER - if ($LASTEXITCODE -eq 0) { - Write-warning "Skipping build for doc only change" - Exit-AppveyorBuild - } else { - $global:LASTEXITCODE = 0 - } - - npm install -g @datadog/datadog-ci - - cd .. - - mkdir out\Default - - cd .. - - ps: | - # Download build artifacts - $apiUrl = 'https://ci.appveyor.com/api' - $build_info = Invoke-RestMethod -Method Get -Uri "$apiUrl/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/builds/$env:APPVEYOR_BUILD_ID" - $artifacts_to_download = @('dist.zip','chromedriver.zip','ffmpeg.zip','node_headers.zip','mksnapshot.zip','electron.lib') - foreach ($job in $build_info.build.jobs) { - if ($job.name -eq "Build") { - $jobId = $job.jobId - foreach($artifact_name in $artifacts_to_download) { - if ($artifact_name -eq 'electron.lib') { - $outfile = "src\out\Default\$artifact_name" - } else { - $outfile = $artifact_name - } - Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/$artifact_name" -OutFile $outfile - } - # Uncomment the following lines to download the pdb.zip to show real stacktraces when crashes happen during testing - Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/pdb.zip" -OutFile pdb.zip - 7z x -y -osrc pdb.zip - } - } - - ps: | - $out_default_zips = @('dist.zip','chromedriver.zip','mksnapshot.zip') - foreach($zip_name in $out_default_zips) { - 7z x -y -osrc\out\Default $zip_name - } - - ps: 7z x -y -osrc\out\ffmpeg ffmpeg.zip - - ps: 7z x -y -osrc node_headers.zip - - test_script: - # Workaround for https://github.com/appveyor/ci/issues/2420 - - set "PATH=%PATH%;C:\Program Files\Git\mingw64\libexec\git-core" - - ps: | - cd src - New-Item .\out\Default\gen\node_headers\Release -Type directory - Copy-Item -path .\out\Default\electron.lib -destination .\out\Default\gen\node_headers\Release\node.lib - - cd electron - # Explicitly set npm_config_arch because the .env doesn't persist - - ps: >- - if ($env:TARGET_ARCH -eq 'ia32') { - $env:npm_config_arch = "ia32" - } - - ps: $env:tests_files=node script\split-tests $env:shard 2 - - echo "Running shard %shard% specs %tests_files%" - - echo Running main test suite & node script/yarn test -- --trace-uncaught --runners=main --enable-logging --files %tests_files% - - cd .. - - echo Verifying non proprietary ffmpeg & python electron\script\verify-ffmpeg.py --build-dir out\Default --source-root %cd% --ffmpeg-path out\ffmpeg - - echo "About to verify mksnapshot" - - echo Verifying mksnapshot & python electron\script\verify-mksnapshot.py --build-dir out\Default --source-root %cd% - - echo "Done verifying mksnapshot" - - echo Verifying chromedriver & python electron\script\verify-chromedriver.py --build-dir out\Default --source-root %cd% - - echo "Done verifying chromedriver" - - on_finish: - # Uncomment these lines to enable RDP - # - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) - - if exist electron\junit\test-results-main.xml ( appveyor-retry appveyor PushArtifact electron\junit\test-results-main.xml ) - - ps: | - if ($env:RUN_TESTS -eq 'true' -And $env:DD_API_KEY) { - $env:DD_GIT_COMMIT_SHA = $env:APPVEYOR_REPO_COMMIT - $env:DD_GIT_BRANCH = $env:APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH - $env:DD_TAGS = "os.architecture:$env:TARGET_ARCH,os.family:windows,os.platform:win32" - if (Test-Path -Path "C:\projects\src\electron\junit\test-results-main.xml") { - C:\Users\appveyor\AppData\Roaming\npm\datadog-ci.ps1 junit upload --verbose C:\projects\src\electron\junit\test-results-main.xml - } - } diff --git a/script/release/bin/run-release-builds.ts b/script/release/bin/run-release-builds.ts index 4947413a35..e2e6e95439 100644 --- a/script/release/bin/run-release-builds.ts +++ b/script/release/bin/run-release-builds.ts @@ -2,7 +2,7 @@ import { parseArgs } from 'node:util'; import { runReleaseCIJobs } from '../run-release-ci-jobs'; -const { values: { ghRelease, job, arch, ci, commit, newVersion }, positionals } = parseArgs({ +const { values: { ghRelease, job, arch, ci, newVersion }, positionals } = parseArgs({ options: { ghRelease: { type: 'boolean' @@ -16,9 +16,6 @@ const { values: { ghRelease, job, arch, ci, commit, newVersion }, positionals } ci: { type: 'string' }, - commit: { - type: 'string' - }, newVersion: { type: 'string' } @@ -44,10 +41,9 @@ if (ci === 'GitHubActions' || !ci) { } runReleaseCIJobs(targetBranch, { - ci: ci as 'GitHubActions' | 'AppVeyor', + ci: ci as 'GitHubActions', ghRelease, job: job as any, arch, - newVersion: newVersion!, - commit + newVersion: newVersion! }); diff --git a/script/release/run-release-ci-jobs.ts b/script/release/run-release-ci-jobs.ts index c4f6acc5ef..c3647eb2fc 100644 --- a/script/release/run-release-ci-jobs.ts +++ b/script/release/run-release-ci-jobs.ts @@ -1,5 +1,4 @@ import { Octokit } from '@octokit/rest'; -import got, { OptionsOfTextResponseBody } from 'got'; import * as assert from 'node:assert'; @@ -10,57 +9,17 @@ const octokit = new Octokit({ authStrategy: createGitHubTokenStrategy(ELECTRON_REPO) }); -const BUILD_APPVEYOR_URL = 'https://ci.appveyor.com/api/builds'; const GH_ACTIONS_PIPELINE_URL = 'https://github.com/electron/electron/actions'; - const GH_ACTIONS_WAIT_TIME = process.env.GH_ACTIONS_WAIT_TIME ? parseInt(process.env.GH_ACTIONS_WAIT_TIME, 10) : 30000; -const appVeyorJobs = { - 'electron-x64': 'electron-x64-release', - 'electron-ia32': 'electron-ia32-release', - 'electron-woa': 'electron-woa-release' -}; - const ghActionsPublishWorkflows = [ 'linux-publish', - 'macos-publish' + 'macos-publish', + 'windows-publish' ] as const; let jobRequestedCount = 0; -type ReleaseBuildRequestOptions = { - auth?: { - bearer?: string; - }; - url: string; - headers: Record; - body: string, - method: 'GET' | 'POST'; -} - -async function makeRequest ({ auth, url, headers, body, method }: ReleaseBuildRequestOptions) { - const clonedHeaders = { - ...(headers || {}) - }; - if (auth?.bearer) { - clonedHeaders.Authorization = `Bearer ${auth.bearer}`; - } - - const options: OptionsOfTextResponseBody = { - headers: clonedHeaders, - body, - method - }; - - const response = await got(url, options); - - if (response.statusCode < 200 || response.statusCode >= 300) { - console.error('Error: ', `(status ${response.statusCode})`, response.body); - throw new Error(`Unexpected status code ${response.statusCode} from ${url}`); - } - return JSON.parse(response.body); -} - type GitHubActionsCallOptions = { ghRelease?: boolean; newVersion: string; @@ -175,73 +134,6 @@ async function getGitHubActionsRun (workflowName: string, headCommit: string) { return runNumber; } -type AppVeyorCallOptions = { - ghRelease?: boolean; - commit?: string; -} - -async function callAppVeyor (targetBranch: string, job: keyof typeof appVeyorJobs, options: AppVeyorCallOptions) { - console.log(`Triggering AppVeyor to run build job: ${job} on branch: ${targetBranch} with release flag.`); - const environmentVariables: Record = { - ELECTRON_RELEASE: 1, - APPVEYOR_BUILD_WORKER_CLOUD: 'electronhq-16-core' - }; - - if (!options.ghRelease) { - environmentVariables.UPLOAD_TO_STORAGE = 1; - } - - const requestOpts = { - url: BUILD_APPVEYOR_URL, - auth: { - bearer: process.env.APPVEYOR_CLOUD_TOKEN - }, - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - accountName: 'electron-bot', - projectSlug: appVeyorJobs[job], - branch: targetBranch, - commitId: options.commit || undefined, - environmentVariables - }), - method: 'POST' - } as const; - jobRequestedCount++; - - try { - const { version } = await makeRequest(requestOpts); - const buildUrl = `https://ci.appveyor.com/project/electron-bot/${appVeyorJobs[job]}/build/${version}`; - console.log(`AppVeyor release build request for ${job} successful. Check build status at ${buildUrl}`); - } catch (err: any) { - if (err.response?.body) { - console.error('Could not call AppVeyor: ', { - statusCode: err.response.statusCode, - body: JSON.parse(err.response.body) - }); - } else { - console.error('Error calling AppVeyor:', err); - } - } -} - -type BuildAppVeyorOptions = { - job?: keyof typeof appVeyorJobs; -} & AppVeyorCallOptions; - -async function buildAppVeyor (targetBranch: string, options: BuildAppVeyorOptions) { - const validJobs = Object.keys(appVeyorJobs) as (keyof typeof appVeyorJobs)[]; - if (options.job) { - assert(validJobs.includes(options.job), `Unknown AppVeyor CI job name: ${options.job}. Valid values are: ${validJobs}.`); - await callAppVeyor(targetBranch, options.job, options); - } else { - for (const job of validJobs) { - await callAppVeyor(targetBranch, job, options); - } - } -} - type BuildGHActionsOptions = { job?: typeof ghActionsPublishWorkflows[number]; arch?: string; @@ -263,10 +155,8 @@ async function buildGHActions (targetBranch: string, options: BuildGHActionsOpti type RunReleaseOptions = ({ ci: 'GitHubActions' } & BuildGHActionsOptions) | ({ - ci: 'AppVeyor' -} & BuildAppVeyorOptions) | ({ ci: undefined, -} & BuildAppVeyorOptions & BuildGHActionsOptions); +} & BuildGHActionsOptions); export async function runReleaseCIJobs (targetBranch: string, options: RunReleaseOptions) { if (options.ci) { @@ -275,10 +165,6 @@ export async function runReleaseCIJobs (targetBranch: string, options: RunReleas await buildGHActions(targetBranch, options); break; } - case 'AppVeyor': { - await buildAppVeyor(targetBranch, options); - break; - } default: { console.log(`Error! Unknown CI: ${(options as any).ci}.`); process.exit(1); @@ -286,7 +172,6 @@ export async function runReleaseCIJobs (targetBranch: string, options: RunReleas } } else { await Promise.all([ - buildAppVeyor(targetBranch, options), buildGHActions(targetBranch, options) ]); }