diff options
author | Bert Belder <bertbelder@gmail.com> | 2018-07-31 11:20:17 +0200 |
---|---|---|
committer | Bert Belder <bertbelder@gmail.com> | 2018-08-02 03:56:49 +0200 |
commit | df8208557d684938e5e50aadbd41b9bcbc37d072 (patch) | |
tree | dcf31bca1b48879410f377e6b0b2aff1a0c874cb | |
parent | 788b0795de297362e6f46f9224da94c76adebc4f (diff) |
Set up Appveyor
-rw-r--r-- | .appveyor.yml | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 000000000..7a3e712da --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,171 @@ +version: '{build}.{branch}' + +skip_branch_with_pr: true + +clone_folder: c:\deno +clone_depth: 1 + +environment: + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + DENO_BUILD_MODE: debug + DENO_BUILD_PATH: $(APPVEYOR_BUILD_FOLDER)\out\debug + DENO_THIRD_PARTY_PATH: $(APPVEYOR_BUILD_FOLDER)\third_party + CARGO_HOME: $(USERPROFILE)\.cargo + RUSTUP_HOME: $(USERPROFILE)\.rustup + + # Appveyor uses 7zip to pack cache directories. We use these options: + # -t7z : Use '7z' format. The default is 'zip' which can't store symlinks. + # -snl : Store symlinks. + # -mtc : Use UTC timestamps. This is required for incremental builds. + # -mx=1 : Fast compression. + APPVEYOR_CACHE_ENTRY_ZIP_ARGS: -t7z -snl -mtc -mx=1 + +cache: + # Python packages installed with `pip --user` and Pip cache. + - $(APPDATA)\Python + - $(LOCALAPPDATA)\pip + # Rust stuff. + - $(CARGO_HOME) + - $(RUSTUP_HOME) + # Cache the third_party submodule to preserve binaries downloaded by setup.py, + # and to make incremental builds work. + - $(APPVEYOR_BUILD_FOLDER)\.git\modules\third_party + - $(APPVEYOR_BUILD_FOLDER)\third_party + # Build incrementally. + - $(DENO_BUILD_PATH) + +init: + # TODO: enable after this lands in master. + # Do no save the build cache for feature branches. Once we have multiple + # "official" branches, use a build matrix so each branch has it's own cache. + # - ps: | + # if ($env:APPVEYOR_REPO_BRANCH -ne "master") { + # $env:APPVEYOR_CACHE_SKIP_SAVE = "true" + # } + + # Make git check out symlinks (not placeholder text files). + - git config --global core.symlinks true + +install: + # `Exec` runs a regular executable. It looks at the process' exit code, + # rather than its stderr output, to tell if a command has failed + - ps: | + function Exec([ScriptBlock] $Command, [Switch] $NoNewLines) { + "$Command".TrimStart(" &") | Write-Host # Echo command. + & $Command 2>&1 | Write-Host -NoNewLine:$NoNewLines # Execute command. + if ($NoNewLine) { Write-Host } # Write newline. + if ($LastExitCode -ne 0) { throw "Failure. Exit code: $LastExitCode" } + } + + # Clone the third_party submodule. + - ps: | + try { + Exec { & git submodule update --init --force --depth 1 } + + } catch { + # Git will fail if the `third_party` directory was restored from cache, + # but the `.git/modules` directory wasn't. Rebuild it from scratch. + Remove-Item -Path $env:DENO_THIRD_PARTY_PATH ` + -Recurse -Force -ErrorAction Ignore + Exec -NoNewLines { & git submodule update --init --force --depth 1 } + } + + # Prune and pack git objects. Thus when we upload `.git/modules/` to + # the Appveyor cache, it'll include only objects that were actually needed. + - ps: | + if ($env:APPVEYOR_CACHE_SKIP_SAVE -ne "true") { + Push-Location $env:DENO_THIRD_PARTY_PATH + Exec { & git repack -d -l } + Pop-Location + } + + # Install a recent Node.js version. + - ps: Install-Product node 10 x64 + + # Make sure the right Python version is in PATH, and others are not. + - ps: | + # Remove the wrong Python version(s) from PATH. + $p = $env:PATH -split ";" | Where-Object { + -not (Test-Path -Path "$_\python.exe") -and + -not (Test-Path -Path "$_\pip.exe") + } + # Add binary dir for `pip --user` packages. + $p += "$env:APPDATA\Python\Scripts" + # Add python27-x64. + $p += "c:\Python27-x64" + $p += "c:\Python27-x64\Scripts" + $env:PATH = $p -join ";" + + # Pip on Appveyor is too old. Install a recent version in our user dir. + - python -m pip install --upgrade --user pip + + # Install Python packages. + - pip install --upgrade --user pywin32 yapf + + # Add Rust/Cargo to PATH. + - ps: $env:PATH += ";$env:CARGO_HOME\bin" + + # Install Rust via rustup-init, unless it was restored from cache. + # TODO: Ship Rust in the third_party repo. See issue #386. + - ps: | + if (-not (Test-Path -Path $env:CARGO_HOME)) { + Invoke-WebRequest -Uri "https://win.rustup.rs" ` + -OutFile "$env:TEMP\rustup-init.exe" + Exec -NoNewLines { & "$env:TEMP\rustup-init.exe" -y } + } + + # Update Rust. + - rustup update + + # The Rustup directory is very big with many files, which makes saving and + # restoring the Appveyor cache noticably slow. Remove unnecessary stuff. + # TODO: Use `rustup component remove docs` instead, when this issue + # is resolved: https://github.com/rust-lang-nursery/rustup.rs/issues/998. + - ps: | + Remove-Item -Recurse -Force -ErrorAction Ignore -Path @( + "$env:RUSTUP_HOME\downloads", + "$env:RUSTUP_HOME\tmp", + "$env:RUSTUP_HOME\toolchains\stable-x86_64-pc-windows-msvc\share\doc" + ) + # If Remove-Item didn't find one of these dirs, don't stop the build. + $null + + # Log installed Node.js version + processor architecture. + - node -p "`Node ${process.version} ${process.arch}`" + + # Log installed Python version + processor architecture. + - ps: >- + @("from sys import version", + "print 'Python', version") -join "`n" | & python - + + # Log some more versions. + - pip --version + - rustc --version + - cargo --version + + # Log environment variables. + - ps: | + Get-ChildItem env:* | Select-Object -Property Name, @{ + Name = "Value" + Expression = { + if ($_.Name -like "*PATH") { $_.Value -replace ";", ";`n" } + else { $_.Value } + } + } | Format-Table -AutoSize -Wrap + +before_build: + # Download clang and gn, generate ninja files. + - python tools\setup.py + +build_script: + - python tools\build.py + +after_build: + # The build completed successfully; make sure the cache gets saved even if + # some test fails. + - ps: $env:APPVEYOR_SAVE_CACHE_ON_ERROR = "true" + +test_script: + - python tools\lint.py + - ps: Exec { & python tools\test.py $env:DENO_BUILD_PATH } + |