從 Travis 遷移至 Azure Pipelines

Azure DevOps Services

本指南的目的是要協助您從 Travis 遷移至 Azure Pipelines。 本指南說明如何從 Travis 設定轉譯為 Azure Pipelines 設定。

我們需要您的協助,才能讓本指南變得更好! 提交批註或直接參與您的變更。

主要差異

Travis 與 Azure Pipelines 之間有許多差異,包括:

  • Travis 組建具有 階段 作業 階段 ,而 Azure Pipelines 有可依您選擇的任意順序或群組排列和執行的步驟。

  • Azure Pipelines 可讓作業定義和步驟儲存在相同或不同存放庫中的個別 YAML 檔案中,讓步驟可在多個管線之間共用。

  • Azure Pipelines 提供在 Microsoft 管理的 Linux、Windows 和 macOS 映射上建置和測試的完整支援。 如需託管代理程式的詳細資訊,請參閱 Microsoft 裝載的 代理程式。

必要條件

語言

Travis 會使用 language 關鍵字來識別為組建設定的必要條件建置環境。 例如,若要選取 Node.JS 16.x:

.travis.yml

language: node_js
node_js:
  - 16

根據預設,Microsoft 裝載的 代理套裝程式含多種語言的 SDK。 若要使用特定語言版本,您可能需要使用 語言選取工作 來設定環境。

例如,若要選取 Node.JS 16.x:

azure-pipelines.yml

steps:
- task: UseNode@1
  inputs:
    version: '16.x'

語言對應

languageTravis 中的 關鍵字表示使用的語言工具版本,以及隱含執行許多建置步驟。 在 Azure Pipelines 中,您必須指定您想要執行的命令。

以下是從 language 關鍵字到針對最常使用語言自動執行的命令的翻譯指南:

語言 命令
c
cpp
./configure
make
make install
csharp nuget restore [solution.sln]
msbuild /p:Configuration=Release [solution.sln]
clojure lein deps
lein test
go go get -t -v ./...
makeorgo test
java
groovy
Gradle
gradle assemble
gradle check

Maven
mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V
mvn test -B

螞蟻
ant test
node_js npm install或 或 npm ciyarn
npm test
objective-c
swift
pod installorbundle exec pod install
xcodebuild -scheme [scheme] build test \| xcpretty
perl cpanm --quiet --installdeps --notest .

Build.PL
perl ./Build.pl
./Build test

Makefile.PL:
perl Makefile.PL
make test

Makefile
make test
php phpunit
python pip install -r requirements.txt
ruby bundle install --jobs=3 --retry=3
rake

此外,可以啟用較不常見的語言,但需要在 Docker 容器內執行另一個相依性安裝步驟:

語言 命令
crystal docker run -v $(pwd):/src -w /src crystallang/crystal shards install
docker run -v $(pwd):/src -w /src crystallang/crystal crystal spec
d sudo wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list
sudo apt-get update
sudo apt-get -y --allow-unauthenticated install --reinstall d-apt-keyring
sudo apt-get update
sudo apt-get install dmd-compiler dub
dub test --compiler=dmd
dart wget https://dl-ssl.google.com/linux/linux_signing_key.pub -O - \| sudo apt-key add -
wget https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list -O /etc/apt/sources.list.d/dart_stable.list
sudo apt-get update
sudo apt-get install dart
/usr/lib/dart/bin/pub get
/usr/lib/dart/bin/pub run test
erlang sudo apt-get install rebar
rebar get-deps
rebar compile
rebar skip_deps=true eunit
elixir sudo apt-get install elixir
mix local.rebar --force
mix local.hex --force
mix deps.get
mix test
haskell sudo apt-get install cabal-install
cabal install --only-dependencies --enable-tests
cabal configure --enable-tests
cabal build
cabal test
haxe sudo apt-get install haxe
yes \| haxelib install [hxml]
haxe [hxml]
julia sudo apt-get install julia
julia -e "using Pkg; Pkg.build(); end"
julia --check-bounds=yes -e "Pkg; Pkg.test(coverage=true); end"
nix docker run -v $(pwd):/src -w /src nixos/nix nix-build
perl6 sudo apt-get install rakudo
PERL6LIB=lib prove -v -r --exec=perl6 t/
rust curl -sSf https://sh.rustup.rs | sh -s -- -y
cargo build --verbose
cargo test --verbose
scala echo "deb https://repo.scala-sbt.org/scalasbt/debian /" | /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
sudo apt-get update
sudo apt-get install sbt
sbt ++2.11.6 test
smalltalk docker run -v $(pwd):/src -w /src hpiswa/smalltalkci smalltalkci

多種語言選擇

