Path: blob/main/build/azure-pipelines/darwin/steps/product-build-darwin-compile.yml
5387 views
parameters:1- name: VSCODE_ARCH2type: string3- name: VSCODE_CIBUILD4type: boolean5- name: VSCODE_RUN_ELECTRON_TESTS6type: boolean7default: false8- name: VSCODE_RUN_BROWSER_TESTS9type: boolean10default: false11- name: VSCODE_RUN_REMOTE_TESTS12type: boolean13default: false1415steps:16- template: ../../common/checkout.yml@self1718- task: NodeTool@019inputs:20versionSource: fromFile21versionFilePath: .nvmrc2223- template: ../../distro/download-distro.yml@self2425- task: AzureKeyVault@226displayName: "Azure Key Vault: Get Secrets"27inputs:28azureSubscription: vscode29KeyVaultName: vscode-build-secrets30SecretsFilter: "github-distro-mixin-password,macos-developer-certificate,macos-developer-certificate-key"3132- task: DownloadPipelineArtifact@233inputs:34artifact: Compilation35path: $(Build.ArtifactStagingDirectory)36displayName: Download compilation output3738- script: tar -xzf $(Build.ArtifactStagingDirectory)/compilation.tar.gz39displayName: Extract compilation output4041- script: node build/setup-npm-registry.ts $NPM_REGISTRY42condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))43displayName: Setup NPM Registry4445- script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.ts darwin $VSCODE_ARCH $(node -p process.arch) > .build/packagelockhash46displayName: Prepare node_modules cache key4748- task: Cache@249inputs:50key: '"node_modules" | .build/packagelockhash'51path: .build/node_modules_cache52cacheHitVar: NODE_MODULES_RESTORED53displayName: Restore node_modules cache5455- script: tar -xzf .build/node_modules_cache/cache.tgz56condition: and(succeeded(), eq(variables.NODE_MODULES_RESTORED, 'true'))57displayName: Extract node_modules cache5859- script: |60set -e61# Set the private NPM registry to the global npmrc file62# so that authentication works for subfolders like build/, remote/, extensions/ etc63# which does not have their own .npmrc file64npm config set registry "$NPM_REGISTRY"65echo "##vso[task.setvariable variable=NPMRC_PATH]$(npm config get userconfig)"66condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))67displayName: Setup NPM6869- task: npmAuthenticate@070inputs:71workingFile: $(NPMRC_PATH)72condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))73displayName: Setup NPM Authentication7475- script: |76set -e77c++ --version78xcode-select -print-path79python3 -m pip install setuptools8081for i in {1..5}; do # try 5 times82npm ci && break83if [ $i -eq 5 ]; then84echo "Npm install failed too many times" >&285exit 186fi87echo "Npm install failed $i, trying again..."88done89env:90npm_config_arch: $(VSCODE_ARCH)91ELECTRON_SKIP_BINARY_DOWNLOAD: 192PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 193GITHUB_TOKEN: "$(github-distro-mixin-password)"94# Avoid using dlopen to load Kerberos on macOS which can cause missing libraries95# https://github.com/mongodb-js/kerberos/commit/04044d2814ad1d01e77f1ce87f26b03d86692cf296# flipped the default to support legacy linux distros which shouldn't happen97# on macOS.98GYP_DEFINES: "kerberos_use_rtld=false"99displayName: Install dependencies100condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))101102- script: node build/azure-pipelines/distro/mixin-npm.ts103condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))104displayName: Mixin distro node modules105106- script: |107set -e108node build/azure-pipelines/common/listNodeModules.ts .build/node_modules_list.txt109mkdir -p .build/node_modules_cache110tar -czf .build/node_modules_cache/cache.tgz --files-from .build/node_modules_list.txt111condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))112displayName: Create node_modules archive113114- script: node build/azure-pipelines/distro/mixin-quality.ts115displayName: Mixin distro quality116117- template: ../../common/install-builtin-extensions.yml@self118119- ${{ if ne(parameters.VSCODE_CIBUILD, true) }}:120- script: npm run copy-policy-dto --prefix build && node build/lib/policies/policyGenerator.ts build/lib/policies/policyData.jsonc darwin121displayName: Generate policy definitions122retryCountOnTaskFailure: 3123124- script: |125set -e126npm run gulp vscode-darwin-$(VSCODE_ARCH)-min-ci127echo "##vso[task.setvariable variable=BUILT_CLIENT]true"128env:129GITHUB_TOKEN: "$(github-distro-mixin-password)"130displayName: Build client131132- script: |133set -e134npm run gulp vscode-reh-darwin-$(VSCODE_ARCH)-min-ci135mv ../vscode-reh-darwin-$(VSCODE_ARCH) ../vscode-server-darwin-$(VSCODE_ARCH) # TODO@joaomoreno136env:137GITHUB_TOKEN: "$(github-distro-mixin-password)"138displayName: Build server139140- script: |141set -e142npm run gulp vscode-reh-web-darwin-$(VSCODE_ARCH)-min-ci143mv ../vscode-reh-web-darwin-$(VSCODE_ARCH) ../vscode-server-darwin-$(VSCODE_ARCH)-web # TODO@joaomoreno144env:145GITHUB_TOKEN: "$(github-distro-mixin-password)"146displayName: Build server (web)147148- ${{ if ne(parameters.VSCODE_CIBUILD, true) }}:149- task: DownloadPipelineArtifact@2150inputs:151artifact: unsigned_vscode_cli_darwin_$(VSCODE_ARCH)_cli152patterns: "**"153path: $(Build.ArtifactStagingDirectory)/cli154displayName: Download VS Code CLI155156- script: |157set -e158APP_ROOT="$(Agent.BuildDirectory)/VSCode-darwin-$(VSCODE_ARCH)"159APP_NAME="`ls $APP_ROOT | head -n 1`"160APP_PATH="$APP_ROOT/$APP_NAME"161unzip $(Build.ArtifactStagingDirectory)/cli/*.zip -d $(Build.ArtifactStagingDirectory)/cli162CLI_APP_NAME=$(node -p "require(\"$APP_PATH/Contents/Resources/app/product.json\").tunnelApplicationName")163APP_NAME=$(node -p "require(\"$APP_PATH/Contents/Resources/app/product.json\").applicationName")164mv "$(Build.ArtifactStagingDirectory)/cli/$APP_NAME" "$APP_PATH/Contents/Resources/app/bin/$CLI_APP_NAME"165chmod +x "$APP_PATH/Contents/Resources/app/bin/$CLI_APP_NAME"166displayName: Make CLI executable167168- script: |169set -e170APP_ROOT="$(Agent.BuildDirectory)/VSCode-darwin-$(VSCODE_ARCH)"171APP_NAME="`ls $APP_ROOT | head -n 1`"172APP_PATH="$APP_ROOT/$APP_NAME"173EXEC_NAME=$(node -p "require(\"$APP_PATH/Contents/Resources/app/product.json\").nameShort")174# Create a symlink from 'Electron' to the actual executable for backward compatibility175# This ensures apps that relied on the hardcoded path 'Contents/MacOS/Electron' continue to work176# Remove this step once main branch is on 1.112 release.177if [ "$EXEC_NAME" != "Electron" ] && [ ! -L "$APP_PATH/Contents/MacOS/Electron" ]; then178ln -s "$EXEC_NAME" "$APP_PATH/Contents/MacOS/Electron"179fi180condition: eq(variables['BUILT_CLIENT'], 'true')181displayName: Create Electron symlink for backward compatibility182183- script: |184set -e185APP_ROOT="$(Agent.BuildDirectory)/VSCode-darwin-$(VSCODE_ARCH)"186APP_NAME="`ls $APP_ROOT | head -n 1`"187APP_PATH="$APP_ROOT/$APP_NAME" node build/darwin/verify-macho.ts $(VSCODE_ARCH)188APP_PATH="$(Agent.BuildDirectory)/vscode-server-darwin-$(VSCODE_ARCH)" node build/darwin/verify-macho.ts $(VSCODE_ARCH)189displayName: Verify arch of Mach-O objects190191- script: |192set -e193ARCHIVE_PATH="$(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip"194mkdir -p $(dirname $ARCHIVE_PATH)195(cd ../VSCode-darwin-$(VSCODE_ARCH) && zip -Xry $ARCHIVE_PATH *)196echo "##vso[task.setvariable variable=CLIENT_PATH]$ARCHIVE_PATH"197condition: eq(variables['BUILT_CLIENT'], 'true')198displayName: Package client199200- pwsh: node build/azure-pipelines/common/checkForArtifact.ts CLIENT_ARCHIVE_UPLOADED unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive201env:202SYSTEM_ACCESSTOKEN: $(System.AccessToken)203displayName: Check for client artifact204205# We are publishing the unsigned client artifact before running tests206# since the macOS (UNIVERSAL) job is blocked waiting for the artifact.207- template: ../../common/publish-artifact.yml@self208parameters:209targetPath: $(CLIENT_PATH)210artifactName: unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive211displayName: Publish client archive (unsigned)212sbomEnabled: false213condition: and(ne(variables['CLIENT_PATH'], ''), eq(variables['CLIENT_ARCHIVE_UPLOADED'], 'false'))214215# Hardened entitlements should be set after publishing unsigned client artifacts216# to ensure entitlement signing doesn't modify sha that would affect universal build.217#218# Setting hardened entitlements is a requirement for:219# * Apple notarization220# * Running tests on Big Sur (because Big Sur has additional security precautions)221- script: |222set -e223security create-keychain -p pwd $(agent.tempdirectory)/buildagent.keychain224security default-keychain -s $(agent.tempdirectory)/buildagent.keychain225security unlock-keychain -p pwd $(agent.tempdirectory)/buildagent.keychain226echo "$(macos-developer-certificate)" | base64 -D > $(agent.tempdirectory)/cert.p12227security import $(agent.tempdirectory)/cert.p12 -k $(agent.tempdirectory)/buildagent.keychain -P "$(macos-developer-certificate-key)" -T /usr/bin/codesign228export CODESIGN_IDENTITY=$(security find-identity -v -p codesigning $(agent.tempdirectory)/buildagent.keychain | grep -oEi "([0-9A-F]{40})" | head -n 1)229security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k pwd $(agent.tempdirectory)/buildagent.keychain230DEBUG=electron-osx-sign* node build/darwin/sign.ts $(agent.builddirectory)231displayName: Set Hardened Entitlements232233- script: |234set -e235export CODESIGN_IDENTITY=$(security find-identity -v -p codesigning $(agent.tempdirectory)/buildagent.keychain | grep -oEi "([0-9A-F]{40})" | head -n 1)236node build/darwin/sign-server.ts $(Agent.BuildDirectory)/vscode-server-darwin-$(VSCODE_ARCH)237node build/darwin/sign-server.ts $(Agent.BuildDirectory)/vscode-server-darwin-$(VSCODE_ARCH)-web238displayName: Sign server binaries239240- script: |241set -e242# Needed for https://github.com/dmgbuild/dmgbuild/blob/main/src/dmgbuild/badge.py243python3 -m pip install pyobjc-framework-Quartz244DMG_OUT="$(Pipeline.Workspace)/vscode_client_darwin_$(VSCODE_ARCH)_dmg"245mkdir -p $DMG_OUT246node build/darwin/create-dmg.ts $(agent.builddirectory) $DMG_OUT247python3 build/darwin/patch-dmg.py $DMG_OUT/VSCode-darwin-$(VSCODE_ARCH).dmg resources/darwin/disk.icns248echo "##vso[task.setvariable variable=DMG_PATH]$DMG_OUT/VSCode-darwin-$(VSCODE_ARCH).dmg"249condition: eq(variables['BUILT_CLIENT'], 'true')250displayName: Create DMG installer251252- script: |253set -e254ARCHIVE_PATH="$(Pipeline.Workspace)/vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip"255mkdir -p $(dirname $ARCHIVE_PATH)256(cd ../VSCode-darwin-$(VSCODE_ARCH) && zip -Xry $ARCHIVE_PATH *)257echo "##vso[task.setvariable variable=CLIENT_PATH]$ARCHIVE_PATH"258condition: eq(variables['BUILT_CLIENT'], 'true')259displayName: Re-package client after entitlement260261- script: |262set -e263ARCHIVE_PATH=".build/darwin/server/vscode-server-darwin-$(VSCODE_ARCH).zip"264mkdir -p $(dirname $ARCHIVE_PATH)265(cd .. && zip -Xry $(Build.SourcesDirectory)/$ARCHIVE_PATH vscode-server-darwin-$(VSCODE_ARCH))266echo "##vso[task.setvariable variable=SERVER_PATH]$ARCHIVE_PATH"267displayName: Package server268269- script: |270set -e271ARCHIVE_PATH=".build/darwin/server/vscode-server-darwin-$(VSCODE_ARCH)-web.zip"272mkdir -p $(dirname $ARCHIVE_PATH)273(cd .. && zip -Xry $(Build.SourcesDirectory)/$ARCHIVE_PATH vscode-server-darwin-$(VSCODE_ARCH)-web)274echo "##vso[task.setvariable variable=WEB_PATH]$ARCHIVE_PATH"275displayName: Package server (web)276277- task: UseDotNet@2278inputs:279version: 6.x280281- task: EsrpCodeSigning@5282inputs:283UseMSIAuthentication: true284ConnectedServiceName: vscode-esrp285AppRegistrationClientId: $(ESRP_CLIENT_ID)286AppRegistrationTenantId: $(ESRP_TENANT_ID)287AuthAKVName: vscode-esrp288AuthSignCertName: esrp-sign289FolderPath: .290Pattern: noop291displayName: 'Install ESRP Tooling'292293- pwsh: |294. build/azure-pipelines/win32/exec.ps1295$ErrorActionPreference = "Stop"296$EsrpCodeSigningTool = (gci -directory -filter EsrpCodeSigning_* $(Agent.RootDirectory)/_tasks | Select-Object -last 1).FullName297$Version = (gci -directory $EsrpCodeSigningTool | Select-Object -last 1).FullName298echo "##vso[task.setvariable variable=EsrpCliDllPath]$Version/net6.0/esrpcli.dll"299displayName: Find ESRP CLI300301- script: npx deemon --detach --wait node build/azure-pipelines/darwin/codesign.ts302env:303EsrpCliDllPath: $(EsrpCliDllPath)304SYSTEM_ACCESSTOKEN: $(System.AccessToken)305BUILD_SOURCESDIRECTORY: $(Build.SourcesDirectory)306displayName: ✍️ Codesign & Notarize307308- ${{ if or(eq(parameters.VSCODE_RUN_ELECTRON_TESTS, true), eq(parameters.VSCODE_RUN_BROWSER_TESTS, true), eq(parameters.VSCODE_RUN_REMOTE_TESTS, true)) }}:309- template: product-build-darwin-test.yml@self310parameters:311VSCODE_RUN_ELECTRON_TESTS: ${{ parameters.VSCODE_RUN_ELECTRON_TESTS }}312VSCODE_RUN_BROWSER_TESTS: ${{ parameters.VSCODE_RUN_BROWSER_TESTS }}313VSCODE_RUN_REMOTE_TESTS: ${{ parameters.VSCODE_RUN_REMOTE_TESTS }}314315- ${{ if ne(parameters.VSCODE_CIBUILD, true) }}:316- script: npx deemon --attach node build/azure-pipelines/darwin/codesign.ts317condition: succeededOrFailed()318displayName: "Post-job: ✍️ Codesign & Notarize"319320- script: unzip $(Pipeline.Workspace)/vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip -d $(Build.ArtifactStagingDirectory)/VSCode-darwin-$(VSCODE_ARCH)321displayName: Extract signed app322323- script: |324set -e325APP_ROOT="$(Build.ArtifactStagingDirectory)/VSCode-darwin-$(VSCODE_ARCH)"326APP_NAME="`ls $APP_ROOT | head -n 1`"327APP_PATH="$APP_ROOT/$APP_NAME"328codesign -dv --deep --verbose=4 "$APP_PATH"329"$APP_PATH/Contents/Resources/app/bin/code" --export-default-configuration=.build330displayName: Verify signature331332- script: |333set -e334335mkdir -p $(Build.ArtifactStagingDirectory)/out/vscode_client_darwin_$(VSCODE_ARCH)_archive336if [ "$VSCODE_ARCH" == "x64" ]; then337# Use legacy name for x64 builds338mv $(CLIENT_PATH) $(Build.ArtifactStagingDirectory)/out/vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin.zip339else340mv $(CLIENT_PATH) $(Build.ArtifactStagingDirectory)/out/vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip341fi342343mkdir -p $(Build.ArtifactStagingDirectory)/out/vscode_client_darwin_$(VSCODE_ARCH)_dmg344mv $(DMG_PATH) $(Build.ArtifactStagingDirectory)/out/vscode_client_darwin_$(VSCODE_ARCH)_dmg/VSCode-darwin-$(VSCODE_ARCH).dmg345346mkdir -p $(Build.ArtifactStagingDirectory)/out/vscode_server_darwin_$(VSCODE_ARCH)_archive347mv $(SERVER_PATH) $(Build.ArtifactStagingDirectory)/out/vscode_server_darwin_$(VSCODE_ARCH)_archive/vscode-server-darwin-$(VSCODE_ARCH).zip348349mkdir -p $(Build.ArtifactStagingDirectory)/out/vscode_web_darwin_$(VSCODE_ARCH)_archive350mv $(WEB_PATH) $(Build.ArtifactStagingDirectory)/out/vscode_web_darwin_$(VSCODE_ARCH)_archive/vscode-server-darwin-$(VSCODE_ARCH)-web.zip351displayName: Move artifacts to out directory352353354