diff --git a/script/vsts/nightly-release.yml b/script/vsts/nightly-release.yml index 78876bab7ea..faff9bfec63 100644 --- a/script/vsts/nightly-release.yml +++ b/script/vsts/nightly-release.yml @@ -35,10 +35,7 @@ jobs: ReleaseVersion: $[ dependencies.GetReleaseVersion.outputs['Version.ReleaseVersion'] ] steps: - - task: NodeTool@0 - inputs: - versionSpec: 12.13.1 - displayName: Install Node.js 12.13.1 + - template: platforms/templates/preparation.yml #This has to be done separately because VSTS inexplicably #exits the script block after `npm install` completes. @@ -74,23 +71,15 @@ jobs: vmImage: macos-10.14 steps: - - task: NodeTool@0 - inputs: - versionSpec: 12.13.1 - displayName: Install Node.js 12.13.1 + - template: platforms/templates/preparation.yml - - script: npm install --global npm@6.12.1 - displayName: Update npm + - template: platforms/templates/bootstrap.yml - - script: | - script/bootstrap - displayName: Bootstrap - - - script: | + - script: | cd script/lib npm install displayName: npm install - - script: | + - script: | cd script/lib/update-dependency node index.js displayName: Bump depedencies diff --git a/script/vsts/platforms/linux.yml b/script/vsts/platforms/linux.yml index 56ea7468e3e..975af51a757 100644 --- a/script/vsts/platforms/linux.yml +++ b/script/vsts/platforms/linux.yml @@ -7,105 +7,32 @@ jobs: pool: # This image is used to host the Docker container that runs the build vmImage: ubuntu-16.04 - container: ubuntu:trusty steps: - - script: | - sudo apt-get update - sudo apt-get install -y wget software-properties-common - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - - sudo apt-add-repository "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-5.0 main" - sudo apt-get update - sudo apt-get install -y build-essential ca-certificates clang-5.0 xvfb fakeroot git libsecret-1-dev rpm libx11-dev libxkbfile-dev xz-utils xorriso zsync libxss1 libgconf2-4 libgtk-3-0 libasound2 libicu-dev - displayName: Install apt dependencies + - template: templates/preparation.yml - - script: sudo /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16 - displayName: Start Xvfb - - - task: NodeTool@0 - inputs: - versionSpec: 12.13.1 - displayName: Install Node.js 12.13.1 - - - script: npm install --global npm@6.12.1 - displayName: Update npm - - - template: cache.yml + - template: templates/cache.yml parameters: OS: linux - - script: script/bootstrap - displayName: Bootstrap build environment - env: - CI: true - CI_PROVIDER: VSTS - CC: clang-5.0 - CXX: clang++-5.0 - npm_config_clang: 1 - condition: or(ne(variables['MainNodeModulesRestored'], 'true'), ne(variables['ScriptNodeModulesRestored'], 'true'), ne(variables['ApmNodeModulesRestored'], 'true')) + - template: templates/bootstrap.yml - script: script/lint displayName: Run linter - - - script: script/build --no-bootstrap --create-debian-package --create-rpm-package --compress-artifacts - env: - GITHUB_TOKEN: $(GITHUB_TOKEN) - ATOM_RELEASE_VERSION: $(ReleaseVersion) - CC: clang-5.0 - CXX: clang++-5.0 - npm_config_clang: 1 - displayName: Build Atom - - - script: | - sudo chown root ./out/atom*-amd64/chrome-sandbox - sudo chmod 4755 ./out/atom*-amd64/chrome-sandbox - displayName: Tweaking chrome-sandbox binary - - script: script/test - env: - CI: true - CI_PROVIDER: VSTS - ATOM_JASMINE_REPORTER: list - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit - DISPLAY: :99.0 - displayName: Run tests - condition: and(succeeded(), ne(variables['Atom.SkipTests'], 'true')) + - template: templates/build.yml - - script: script/postprocess-junit-results --search-folder "${TEST_JUNIT_XML_ROOT}" --test-results-files "**/*.xml" - env: - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit - displayName: Post-process test results - condition: ne(variables['Atom.SkipTests'], 'true') + - template: templates/test.yml - - task: PublishTestResults@2 - inputs: - testResultsFormat: JUnit - searchFolder: $(Common.TestResultsDirectory)/junit - testResultsFiles: '**/*.xml' - mergeTestResults: true - testRunTitle: Linux - condition: ne(variables['Atom.SkipTests'], 'true') - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom.x86_64.rpm - ArtifactName: atom.x86_64.rpm - ArtifactType: Container - displayName: Upload atom.x84_64.rpm - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-amd64.deb - ArtifactName: atom-amd64.deb - ArtifactType: Container - displayName: Upload atom-amd64.deb - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-amd64.tar.gz - ArtifactName: atom-amd64.tar.gz - ArtifactType: Container - displayName: Upload atom-amd64.tar.gz - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + - template: templates/publish.yml + parameters: + artifacts: + - filename: atom.x86_64.rpm + dir: $(Build.SourcesDirectory)/out + condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + - filename: atom-amd64.deb + dir: $(Build.SourcesDirectory)/out + condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + - filename: atom-amd64.tar.gz + dir: $(Build.SourcesDirectory)/out + condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) diff --git a/script/vsts/platforms/macos.yml b/script/vsts/platforms/macos.yml index a4fe1619d6e..cc13d2c77d6 100644 --- a/script/vsts/platforms/macos.yml +++ b/script/vsts/platforms/macos.yml @@ -12,76 +12,35 @@ jobs: vmImage: macos-10.14 steps: - - task: NodeTool@0 - inputs: - versionSpec: 12.13.1 - displayName: Install Node.js 12.13.1 + - template: templates/preparation.yml - - script: npm install --global npm@6.12.1 - displayName: Update npm - - - template: cache.yml + - template: templates/cache.yml parameters: OS: macos - - script: script/bootstrap - displayName: Bootstrap build environment - env: - CI: true - CI_PROVIDER: VSTS - NPM_BIN_PATH: /usr/local/bin/npm - npm_config_build_from_source: true - condition: or(ne(variables['MainNodeModulesRestored'], 'true'), ne(variables['ScriptNodeModulesRestored'], 'true'), ne(variables['ApmNodeModulesRestored'], 'true')) + - template: templates/bootstrap.yml - script: script/lint displayName: Run linter - - script: | - if [ $SHOULD_SIGN == "true" ] && ([ $IS_RELEASE_BRANCH == "true" ] || [ $IS_SIGNED_ZIP_BRANCH == "true" ]); then - script/build --no-bootstrap --code-sign --compress-artifacts - else - script/build --no-bootstrap --compress-artifacts - fi - displayName: Build Atom - env: - GITHUB_TOKEN: $(GITHUB_TOKEN) - IS_RELEASE_BRANCH: $(IsReleaseBranch) - IS_SIGNED_ZIP_BRANCH: $(IsSignedZipBranch) - ATOM_RELEASE_VERSION: $(ReleaseVersion) - ATOM_MAC_CODE_SIGNING_CERT_DOWNLOAD_URL: $(ATOM_MAC_CODE_SIGNING_CERT_DOWNLOAD_URL) - ATOM_MAC_CODE_SIGNING_CERT_PASSWORD: $(ATOM_MAC_CODE_SIGNING_CERT_PASSWORD) - ATOM_MAC_CODE_SIGNING_KEYCHAIN: $(ATOM_MAC_CODE_SIGNING_KEYCHAIN) - ATOM_MAC_CODE_SIGNING_KEYCHAIN_PASSWORD: $(ATOM_MAC_CODE_SIGNING_KEYCHAIN_PASSWORD) - AC_USER: $(AC_USER) - AC_PASSWORD: $(AC_PASSWORD) + - template: templates/build.yml - script: | cp $(Build.SourcesDirectory)/out/*.zip $(Build.ArtifactStagingDirectory) displayName: Stage Artifacts - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.ArtifactStagingDirectory)/atom-mac.zip - ArtifactName: atom-mac.zip - ArtifactType: Container - displayName: Upload atom-mac.zip - condition: succeeded() - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.ArtifactStagingDirectory)/atom-mac-symbols.zip - ArtifactName: atom-mac-symbols.zip - ArtifactType: Container - displayName: Upload atom-mac-symbols.zip - condition: succeeded() - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/docs/output/atom-api.json - ArtifactName: atom-api.json - ArtifactType: Container - displayName: Upload atom-api.json - condition: succeeded() + - template: templates/publish.yml + parameters: + artifacts: + - filename: atom-mac.zip + dir: $(Build.ArtifactStagingDirectory) + condition: succeeded() + - filename: atom-mac-symbols.zip + dir: $(Build.ArtifactStagingDirectory) + condition: succeeded() + - filename: atom-api.json + dir: $(Build.SourcesDirectory)/docs/output + condition: succeeded() - job: macOS_tests displayName: macOS test @@ -103,84 +62,20 @@ jobs: RunPackageTests: 2 steps: - - task: NodeTool@0 - inputs: - versionSpec: 12.13.1 - displayName: Install Node.js 12.13.1 - - - script: npm install --global npm@6.12.1 - displayName: Update npm + - template: templates/preparation.yml - - template: cache.yml + - template: templates/cache.yml parameters: OS: macos # The artifact caching task does not work on forks, so we need to # bootstrap again for pull requests coming from forked repositories. - - script: script/bootstrap - displayName: Bootstrap build environment - env: - CI: true - CI_PROVIDER: VSTS - NPM_BIN_PATH: /usr/local/bin/npm - npm_config_build_from_source: true - condition: or(ne(variables['MainNodeModulesRestored'], 'true'), ne(variables['ScriptNodeModulesRestored'], 'true'), ne(variables['ApmNodeModulesRestored'], 'true')) - - - task: DownloadBuildArtifacts@0 - displayName: Download atom-mac.zip - inputs: - artifactName: 'atom-mac.zip' - downloadPath: $(Build.SourcesDirectory) - - - script: unzip atom-mac.zip/atom-mac.zip -d out - displayName: Unzip atom-mac.zip + - template: templates/bootstrap.yml - - task: DownloadBuildArtifacts@0 - displayName: Download atom-mac-symbols.zip - inputs: - artifactName: 'atom-mac-symbols.zip' - downloadPath: $(Build.SourcesDirectory) - - - script: unzip atom-mac-symbols.zip/atom-mac-symbols.zip -d out - displayName: Unzip atom-mac-symbols.zip - - - script: | - osascript -e 'tell application "System Events" to keystroke "x"' # clear screen saver - caffeinate -s script/test # Run with caffeinate to prevent screen saver - env: - CI: true - CI_PROVIDER: VSTS - ATOM_JASMINE_REPORTER: list - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit - ATOM_RUN_CORE_TESTS: $(RunCoreTests) - ATOM_RUN_PACKAGE_TESTS: $(RunPackageTests) - displayName: Run tests - condition: and(succeeded(), ne(variables['Atom.SkipTests'], 'true')) - - - script: script/postprocess-junit-results --search-folder "${TEST_JUNIT_XML_ROOT}" --test-results-files "**/*.xml" - env: - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit - displayName: Post-process test results - condition: ne(variables['Atom.SkipTests'], 'true') - - - task: PublishTestResults@2 - inputs: - testResultsFormat: JUnit - searchFolder: $(Common.TestResultsDirectory)/junit - testResultsFiles: '**/*.xml' - mergeTestResults: true - testRunTitle: MacOS - condition: ne(variables['Atom.SkipTests'], 'true') - - - script: | - mkdir -p $(Build.ArtifactStagingDirectory)/crash-reports - cp ${HOME}/Library/Logs/DiagnosticReports/*.crash $(Build.ArtifactStagingDirectory)/crash-reports - displayName: Stage Crash Reports - condition: failed() + - template: templates/download-unzip.yml + parameters: + artifacts: + - atom-mac.zip + - atom-mac-symbols.zip - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.ArtifactStagingDirectory)/crash-reports - ArtifactName: crash-reports.zip - displayName: Upload Crash Reports - condition: failed() + - template: templates/test.yml diff --git a/script/vsts/platforms/templates/bootstrap.yml b/script/vsts/platforms/templates/bootstrap.yml new file mode 100644 index 00000000000..1d57b688d53 --- /dev/null +++ b/script/vsts/platforms/templates/bootstrap.yml @@ -0,0 +1,31 @@ +steps: + - pwsh: | + # OS specific env variables + if ($env:AGENT_OS -eq "Windows_NT") { + $env:NPM_BIN_PATH="C:/hostedtoolcache/windows/node/12.13.1/x64/npm.cmd" + $env:npm_config_build_from_source=true + } + if ($env:AGENT_OS -eq "Darwin") { + $env:NPM_BIN_PATH="/usr/local/bin/npm" + $env:npm_config_build_from_source=true + } + if ($env:AGENT_OS -eq "Linux") { + $env:NPM_BIN_PATH="/usr/local/bin/npm" + $env:CC=clang + $env:CXX=clang++ + $env:npm_config_clang=1 + } + + # Bootstrap + if (($env:AGENT_OS -eq "Windows_NT") -and ($env:BUILD_ARCH -eq "x86")) { + node 'script\vsts\windows-run.js' 'script\bootstrap.cmd' + } + else { + script/bootstrap + } + displayName: Bootstrap build environment + env: + GITHUB_TOKEN: $(GITHUB_TOKEN) + CI: true + CI_PROVIDER: VSTS + condition: or(ne(variables['MainNodeModulesRestored'], 'true'), ne(variables['ScriptNodeModulesRestored'], 'true'), ne(variables['ApmNodeModulesRestored'], 'true')) diff --git a/script/vsts/platforms/templates/build.yml b/script/vsts/platforms/templates/build.yml new file mode 100644 index 00000000000..9d02ffced8f --- /dev/null +++ b/script/vsts/platforms/templates/build.yml @@ -0,0 +1,57 @@ +steps: + - pwsh: | + # OS specific env variables + if ($env:AGENT_OS -eq "Windows_NT") { + $env:SQUIRREL_TEMP="C:/tmp" + $env:npm_config_build_from_source=true + $ATOM_WIN_CODE_SIGNING_CERT_DOWNLOAD_URL=$env:ATOM_WIN_CODE_SIGNING_CERT_DOWNLOAD_URL + $ATOM_WIN_CODE_SIGNING_CERT_PASSWORD=$env:ATOM_WIN_CODE_SIGNING_CERT_PASSWORD + } + if ($env:AGENT_OS -eq "Darwin") { + $ATOM_MAC_CODE_SIGNING_CERT_DOWNLOAD_URL=$env:ATOM_MAC_CODE_SIGNING_CERT_DOWNLOAD_URL + $ATOM_MAC_CODE_SIGNING_CERT_PASSWORD=$env:ATOM_MAC_CODE_SIGNING_CERT_PASSWORD + $ATOM_MAC_CODE_SIGNING_KEYCHAIN=$env:ATOM_MAC_CODE_SIGNING_KEYCHAIN + $ATOM_MAC_CODE_SIGNING_KEYCHAIN_PASSWORD=$env:ATOM_MAC_CODE_SIGNING_KEYCHAIN_PASSWORD + $AC_USER=$env:AC_USER + $AC_PASSWORD=$env:AC_PASSWORD + } + if ($env:AGENT_OS -eq "Linux") { + $env:CC=clang + $env:CXX=clang++ + $env:npm_config_clang=1 + $env:LinuxArgs="--create-debian-package --create-rpm-package" + $env:SHOULD_SIGN="false" + } + + # Build Arguments + ## Creation of Windows Installaer + if ($env:AGENT_OS -eq "Windows_NT") { + mkdir -f -p $env:SQUIRREL_TEMP + if ($env:IS_RELEASE_BRANCH -eq "true") { + $CreateWindowsInstallaer="--create-windows-installer" + } + } + + ## Code Sign + if ( ($env:SHOULD_SIGN -eq "true") -and (($env:IS_RELEASE_BRANCH -eq "true") -or ($env:IS_SIGNED_ZIP_BRANCH -eq "true")) ) { + $CodeSign="--code-sign" + } + + # Build + if (($env:AGENT_OS -eq "Windows_NT") -and ($env:BUILD_ARCH -eq "x86")) { + node 'script\vsts\windows-run.js' 'script\build.cmd' --no-bootstrap --compress-artifacts $CodeSign $CreateWindowsInstallaer + } else { + script/build --no-bootstrap --compress-artifacts $env:LinuxArgs $CodeSign $CreateWindowsInstallaer + } + displayName: Build Atom + env: + GITHUB_TOKEN: $(GITHUB_TOKEN) + IS_RELEASE_BRANCH: $(IsReleaseBranch) + IS_SIGNED_ZIP_BRANCH: $(IsSignedZipBranch) + ATOM_RELEASE_VERSION: $(ReleaseVersion) + + - script: | + sudo chown root ./out/atom*-amd64/chrome-sandbox + sudo chmod 4755 ./out/atom*-amd64/chrome-sandbox + displayName: Tweaking chrome-sandbox binary + condition: eq(variables['Agent.OS'], 'Linux') diff --git a/script/vsts/platforms/cache.yml b/script/vsts/platforms/templates/cache.yml similarity index 57% rename from script/vsts/platforms/cache.yml rename to script/vsts/platforms/templates/cache.yml index 992e35bdca0..37683f403a4 100644 --- a/script/vsts/platforms/cache.yml +++ b/script/vsts/platforms/templates/cache.yml @@ -11,20 +11,20 @@ steps: - task: Cache@2 displayName: Cache node_modules inputs: - key: 'npm | "$(Agent.OS)" | "$(buildArch)" | package.json, package-lock.json, script/vsts/platforms/${{ parameters.OS }}.yml' + key: 'npm | "$(Agent.OS)" | "$(BUILD_ARCH)" | package.json, package-lock.json, script/vsts/platforms/${{ parameters.OS }}.yml' path: 'node_modules' cacheHitVar: MainNodeModulesRestored - task: Cache@2 displayName: Cache script/node_modules inputs: - key: 'npm | "$(Agent.OS)" | "$(buildArch)" | script/package.json, script/package-lock.json, script/vsts/platforms/${{ parameters.OS }}.yml' + key: 'npm | "$(Agent.OS)" | "$(BUILD_ARCH)" | script/package.json, script/package-lock.json, script/vsts/platforms/${{ parameters.OS }}.yml' path: 'script/node_modules' cacheHitVar: ScriptNodeModulesRestored - task: Cache@2 displayName: Cache apm/node_modules inputs: - key: 'npm | "$(Agent.OS)" | "$(buildArch)" | apm/package.json, apm/package-lock.json, script/vsts/platforms/${{ parameters.OS }}.yml' + key: 'npm | "$(Agent.OS)" | "$(BUILD_ARCH)" | apm/package.json, apm/package-lock.json, script/vsts/platforms/${{ parameters.OS }}.yml' path: 'apm/node_modules' cacheHitVar: ApmNodeModulesRestored diff --git a/script/vsts/platforms/templates/download-unzip.yml b/script/vsts/platforms/templates/download-unzip.yml new file mode 100644 index 00000000000..3076374b94d --- /dev/null +++ b/script/vsts/platforms/templates/download-unzip.yml @@ -0,0 +1,18 @@ +parameters: + - name: artifacts + type: object + default: {} + - name: downloadPath + type: string + default: $(Build.SourcesDirectory) + +steps: + - ${{ each artifact in parameters.artifacts }}: + - task: DownloadBuildArtifacts@0 + displayName: Download ${{artifact}} + inputs: + artifactName: ${{artifact}} + downloadPath: ${{parameters.downloadPath}} + + - script: unzip ${{artifact}}/${{artifact}} -d out + displayName: Unzip ${{artifact}} diff --git a/script/vsts/platforms/templates/preparation.yml b/script/vsts/platforms/templates/preparation.yml new file mode 100644 index 00000000000..5fab01263b2 --- /dev/null +++ b/script/vsts/platforms/templates/preparation.yml @@ -0,0 +1,66 @@ +steps: + + # Linux Specific + - script: | + sudo apt-get update + sudo apt-get install -y wget software-properties-common + sudo apt-get install -y build-essential ca-certificates xvfb fakeroot git libsecret-1-dev rpm libx11-dev libxkbfile-dev xz-utils xorriso zsync libxss1 libgconf2-4 libgtk-3-0 libasound2 libicu-dev + # clang 9 is included in the image + sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-9 10 + sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-9 10 + sudo update-alternatives --config clang + sudo update-alternatives --config clang++ + clang -v + displayName: Install apt dependencies + condition: eq(variables['Agent.OS'], 'Linux') + + + - script: sudo /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16 + displayName: Start Xvfb + condition: eq(variables['Agent.OS'], 'Linux') + + # Common + - task: NodeTool@0 + inputs: + versionSpec: 12.13.1 + displayName: Install Node.js 12.13.1 + + - script: npm install --global npm@6.12.1 + displayName: Update npm + + - pwsh: | + if ($env:AGENT_OS -eq "Windows_NT") { + $env:BUILD_ARCH=$env:buildArch + echo "##vso[task.setvariable variable=BUILD_ARCH]$env:BUILD_ARCH" # Azure syntax + } + echo BUILD_ARCH: $env:BUILD_ARCH + displayName: Setting globally used env variables + + # Windows Specific + - task: UsePythonVersion@0 + inputs: + versionSpec: '3.8' + condition: eq(variables['Agent.OS'], 'Windows_NT') + + - script: | + ECHO Installing npm-windows-upgrade + npm install --global --production npm-windows-upgrade + displayName: Install npm-windows-upgrade + condition: eq(variables['Agent.OS'], 'Windows_NT') + + - script: | + ECHO Upgrading npm + npm-windows-upgrade --no-spinner --no-prompt --npm-version 6.12.1 + displayName: Install npm 6.12.1 + condition: eq(variables['Agent.OS'], 'Windows_NT') + + - script: | + npm install --global --production windows-build-tools@4.0 + displayName: Install windows build tools + condition: eq(variables['Agent.OS'], 'Windows_NT') + + - script: | + cd script\vsts + npm install + displayName: Install Windows build dependencies + condition: eq(variables['Agent.OS'], 'Windows_NT') diff --git a/script/vsts/platforms/templates/publish.yml b/script/vsts/platforms/templates/publish.yml new file mode 100644 index 00000000000..b7c294a3433 --- /dev/null +++ b/script/vsts/platforms/templates/publish.yml @@ -0,0 +1,16 @@ +parameters: + - name: artifacts + type: object + +steps: + - ${{ each artifact in parameters.artifacts }}: + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: ${{artifact.dir}}/${{artifact.filename}} + ArtifactName: ${{artifact.filename}} + ArtifactType: Container + displayName: Upload ${{artifact.filename}} + ${{ if artifact.condition }}: + condition: ${{artifact.condition}} + ${{ if artifact.continueOnError }}: + continueOnError: ${{artifact.continueOnError}} diff --git a/script/vsts/platforms/templates/test.yml b/script/vsts/platforms/templates/test.yml new file mode 100644 index 00000000000..72389353e26 --- /dev/null +++ b/script/vsts/platforms/templates/test.yml @@ -0,0 +1,83 @@ +steps: + - pwsh: | + # OS specific env variables + if ($env:AGENT_OS -eq "Linux") { + $env:DISPLAY=":99.0" + $env:npm_config_build_from_source=true + } + + # Test + if ($env:AGENT_OS -eq "Darwin") { + osascript -e 'tell application "System Events" to keystroke "x"' # clear screen saver + caffeinate -s script/test # Run with caffeinate to prevent screen saver + } elseif (($env:AGENT_OS -eq "Windows_NT") -and ($env:BUILD_ARCH -eq "x86")) { + node 'script\vsts\windows-run.js' 'script\test.cmd' + } else { + script/test + } + env: + CI: true + CI_PROVIDER: VSTS + ATOM_JASMINE_REPORTER: list + TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit + ATOM_RUN_CORE_TESTS: $(RunCoreTests) + ATOM_RUN_PACKAGE_TESTS: $(RunPackageTests) + displayName: Run tests + condition: and(succeeded(), ne(variables['Atom.SkipTests'], 'true')) + + # Test results + - pwsh: | + if (($env:AGENT_OS -eq "Windows_NT") -and ($env:BUILD_ARCH -eq "x86")) { + node 'script\vsts\windows-run.js' 'script\postprocess-junit-results.cmd' --search-folder "$env:TEST_JUNIT_XML_ROOT" --test-results-files "**/*.xml" + } else { + script/postprocess-junit-results --search-folder "$env:TEST_JUNIT_XML_ROOT" --test-results-files "**/*.xml" + } + env: + TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)/junit + displayName: Post-process test results + condition: ne(variables['Atom.SkipTests'], 'true') + + + - task: PublishTestResults@2 + inputs: + testResultsFormat: JUnit + searchFolder: $(Common.TestResultsDirectory)/junit + testResultsFiles: '**/*.xml' + mergeTestResults: true + testRunTitle: $(Agent.OS) $(BUILD_ARCH) + condition: ne(variables['Atom.SkipTests'], 'true') + + # Crash Reports + - pwsh: | + mkdir -f -p $env:ARTIFACT_STAGING_DIR/crash-reports + if (($env:AGENT_OS -eq "Windows_NT") -and (Test-Path "$env:TEMP/Atom Crashes")) { + cp "$env:TEMP/Atom Crashes/*.dmp" $env:ARTIFACT_STAGING_DIR/crash-reports + } else { + cp $env:HOME/Library/Logs/DiagnosticReports/*.crash $env:ARTIFACT_STAGING_DIR/crash-reports + } + env: + ARTIFACT_STAGING_DIR: $(Build.ArtifactStagingDirectory) + displayName: Stage Crash Reports + condition: failed() + + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: $(Build.ArtifactStagingDirectory)/crash-reports + ArtifactName: crash-reports.zip + ${{ if eq(variables['Agent.OS'], 'Windows_NT') }}: + condition: and(failed(), eq(variables['ATOM_RELEASES_S3_KEY'], '')) + displayName: Publish crash reports on non-release branch + ${{ if ne(variables['Agent.OS'], 'Windows_NT') }}: + condition: failed() + displayName: Upload Crash Reports + + - script: > + node $(Build.SourcesDirectory)\script\vsts\upload-crash-reports.js --crash-report-path "%ARTIFACT_STAGING_DIR%\crash-reports" --s3-path "vsts-artifacts/%BUILD_ID%/" + env: + ATOM_RELEASES_S3_KEY: $(ATOM_RELEASES_S3_KEY) + ATOM_RELEASES_S3_SECRET: $(ATOM_RELEASES_S3_SECRET) + ATOM_RELEASES_S3_BUCKET: $(ATOM_RELEASES_S3_BUCKET) + ARTIFACT_STAGING_DIR: $(Build.ArtifactStagingDirectory) + BUILD_ID: $(Build.BuildId) + displayName: Upload crash reports to S3 on release branch + condition: and(failed(), ne(variables['ATOM_RELEASES_S3_KEY'], ''), eq(variables['Agent.OS'], 'Windows_NT')) diff --git a/script/vsts/platforms/windows.yml b/script/vsts/platforms/windows.yml index f24e7c9c1ec..fc5416f6e70 100644 --- a/script/vsts/platforms/windows.yml +++ b/script/vsts/platforms/windows.yml @@ -20,221 +20,48 @@ jobs: IsSignedZipBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsSignedZipBranch'] ] steps: - - task: UsePythonVersion@0 - inputs: - versionSpec: '3.8' + - template: templates/preparation.yml - - task: NodeTool@0 - inputs: - versionSpec: 12.13.1 - displayName: Install Node.js 12.13.1 - - - script: | - ECHO Installing npm-windows-upgrade - npm install --global --production npm-windows-upgrade - displayName: Install npm-windows-upgrade - - - script: | - ECHO Upgrading npm - npm-windows-upgrade --no-spinner --no-prompt --npm-version 6.12.1 - displayName: Install npm 6.12.1 - - - script: | - npm install --global --production windows-build-tools@4.0 - displayName: Install windows build tools - - - script: | - cd script\vsts - npm install - displayName: Install Windows build dependencies - - - template: cache.yml + - template: templates/cache.yml parameters: OS: windows - - script: | - node script\vsts\windows-run.js script\bootstrap.cmd - env: - BUILD_ARCH: $(buildArch) - CI: true - CI_PROVIDER: VSTS - NPM_BIN_PATH: "C:\\hostedtoolcache\\windows\\node\\12.13.1\\x64\\npm.cmd" - npm_config_build_from_source: true - displayName: Bootstrap build environment - condition: or(ne(variables['MainNodeModulesRestored'], 'true'), ne(variables['ScriptNodeModulesRestored'], 'true'), ne(variables['ApmNodeModulesRestored'], 'true')) + - template: templates/bootstrap.yml - script: node script\vsts\windows-run.js script\lint.cmd env: BUILD_ARCH: $(buildArch) displayName: Run linter - - script: | - IF NOT EXIST C:\tmp MKDIR C:\tmp - SET SQUIRREL_TEMP=C:\tmp - IF [%IS_RELEASE_BRANCH%]==[true] ( - ECHO Creating production artifacts for release branch %BUILD_SOURCEBRANCHNAME% - IF [%SHOULD_SIGN%]==[true] ( - node script\vsts\windows-run.js script\build.cmd --no-bootstrap --code-sign --compress-artifacts --create-windows-installer - ) ELSE ( - node script\vsts\windows-run.js script\build.cmd --no-bootstrap --compress-artifacts --create-windows-installer - ) - ) ELSE ( - IF [%IS_SIGNED_ZIP_BRANCH%]==[true] ( - ECHO Creating signed CI artifacts for branch %BUILD_SOURCEBRANCHNAME% - IF [%SHOULD_SIGN%]==[true] ( - node script\vsts\windows-run.js script\build.cmd --no-bootstrap --code-sign --compress-artifacts - ) ELSE ( - node script\vsts\windows-run.js script\build.cmd --no-bootstrap --compress-artifacts - ) - ) ELSE ( - ECHO Pull request build, no code signing will be performed - node script\vsts\windows-run.js script\build.cmd --no-bootstrap --compress-artifacts - ) - ) - env: - GITHUB_TOKEN: $(GITHUB_TOKEN) - BUILD_ARCH: $(buildArch) - ATOM_RELEASE_VERSION: $(ReleaseVersion) - ATOM_WIN_CODE_SIGNING_CERT_DOWNLOAD_URL: $(ATOM_WIN_CODE_SIGNING_CERT_DOWNLOAD_URL) - ATOM_WIN_CODE_SIGNING_CERT_PASSWORD: $(ATOM_WIN_CODE_SIGNING_CERT_PASSWORD) - IS_RELEASE_BRANCH: $(IsReleaseBranch) - IS_SIGNED_ZIP_BRANCH: $(IsSignedZipBranch) - npm_config_build_from_source: true - displayName: Build Atom - - - script: node script\vsts\windows-run.js script\test.cmd - env: - CI: true - CI_PROVIDER: VSTS - ATOM_JASMINE_REPORTER: list - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)\junit - BUILD_ARCH: $(buildArch) - displayName: Run tests - condition: and(succeeded(), ne(variables['Atom.SkipTests'], 'true')) - - - script: > - node script\vsts\windows-run.js script\postprocess-junit-results.cmd - --search-folder %TEST_JUNIT_XML_ROOT% --test-results-files "**/*.xml" - env: - TEST_JUNIT_XML_ROOT: $(Common.TestResultsDirectory)\junit - displayName: Post-process test results - condition: ne(variables['Atom.SkipTests'], 'true') - - - task: PublishTestResults@2 - inputs: - testResultsFormat: JUnit - searchFolder: $(Common.TestResultsDirectory)\junit - testResultsFiles: '**/*.xml' - mergeTestResults: true - testRunTitle: Windows $(buildArch) - condition: ne(variables['Atom.SkipTests'], 'true') - - - script: | - IF NOT EXIST "%ARTIFACT_STAGING_DIR%\crash-reports" MKDIR "%ARTIFACT_STAGING_DIR%\crash-reports" - IF EXIST "%Temp%\Atom Crashes" ( - FOR %%a in ("%Temp%\Atom Crashes\*.dmp") DO XCOPY "%%a" "%ARTIFACT_STAGING_DIR%\crash-reports" /I - ) - displayName: Stage crash reports - condition: failed() - env: - ARTIFACT_STAGING_DIR: $(Build.ArtifactStagingDirectory) + - template: templates/build.yml - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.ArtifactStagingDirectory)/crash-reports - ArtifactName: crash-reports - displayName: Publish crash reports on non-release branch - condition: and(failed(), eq(variables['ATOM_RELEASES_S3_KEY'], '')) + - template: templates/test.yml - - script: > - node $(Build.SourcesDirectory)\script\vsts\upload-crash-reports.js --crash-report-path "%ARTIFACT_STAGING_DIR%\crash-reports" --s3-path "vsts-artifacts/%BUILD_ID%/" + - pwsh: | + if ($env:BUILD_ARCH -eq "x64") { + $env:FileID="-x64" + echo "##vso[task.setvariable variable=FileID]$env:FileID" # Azure syntax + } env: - ATOM_RELEASES_S3_KEY: $(ATOM_RELEASES_S3_KEY) - ATOM_RELEASES_S3_SECRET: $(ATOM_RELEASES_S3_SECRET) - ATOM_RELEASES_S3_BUCKET: $(ATOM_RELEASES_S3_BUCKET) - ARTIFACT_STAGING_DIR: $(Build.ArtifactStagingDirectory) - BUILD_ID: $(Build.BuildId) - displayName: Upload crash reports to S3 on release branch - condition: and(failed(), ne(variables['ATOM_RELEASES_S3_KEY'], '')) - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-x64-windows.zip - ArtifactName: atom-x64-windows.zip - ArtifactType: Container - displayName: Upload atom-x64-windows.zip - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['buildArch'], 'x64')) - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/AtomSetup-x64.exe - ArtifactName: AtomSetup-x64.exe - ArtifactType: Container - displayName: Upload AtomSetup-x64.exe - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/$(AppName)-x64-$(ReleaseVersion)-full.nupkg - ArtifactName: $(AppName)-x64-$(ReleaseVersion)-full.nupkg - ArtifactType: Container - displayName: Upload $(AppName)-x64-$(ReleaseVersion)-full.nupkg - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/$(AppName)-x64-$(ReleaseVersion)-delta.nupkg - ArtifactName: $(AppName)-x64-$(ReleaseVersion)-delta.nupkg - ArtifactType: Container - displayName: Upload $(AppName)-x64-$(ReleaseVersion)-delta.nupkg - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) - continueOnError: true # Nightly builds don't produce delta packages yet, so don't fail the build - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/RELEASES-x64 - ArtifactName: RELEASES-x64 - ArtifactType: Container - displayName: Upload RELEASES-x64 - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x64')) - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/atom-windows.zip - ArtifactName: atom-windows.zip - ArtifactType: Container - displayName: Upload atom-windows.zip - condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['buildArch'], 'x86')) - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/AtomSetup.exe - ArtifactName: AtomSetup.exe - ArtifactType: Container - displayName: Upload AtomSetup.exe - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/$(AppName)-$(ReleaseVersion)-full.nupkg - ArtifactName: $(AppName)-$(ReleaseVersion)-full.nupkg - ArtifactType: Container - displayName: Upload $(AppName)-$(ReleaseVersion)-full.nupkg - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) - - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/$(AppName)-$(ReleaseVersion)-delta.nupkg - ArtifactName: $(AppName)-$(ReleaseVersion)-delta.nupkg - ArtifactType: Container - displayName: Upload $(AppName)-$(ReleaseVersion)-delta.nupkg - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) - continueOnError: true # Nightly builds don't produce delta packages yet, so don't fail the build + BUILD_ARCH: $(buildArch) + displayName: Set FileID based on the arch - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: $(Build.SourcesDirectory)/out/RELEASES - ArtifactName: RELEASES - ArtifactType: Container - displayName: Upload RELEASES - condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true'), eq(variables['buildArch'], 'x86')) + - template: templates/publish.yml + parameters: + artifacts: + - filename: atom$(FileID)-windows.zip + dir: $(Build.SourcesDirectory)/out + condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest')) + - filename: AtomSetup$(FileID).exe + dir: $(Build.SourcesDirectory)/out + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true')) + - filename: $(AppName)$(FileID)-$(ReleaseVersion)-full.nupkg + dir: $(Build.SourcesDirectory)/out + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true')) + - filename: $(AppName)$(FileID)-$(ReleaseVersion)-delta.nupkg + dir: $(Build.SourcesDirectory)/out + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true')) + continueOnError: true # Nightly builds don't produce delta packages yet, so don't fail the build + - filename: RELEASES$(FileID) + dir: $(Build.SourcesDirectory)/out + condition: and(succeeded(), eq(variables['IsReleaseBranch'], 'true')) diff --git a/script/vsts/release-branch-build.yml b/script/vsts/release-branch-build.yml index 8ea5d48e9bf..2385f9cc882 100644 --- a/script/vsts/release-branch-build.yml +++ b/script/vsts/release-branch-build.yml @@ -42,10 +42,7 @@ jobs: IsSignedZipBranch: $[ dependencies.GetReleaseVersion.outputs['Version.IsSignedZipBranch'] ] steps: - - task: NodeTool@0 - inputs: - versionSpec: 12.13.1 - displayName: Install Node.js 12.13.1 + - template: platforms/templates/preparation.yml # This has to be done separately because VSTS inexplicably # exits the script block after `npm install` completes.