您也可以設定支援以多種語言建置不同應用程式的環境。 例如,若要確保建置環境以 Node.JS 16.x 和 Ruby 3.2 或更高版本為目標:

azure-pipelines.yml

steps:
- task: UseNode@1
  inputs:
    version: '8.x'
- task: UseRubyVersion@0
  inputs:
    versionSpec: '>= 3.2'

階段

在 Travis 中,步驟是在一組固定的具名階段中定義,例如 before_installbefore_script 。 Azure Pipelines 沒有具名階段,而且步驟可以分組、命名及組織管線的任何方式。

例如:

.travis.yml

before_install:
    - npm install -g bower
install:
    - npm install
    - bower install
script:
    - npm run build
    - npm test

azure-pipelines.yml

steps:
- script: npm install -g bower
- script: npm install
- script: bower install
- script: npm run build
- script: npm test

或者,步驟可以分組在一起,並選擇性地命名:

azure-pipelines.yml

steps:
- script: |
    npm install -g bower
    npm install
    bower install
  displayName: 'Install dependencies'
- script: npm run build
- script: npm test

平行作業

Travis 可讓您定義階段,也就是平行執行的作業群組,以提供平行處理原則。 Travis 組建可以有多個階段;一旦階段中的所有作業都已完成,下一個階段就會開始。

使用 Azure Pipelines,您可以讓每個步驟或階段都相依于任何其他步驟。 如此一來,您可以指定以序列方式執行哪些步驟,以及可以平行執行的步驟。 因此,您可以在完成一個步驟之後平行執行多個步驟,然後使用之後執行的單一步驟來回扇出。 此模型可讓您視需要定義複雜工作流程的選項。 目前,以下是一個簡單的範例:

Simple Parallel Execution Illustration

例如,若要執行組建腳本,然後在完成時同時執行單元測試和整合測試,並在所有測試完成後封裝成品,然後執行部署至生產階段前:

.travis.yml

jobs:
  include:
  - stage: build
    script: ./build.sh
  - stage: test
    script: ./test.sh unit_tests
  - script: ./test.sh integration_tests
  - stage: package
    script: ./package.sh
  - stage: deploy
    script: ./deploy.sh pre_prod

azure-pipelines.yml

jobs:
- job: build
  steps:
  - script: ./build.sh
- job: test1
  dependsOn: build
  steps:
  - script: ./test.sh unit_tests
- job: test2
  dependsOn: build
  steps:
  - script: ./test.sh integration_tests
- job: package
  dependsOn:
  - test1
  - test2
  script: ./package.sh
- job: deploy
  dependsOn: package
  steps:
  - script: ./deploy.sh pre_prod

進階平行執行

在 Azure Pipelines 中,您有更多選項可控制管線的協調方式。

例如,小組有一組快速執行的單元測試,以及另一組且較慢的整合測試。 小組想要在單元完成時立即開始建立發行的 .ZIP 檔案,因為它們提供建置提供良好套件的高信賴度。 但在部署至生產階段前之前,他們想要等到所有測試都通過:

Advanced Parallel Execution Illustration

在 Azure Pipelines 中,他們可以透過下列方式執行此動作:

azure-pipelines.yml

jobs:
- job: build
  steps:
  - script: ./build.sh
- job: test1
  dependsOn: build
  steps:
  - script: ./test.sh unit_tests
- job: test2
  dependsOn: build
  steps:
  - script: ./test.sh integration_tests
- job: package
  dependsOn: test1
  script: ./package.sh
- job: deploy
  dependsOn:
  - test1
  - test2
  - package
  steps:
  - script: ./deploy.sh pre_prod

步驟重複使用

在 Travis 中,您可以使用矩陣跨單一組態執行多個執行。 在 Azure Pipelines 中,您可以使用相同方式的矩陣,但您也可以使用範本 來實作 組態重複使用。

範例:矩陣中的環境變數

使用環境變數變更執行數個組建的最常見方式之一是變更執行。 例如,您的組建腳本可以尋找環境變數的存在,並變更軟體的建置方式,或測試方式。

您可以使用矩陣,針對環境變數中的每個值執行一次組建組態數次。 例如,若要執行指定的腳本三次,每次都有環境變數的不同設定:

.travis.yml

os: osx
env:
  matrix:
  - MY_ENVIRONMENT_VARIABLE: 'one'
  - MY_ENVIRONMENT_VARIABLE: 'two'
  - MY_ENVIRONMENT_VARIABLE: 'three'
script: echo $MY_ENVIRONMENT_VARIABLE

azure-pipelines.yml

pool:
  vmImage: 'macOS-latest'
