持續整合
擴充功能整合測試可以在 CI 服務上執行。 @vscode/test-electron
程式庫可協助您在 CI 提供者上設定擴充功能測試,並包含在 Azure Pipelines 上的 範例擴充功能 設定。您可以查看 組建管線,或直接跳至 azure-pipelines.yml
檔案。
自動化發佈
您也可以設定 CI 來自動發佈新版本的擴充功能。
發佈命令類似於使用 vsce
從本機環境發佈,但您必須以某種安全的方式提供個人存取權杖 (PAT)。透過將 PAT 儲存為 VSCE_PAT
密碼變數,vsce
將能夠使用它。密碼變數永遠不會公開,因此在 CI 管線中使用是安全的。
Azure Pipelines
Azure Pipelines 非常適合執行 VS Code 擴充功能測試,因為它支援在 Windows、macOS 和 Linux 上執行測試。對於開放原始碼專案,您可以獲得無限分鐘和 10 個免費平行作業。本節說明如何設定 Azure Pipelines 以執行您的擴充功能測試。
首先,在 Azure DevOps 上建立免費帳戶,並為您的擴充功能建立 Azure DevOps 專案。
然後,將以下 azure-pipelines.yml
檔案新增至您擴充功能儲存庫的根目錄。除了 Linux 的 xvfb
設定腳本(這是必要的,才能在無頭 Linux CI 機器中執行 VS Code)之外,定義非常簡單明瞭
trigger:
branches:
include:
- main
tags:
include:
- v*
strategy:
matrix:
linux:
imageName: 'ubuntu-latest'
mac:
imageName: 'macos-latest'
windows:
imageName: 'windows-latest'
pool:
vmImage: $(imageName)
steps:
- task: NodeTool@0
inputs:
versionSpec: '10.x'
displayName: 'Install Node.js'
- bash: |
/usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
echo ">>> Started xvfb"
displayName: Start xvfb
condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
- bash: |
echo ">>> Compile vscode-test"
yarn && yarn compile
echo ">>> Compiled vscode-test"
cd sample
echo ">>> Run sample integration test"
yarn && yarn compile && yarn test
displayName: Run Tests
env:
DISPLAY: ':99.0'
最後,在您的 DevOps 專案中 建立新的管線,並將其指向 azure-pipelines.yml
檔案。觸發組建,就完成了!
您可以啟用組建,使其在推送至分支時甚至在提取要求時持續執行。請參閱 組建管線觸發程序 以了解更多資訊。
Azure Pipelines 自動化發佈
- 使用 Azure DevOps 密碼指示,將
VSCE_PAT
設定為密碼變數。 - 以
devDependencies
身分安裝vsce
(npm install @vscode/vsce --save-dev
或yarn add @vscode/vsce --dev
)。 - 在
package.json
中宣告不含 PAT 的deploy
指令碼(預設情況下,vsce
將使用VSCE_PAT
環境變數作為個人存取權杖)。
"scripts": {
"deploy": "vsce publish --yarn"
}
- 設定 CI,以便在建立標籤時也執行組建
trigger:
branches:
include:
- main
tags:
include:
- refs/tags/v*
- 在
azure-pipelines.yml
中新增一個publish
步驟,使用密碼變數呼叫yarn deploy
。
- bash: |
echo ">>> Publish"
yarn deploy
displayName: Publish
condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/'), eq(variables['Agent.OS'], 'Linux'))
env:
VSCE_PAT: $(VSCE_PAT)
condition 屬性告訴 CI 僅在某些情況下執行發佈步驟。
在我們的範例中,條件具有三個檢查
succeeded()
- 僅在測試通過時發佈。startsWith(variables['Build.SourceBranch'], 'refs/tags/')
- 僅在標記 (發佈) 組建時發佈。eq(variables['Agent.OS'], 'Linux')
- 如果您的組建在多個代理程式(Windows、Linux 等)上執行,則包含此項。否則,請移除條件的該部分。
由於 VSCE_PAT
是密碼變數,因此無法立即作為環境變數使用。因此,我們需要明確地將環境變數 VSCE_PAT
對應到密碼變數。
GitHub Actions
您也可以設定 GitHub Actions 來執行您的擴充功能 CI。在無頭 Linux CI 機器中,需要 xvfb
才能執行 VS Code,因此如果目前作業系統是 Linux,請在啟用 Xvfb 的環境中執行測試
on:
push:
branches:
- main
jobs:
build:
strategy:
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: 18.x
- run: npm install
- run: xvfb-run -a npm test
if: runner.os == 'Linux'
- run: npm test
if: runner.os != 'Linux'
GitHub Actions 自動化發佈
- 使用 GitHub Actions 密碼指示,將
VSCE_PAT
設定為加密密碼。 - 以
devDependencies
身分安裝vsce
(npm install @vscode/vsce --save-dev
或yarn add @vscode/vsce --dev
)。 - 在
package.json
中宣告不含 PAT 的deploy
指令碼。
"scripts": {
"deploy": "vsce publish --yarn"
}
- 設定 CI,以便在建立標籤時也執行組建
on:
push:
branches:
- main
release:
types:
- created
- 在管線中新增一個
publish
作業,使用密碼變數呼叫npm run deploy
。
- name: Publish
if: success() && startsWith(github.ref, 'refs/tags/') && matrix.os == 'ubuntu-latest'
run: npm run deploy
env:
VSCE_PAT: ${{ secrets.VSCE_PAT }}
if 屬性告訴 CI 僅在某些情況下執行發佈步驟。
在我們的範例中,條件具有三個檢查
success()
- 僅在測試通過時發佈。startsWith(github.ref, 'refs/tags/')
- 僅在標記 (發佈) 組建時發佈。matrix.os == 'ubuntu-latest'
- 如果您的組建在多個代理程式(Windows、Linux 等)上執行,則包含此項。否則,請移除條件的該部分。
GitLab CI
GitLab CI 可用於在無頭 Docker 容器中測試和發佈擴充功能。這可以透過提取預先設定的 Docker 映像,或在管線期間安裝 xvfb
和執行 Visual Studio Code 所需的程式庫來完成。
image: node:12-buster
before_script:
- npm install
test:
script:
- |
apt update
apt install -y libasound2 libgbm1 libgtk-3-0 libnss3 xvfb
xvfb-run -a npm run test
GitLab CI 自動化發佈
- 使用 GitLab CI 文件,將
VSCE_PAT
設定為遮罩變數。 - 以
devDependencies
身分安裝vsce
(npm install @vscode/vsce --save-dev
或yarn add @vscode/vsce --dev
)。 - 在
package.json
中宣告不含 PAT 的deploy
指令碼。
"scripts": {
"deploy": "vsce publish --yarn"
}
- 新增一個
deploy
作業,使用遮罩變數呼叫npm run deploy
,這只會在標籤上觸發。
deploy:
only:
- tags
script:
- npm run deploy
常見問題
我是否需要使用 Yarn 進行持續整合?
以上所有範例都參考一個使用 Yarn 建構的假設專案,但可以調整為使用 npm、Grunt、Gulp 或任何其他 JavaScript 組建工具。