Path: blob/main/build/azure-pipelines/darwin/steps/product-build-darwin-compile.yml
4774 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@joaomoreno136ARCHIVE_PATH=".build/darwin/server/vscode-server-darwin-$(VSCODE_ARCH).zip"137mkdir -p $(dirname $ARCHIVE_PATH)138(cd .. && zip -Xry $(Build.SourcesDirectory)/$ARCHIVE_PATH vscode-server-darwin-$(VSCODE_ARCH))139echo "##vso[task.setvariable variable=SERVER_PATH]$ARCHIVE_PATH"140env:141GITHUB_TOKEN: "$(github-distro-mixin-password)"142displayName: Build server143144- script: |145set -e146npm run gulp vscode-reh-web-darwin-$(VSCODE_ARCH)-min-ci147mv ../vscode-reh-web-darwin-$(VSCODE_ARCH) ../vscode-server-darwin-$(VSCODE_ARCH)-web # TODO@joaomoreno148ARCHIVE_PATH=".build/darwin/server/vscode-server-darwin-$(VSCODE_ARCH)-web.zip"149mkdir -p $(dirname $ARCHIVE_PATH)150(cd .. && zip -Xry $(Build.SourcesDirectory)/$ARCHIVE_PATH vscode-server-darwin-$(VSCODE_ARCH)-web)151echo "##vso[task.setvariable variable=WEB_PATH]$ARCHIVE_PATH"152env:153GITHUB_TOKEN: "$(github-distro-mixin-password)"154displayName: Build server (web)155156- ${{ if ne(parameters.VSCODE_CIBUILD, true) }}:157- task: DownloadPipelineArtifact@2158inputs:159artifact: unsigned_vscode_cli_darwin_$(VSCODE_ARCH)_cli160patterns: "**"161path: $(Build.ArtifactStagingDirectory)/cli162displayName: Download VS Code CLI163164- script: |165set -e166APP_ROOT="$(Agent.BuildDirectory)/VSCode-darwin-$(VSCODE_ARCH)"167APP_NAME="`ls $APP_ROOT | head -n 1`"168APP_PATH="$APP_ROOT/$APP_NAME"169unzip $(Build.ArtifactStagingDirectory)/cli/*.zip -d $(Build.ArtifactStagingDirectory)/cli170CLI_APP_NAME=$(node -p "require(\"$APP_PATH/Contents/Resources/app/product.json\").tunnelApplicationName")171APP_NAME=$(node -p "require(\"$APP_PATH/Contents/Resources/app/product.json\").applicationName")172mv "$(Build.ArtifactStagingDirectory)/cli/$APP_NAME" "$APP_PATH/Contents/Resources/app/bin/$CLI_APP_NAME"173chmod +x "$APP_PATH/Contents/Resources/app/bin/$CLI_APP_NAME"174displayName: Make CLI executable175176- script: |177set -e178APP_ROOT="$(Agent.BuildDirectory)/VSCode-darwin-$(VSCODE_ARCH)"179APP_NAME="`ls $APP_ROOT | head -n 1`"180APP_PATH="$APP_ROOT/$APP_NAME" node build/darwin/verify-macho.ts $(VSCODE_ARCH)181APP_PATH="$(Agent.BuildDirectory)/vscode-server-darwin-$(VSCODE_ARCH)" node build/darwin/verify-macho.ts $(VSCODE_ARCH)182displayName: Verify arch of Mach-O objects183184- script: |185set -e186ARCHIVE_PATH="$(Pipeline.Workspace)/unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip"187mkdir -p $(dirname $ARCHIVE_PATH)188(cd ../VSCode-darwin-$(VSCODE_ARCH) && zip -Xry $ARCHIVE_PATH *)189echo "##vso[task.setvariable variable=CLIENT_PATH]$ARCHIVE_PATH"190condition: eq(variables['BUILT_CLIENT'], 'true')191displayName: Package client192193- pwsh: node build/azure-pipelines/common/checkForArtifact.ts CLIENT_ARCHIVE_UPLOADED unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive194env:195SYSTEM_ACCESSTOKEN: $(System.AccessToken)196displayName: Check for client artifact197198# We are publishing the unsigned client artifact before running tests199# since the macOS (UNIVERSAL) job is blocked waiting for the artifact.200- template: ../../common/publish-artifact.yml@self201parameters:202targetPath: $(CLIENT_PATH)203artifactName: unsigned_vscode_client_darwin_$(VSCODE_ARCH)_archive204displayName: Publish client archive (unsigned)205sbomEnabled: false206condition: and(ne(variables['CLIENT_PATH'], ''), eq(variables['CLIENT_ARCHIVE_UPLOADED'], 'false'))207208# Hardened entitlements should be set after publishing unsigned client artifacts209# to ensure entitlement signing doesn't modify sha that would affect universal build.210#211# Setting hardened entitlements is a requirement for:212# * Apple notarization213# * Running tests on Big Sur (because Big Sur has additional security precautions)214- script: |215set -e216security create-keychain -p pwd $(agent.tempdirectory)/buildagent.keychain217security default-keychain -s $(agent.tempdirectory)/buildagent.keychain218security unlock-keychain -p pwd $(agent.tempdirectory)/buildagent.keychain219echo "$(macos-developer-certificate)" | base64 -D > $(agent.tempdirectory)/cert.p12220security import $(agent.tempdirectory)/cert.p12 -k $(agent.tempdirectory)/buildagent.keychain -P "$(macos-developer-certificate-key)" -T /usr/bin/codesign221export CODESIGN_IDENTITY=$(security find-identity -v -p codesigning $(agent.tempdirectory)/buildagent.keychain | grep -oEi "([0-9A-F]{40})" | head -n 1)222security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k pwd $(agent.tempdirectory)/buildagent.keychain223DEBUG=electron-osx-sign* node build/darwin/sign.ts $(agent.builddirectory)224displayName: Set Hardened Entitlements225226- script: |227set -e228ARCHIVE_PATH="$(Pipeline.Workspace)/vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip"229mkdir -p $(dirname $ARCHIVE_PATH)230(cd ../VSCode-darwin-$(VSCODE_ARCH) && zip -Xry $ARCHIVE_PATH *)231echo "##vso[task.setvariable variable=CLIENT_PATH]$ARCHIVE_PATH"232condition: eq(variables['BUILT_CLIENT'], 'true')233displayName: Re-package client after entitlement234235- task: UseDotNet@2236inputs:237version: 6.x238239- task: EsrpCodeSigning@5240inputs:241UseMSIAuthentication: true242ConnectedServiceName: vscode-esrp243AppRegistrationClientId: $(ESRP_CLIENT_ID)244AppRegistrationTenantId: $(ESRP_TENANT_ID)245AuthAKVName: vscode-esrp246AuthSignCertName: esrp-sign247FolderPath: .248Pattern: noop249displayName: 'Install ESRP Tooling'250251- pwsh: |252. build/azure-pipelines/win32/exec.ps1253$ErrorActionPreference = "Stop"254$EsrpCodeSigningTool = (gci -directory -filter EsrpCodeSigning_* $(Agent.RootDirectory)/_tasks | Select-Object -last 1).FullName255$Version = (gci -directory $EsrpCodeSigningTool | Select-Object -last 1).FullName256echo "##vso[task.setvariable variable=EsrpCliDllPath]$Version/net6.0/esrpcli.dll"257displayName: Find ESRP CLI258259- script: npx deemon --detach --wait node build/azure-pipelines/darwin/codesign.ts260env:261EsrpCliDllPath: $(EsrpCliDllPath)262SYSTEM_ACCESSTOKEN: $(System.AccessToken)263displayName: ✍️ Codesign & Notarize264265- ${{ if or(eq(parameters.VSCODE_RUN_ELECTRON_TESTS, true), eq(parameters.VSCODE_RUN_BROWSER_TESTS, true), eq(parameters.VSCODE_RUN_REMOTE_TESTS, true)) }}:266- template: product-build-darwin-test.yml@self267parameters:268VSCODE_RUN_ELECTRON_TESTS: ${{ parameters.VSCODE_RUN_ELECTRON_TESTS }}269VSCODE_RUN_BROWSER_TESTS: ${{ parameters.VSCODE_RUN_BROWSER_TESTS }}270VSCODE_RUN_REMOTE_TESTS: ${{ parameters.VSCODE_RUN_REMOTE_TESTS }}271272- ${{ if ne(parameters.VSCODE_CIBUILD, true) }}:273- script: npx deemon --attach node build/azure-pipelines/darwin/codesign.ts274condition: succeededOrFailed()275displayName: "Post-job: ✍️ Codesign & Notarize"276277- script: unzip $(Pipeline.Workspace)/vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip -d $(Build.ArtifactStagingDirectory)/VSCode-darwin-$(VSCODE_ARCH)278displayName: Extract signed app279280- script: |281set -e282APP_ROOT="$(Build.ArtifactStagingDirectory)/VSCode-darwin-$(VSCODE_ARCH)"283APP_NAME="`ls $APP_ROOT | head -n 1`"284APP_PATH="$APP_ROOT/$APP_NAME"285codesign -dv --deep --verbose=4 "$APP_PATH"286"$APP_PATH/Contents/Resources/app/bin/code" --export-default-configuration=.build287displayName: Verify signature288289- script: |290set -e291292mkdir -p $(Build.ArtifactStagingDirectory)/out/vscode_client_darwin_$(VSCODE_ARCH)_archive293if [ "$VSCODE_ARCH" == "x64" ]; then294# Use legacy name for x64 builds295mv $(CLIENT_PATH) $(Build.ArtifactStagingDirectory)/out/vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin.zip296else297mv $(CLIENT_PATH) $(Build.ArtifactStagingDirectory)/out/vscode_client_darwin_$(VSCODE_ARCH)_archive/VSCode-darwin-$(VSCODE_ARCH).zip298fi299300mkdir -p $(Build.ArtifactStagingDirectory)/out/vscode_server_darwin_$(VSCODE_ARCH)_archive301mv $(SERVER_PATH) $(Build.ArtifactStagingDirectory)/out/vscode_server_darwin_$(VSCODE_ARCH)_archive/vscode-server-darwin-$(VSCODE_ARCH).zip302303mkdir -p $(Build.ArtifactStagingDirectory)/out/vscode_web_darwin_$(VSCODE_ARCH)_archive304mv $(WEB_PATH) $(Build.ArtifactStagingDirectory)/out/vscode_web_darwin_$(VSCODE_ARCH)_archive/vscode-server-darwin-$(VSCODE_ARCH)-web.zip305displayName: Move artifacts to out directory306307308