strategy:
  matrix:
    set_env_to_one:
      MY_ENVIRONMENT_VARIABLE: 'one'
    set_env_to_two:
      MY_ENVIRONMENT_VARIABLE: 'two'
    set_env_to_three:
      MY_ENVIRONMENT_VARIABLE: 'three'
steps:
- script: echo $(MY_ENVIRONMENT_VARIABLE)

範例:矩陣中的語言版本

另一個常見案例是針對數個不同的語言環境執行。 Travis 支援使用 關鍵字的 language 隱含定義,而 Azure Pipelines 預期有明確的工作定義如何設定該語言版本。

您可以使用 Azure Pipelines 中的環境變數矩陣選項來啟用不同語言版本的矩陣。 例如,您可以在每個對應至您想要使用之語言版本的矩陣變數中設定環境變數,然後在第一個步驟中,使用該環境變數來執行語言設定工作:

.travis.yml

os: linux
matrix:
  include:
  - rvm: 2.3.7
  - rvm: 2.4.4
  - rvm: 2.5.1
script: ruby --version

azure-pipelines.yml

vmImage: 'ubuntu-latest'
strategy:
  matrix:
    ruby 2.3:
      ruby_version: '2.3.7'
    ruby 2.4:
      ruby_version: '2.4.4'
    ruby 2.5:
      ruby_version: '2.5.1'
steps:
- task: UseRubyVersion@0
  inputs:
    versionSpec: $(ruby_version)
- script: ruby --version

範例:矩陣內的作業系統

在多個作業系統中執行組建也很常見。 Travis 使用 os 關鍵字支援此定義,而 Azure Pipelines 可讓您選取要使用 關鍵字在 中 vmImage 執行的集區來設定作業系統。

例如,您可以在每個矩陣變數中設定環境變數,以對應至您想要使用的作業系統映射。 然後,您可以將電腦集區設定為您已設定的變數:

.travis.yml

matrix:
  include:
  - os: linux
  - os: windows
  - os: osx
script: echo Hello, world!

azure-pipelines.yml

strategy:
  matrix:
    linux:
      imageName: 'ubuntu-latest'
    mac:
      imageName: 'macOS-latest'
    windows:
      imageName: 'windows-latest'

pool:
  vmImage: $(imageName)

steps:
- script: echo Hello, world!

成功和失敗處理

Travis 可讓您指定在建置成功、使用 after_success 階段或建置失敗時,使用 after_failure 階段執行的步驟。 透過 Azure Pipelines,您可以根據任何步驟的結果來定義成功和失敗狀況,以啟用更有彈性且功能強大的管線。

.travis.yml

build: ./build.sh
after_success: echo Success 
after_failure: echo Failed 

azure-pipelines.yml

steps:
- script: ./build.sh
- script: echo Success
  condition: succeeded()
- script: echo Failed
  condition: failed()

進階成功和失敗處理

在 Azure Pipelines 中,您可以針對作業之間的流程式控制制,設計一組彈性的相依性和條件。
您可以設定作業,根據先前作業的成功或失敗,或根據環境變數執行。 您甚至可以將作業設定為一律執行,而不論其他作業是否成功。

例如,如果您想要在建置失敗時執行腳本,但前提是它以主要分支上的組建的形式執行:

azure-pipelines.yml

jobs:
- job: build
  steps:
  - script: ./build.sh
