wasmtime 0.3.0

Command-line interface for Wasmtime
Documentation
name: $(Build.SourceBranch)-$(date:yyyyMMdd)$(rev:.r)
trigger:
  branches:
    include:
    - 'master'
  tags:
    include:
    - '*'
    exclude:
      - 'dev'

jobs:
- job: rustfmt
  pool:
    vmImage: 'macos-10.14'
  steps:
  - checkout: self
    submodules: true
  - template: ci/azure-install-rust.yml
  - script: rustup component add rustfmt
    displayName: Add rustfmt
  - script: cargo fmt --all -- --check
    displayName: Check formatting
  variables:
    toolchain: stable

# Smoke test to build docs on one builder, using OSX for now since it's the
# fastest
- job: docs
  pool:
    vmImage: 'macos-10.14'
  steps:
  - checkout: self
    submodules: true
  - template: ci/azure-install-rust.yml
  - script: cargo doc
    displayName: Build documentation
  variables:
    toolchain: stable

- job: Test
  strategy:
    matrix:
      windows-stable:
        imageName: 'vs2017-win2016'
        toolchain: stable
      linux-stable:
        imageName: 'ubuntu-16.04'
        toolchain: stable
      mac-stable:
        imageName: 'macos-10.14'
        toolchain: stable
      mac-beta:
        imageName: 'macos-10.14'
        toolchain: beta
      mac-nightly:
        imageName: 'macos-10.14'
        toolchain: nightly

  pool:
    vmImage: $(imageName)

  steps:
    - checkout: self
      submodules: true
    - template: ci/azure-install-rust.yml

    - script: cargo fetch
      displayName: Fetch cargo dependencies

    # Build and test all features except for lightbeam
    - bash: cargo test --all --exclude lightbeam --exclude wasmtime-wasi-c --exclude wasmtime-py
      displayName: Cargo test
      env:
        RUST_BACKTRACE: 1

    # Build and test lightbeam if we're using the nightly toolchain
    - bash: cargo build --package lightbeam
      displayName: Cargo build lightbeam
      condition: and(succeeded(), eq(variables['toolchain'], 'nightly'))
    - bash: cargo test --package lightbeam
      displayName: Cargo test lightbeam
      # Lightbeam tests fail right now, but we don't want to block on that.
      continueOnError: true
      condition: and(succeeded(), eq(variables['toolchain'], 'nightly'))
      env:
        RUST_BACKTRACE: 1

- job: Build
  strategy:
    matrix:
      windows:
        imageName: 'vs2017-win2016'
        # Statically link against msvcrt to produce slightly more portable
        # binaries on Windows by reducing our binary compatibility requirements.
        RUSTFLAGS: -Ctarget-feature=+crt-static
      mac:
        imageName: 'macos-10.14'
        # Lower the deployment target from our build image in an attempt to
        # build more portable binaries that run on older releases. Note that
        # 10.9 here is arbitrarily chosen and just happens to be the lowest that
        # works at this time. Raising this is probably fine.
        MACOSX_DEPLOYMENT_TARGET: 10.9
  variables:
    toolchain: stable
  pool:
    vmImage: $(imageName)
  steps:
  - template: ci/azure-build-release.yml

# Build the Linux release binary in an older Linux container (in this case
# Centos 6)
- job: Build_linux
  variables:
    toolchain: stable
  container:
    image: centos:6
    options: "--name ci-container -v /usr/bin/docker:/tmp/docker:ro"
  steps:
  - template: ci/azure-prepare-centos-6.yml
  - template: ci/azure-build-release.yml

# Build the `wasmtime-py` python extension in the same manner we build the
# binaries above, since these wheels are also native code that we're
# distributing.
#
# Note that the builds here are using a nightly compiler, not a stable compiler,
# since this is what PyO3 requires.
- job: Build_wheels
  strategy:
    matrix:
      windows:
        imageName: 'vs2017-win2016'
        RUSTFLAGS: -Ctarget-feature=+crt-static
      mac:
        imageName: 'macos-10.14'
        MACOSX_DEPLOYMENT_TARGET: 10.9
  variables:
    toolchain: nightly-2019-08-15
  pool:
    vmImage: $(imageName)
  steps:
  - template: ci/azure-build-wheels.yml
- job: Build_linux_wheels
  variables:
    toolchain: nightly-2019-08-15
  container:
    image: centos:6
    options: "--name ci-container -v /usr/bin/docker:/tmp/docker:ro"
  steps:
  - template: ci/azure-prepare-centos-6.yml
  - template: ci/azure-build-wheels.yml

- job: Publish
  dependsOn:
  - Build
  - Build_wheels
  - Build_linux
  - Build_linux_wheels
  condition: and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI'))
  steps:
  # Checking out the sources is needed to be able to delete the "dev" tag, see below.
  - checkout: self
    persistCredentials: true
    submodules: false
  - task: DownloadPipelineArtifact@1
    inputs:
      targetPath: $(Build.ArtifactStagingDirectory)
  - script: |
      echo "##vso[task.setvariable variable=tagName;]`echo $BUILD_SOURCEBRANCH | sed -e 's|refs/tags/||'`"
    condition: startsWith(variables['Build.SourceBranch'], 'refs/tags/')
  - task: GitHubRelease@0
    inputs:
      gitHubConnection: 'tschneidereit-releases'
      target: '$(Build.SourceVersion)'
      tagSource: 'manual'
      tag: '$(tagName)'
      title: 'Wasmtime $(tagName)'
      assets: '$(Build.ArtifactStagingDirectory)/**'
      isDraft: false
      isPreRelease: true
    condition: and(startsWith(variables['Build.SourceBranch'], 'refs/tags/'),
                   ne(variables['Build.SourceBranch'], 'refs/tags/dev'))

  # GitHub doesn't support doing rolling releases for branch.
  # To simulate that for dev builds, always do a release for the "dev" tag.
  # While the `edit` action for the GitHubRelease task would replace any assets
  # associated with the tag, it wouldn't update the tag itself. Hence, delete the
  # tag if it exists, and re-create it every time.
  # Also explicitly delete the GitHub release, which would otherwise turn into a draft
  # and linger forever.
  - task: GitHubRelease@0
    inputs:
      gitHubConnection: 'tschneidereit-releases'
      action: 'delete'
      tag: 'dev'
    # This might fail in case the target repo doesn't yet have this tag, which is fine.
    continueOnError: true
    condition: in(variables['Build.SourceBranch'], 'refs/heads/master', 'refs/tags/dev')
  - script: |
      git -c http.extraheader="AUTHORIZATION: basic ***" push origin :dev
    # This might fail in case the target repo doesn't yet have this tag, which is fine.
    continueOnError: true
    condition: in(variables['Build.SourceBranch'], 'refs/heads/master', 'refs/tags/dev')
  - task: GitHubRelease@0
    inputs:
      gitHubConnection: 'tschneidereit-releases'
      action: 'create'
      target: '$(Build.SourceVersion)'
      tag: 'dev'
      tagSource: 'manual'
      title: 'Latest CI build'
      assets: '$(Build.ArtifactStagingDirectory)/**'
      isDraft: false
      isPreRelease: true
    condition: in(variables['Build.SourceBranch'], 'refs/heads/master', 'refs/tags/dev')