- job: alert
  dependsOn: build
  condition: and(failed(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  steps:
  - script: ./sound_the_alarms.sh

預先定義的變數

Travis 和 Azure Pipelines 都會設定多個環境變數,讓您能夠檢查 CI 系統的執行環境並與其互動。

在大部分情況下,Azure Pipelines 變數會比對 Travis 中的環境變數。 以下是 Travis 中常用的環境變數清單,以及其在 Azure Pipelines 中的類比:

崔維斯 Azure Pipelines 描述
CI=trueTRAVIS=true TF_BUILD=True 指出您的組建正在 CI 系統中執行;適用于也打算在開發期間在本機執行的腳本。
TRAVIS_BRANCH CI 組建
BUILD_SOURCEBRANCH

提取要求組建
SYSTEM_PULLREQUEST_TARGETBRANCH
組建已排入佇列的分支名稱,或提取要求的目標分支名稱。
TRAVIS_BUILD_DIR BUILD_SOURCESDIRECTORY 取出來源和預設工作目錄的位置。
TRAVIS_BUILD_NUMBER BUILD_BUILDID 目前組建調用的唯一數值識別碼。
TRAVIS_COMMIT CI 組建
BUILD_SOURCEVERSION
目前正在建置的認可識別碼。
TRAVIS_COMMIT 提取要求組建
git rev-parse HEAD^2
針對提取要求驗證組建,Azure Pipelines 會將提取要求產生的合併認可設定 BUILD_SOURCEVERSION 為 main;此命令會識別提取要求認可本身。
TRAVIS_COMMIT_MESSAGE BUILD_SOURCEVERSIONMESSAGE 正在建置之認可的記錄訊息。
TRAVIS_EVENT_TYPE BUILD_REASON 組建排入佇列的原因;值的對應位於下方的「建置原因」表格中。
TRAVIS_JOB_NAME AGENT_JOBNAME 如果指定,則為目前作業的名稱。
TRAVIS_OS_NAME AGENT_OS 執行作業的作業系統;值的對應位於下方的「作業系統」表格中。
TRAVIS_PULL_REQUEST Azure Repos
SYSTEM_PULLREQUEST_PULLREQUESTID

GitHub
SYSTEM_PULLREQUEST_PULLREQUESTNUMBER
觸發此組建的提取要求編號。 (針對 GitHub 組建,這是非 提取要求編號的唯一識別碼
TRAVIS_PULL_REQUEST_BRANCH SYSTEM_PULLREQUEST_SOURCEBRANCH 提取要求產生所在分支的名稱。
TRAVIS_PULL_REQUEST_SHA 提取要求組建
git rev-parse HEAD^2
針對提取要求驗證組建,Azure Pipelines 會將提取要求產生的合併認可設定 BUILD_SOURCEVERSION 為 main;此命令會識別提取要求認可本身。
TRAVIS_PULL_REQUEST_SLUG 如果提取要求源自分支,則為分支存放庫的名稱。 Azure Pipelines 中沒有類似此專案。
TRAVIS_REPO_SLUG BUILD_REPOSITORY_NAME 此組建設定的存放庫名稱。
TRAVIS_TEST_RESULT AGENT_JOBSTATUS Travis 會將此值設定為 0 ,如果所有先前的步驟都成功 (傳 0 回 )。 針對 Azure Pipelines,請檢查該 AGENT_JOBSTATUS=Succeeded
TRAVIS_TAG BUILD_SOURCEBRANCH 如果建立標記來排入此組建佇列,則這是該標籤的名稱。 針對 Azure Pipelines,會 BUILD_SOURCEBRANCH 設定為完整的 Git 參考名稱,例如 refs/tags/tag_name
TRAVIS_BUILD_STAGE_NAME Travis 中階段的名稱。 如先前所見,Azure Pipelines 會使用工作處理流程式控制制。 您可以參考 AGENT_JOBNAME

建置 原因:

變數 TRAVIS_EVENT_TYPE 包含值,這些值會對應至 Azure Pipelines BUILD_REASON 變數所提供的值:

崔維斯 Azure Pipelines 描述
push IndividualCI 組建是從推送進行的持續整合組建。
pull_request PullRequest 組建已排入佇列以驗證提取要求。
api Manual 組建已由 REST API 或網頁上的手動要求排入佇列。
cron Schedule 組建已排程。

作業系統

變數 TRAVIS_OS_NAME 包含值,這些值會對應至 Azure Pipelines AGENT_OS 變數所提供的值:

崔維斯 Azure Pipelines 描述
linux Linux 組建正在 Linux 上執行。
osx Darwin 組建正在 macOS 上執行。
windows Windows_NT 組建正在 Windows 上執行。

若要深入瞭解,請參閱 預先定義的環境變數

如果沒有所需的資料變數,您可以使用殼層命令來取得它。 例如,建置之提取要求認可識別碼的環境變數替代方式是執行 git 命令: git rev-parse HEAD^2

建置特定分支

根據預設,Travis 和 Azure Pipelines 都會在所有分支上執行 CI 組建。 同樣地,這兩個系統都可讓您將這些組建限制為特定分支。 在 Azure Pipelines 中,要建置的分支清單應該列在 include 清單中,而不要 建置的分支 應該列在 'exclude list' 中。 支援萬用字元。

例如,只建置 main 分支,以及開頭為 「releases」 一詞的分支:

.travis.yml

branches:
  only:
  - main
  - /^releases.*/

azure-pipelines.yml

trigger:
  branches:
    include:
    - main
    - releases*

輸出快取

Travis 支援快取相依性和中繼建置輸出,以改善建置時間。 Azure Pipelines 不支援快取中繼組建輸出,但會提供與 Azure Artifacts 的整合,以用於相依性儲存體。

Git 子模組

Travis 和 Azure Pipelines 預設都會「以遞迴方式」複製 git 存放庫。 這表示代理程式會複製子模組,這非常有用,因為子模組通常包含相依性。 不過,額外的複製需要時間,因此如果您不需要相依性,則可以停用複製子模組:

.travis.yml

git:
  submodules: false

azure-pipelines.yml

checkout:
  submodules: false