持续集成

扩展集成测试可以在 CI 服务上运行。该@vscode/test-electron库可帮助你在 CI 提供程序上设置扩展测试,并包含Azure Pipelines 上的示例扩展设置。您可以查看构建管道或直接跳转到azure-pipelines.yml文件

自动化出版

您还可以将 CI 配置为自动发布新版本的扩展。

发布命令类似于使用 的本地环境发布vsce,但您必须以某种方式以安全的方式提供个人访问令牌 (PAT)。通过将 PAT 存储为VSCE_PAT 秘密变量vsce将能够使用它。秘密变量永远不会暴露,因此它们可以安全地在 CI 管道中使用。

Azure管道

Azure管道

Azure Pipelines非常适合运行 VS Code 扩展测试,因为它支持在 Windows、macOS 和 Linux 上运行测试。对于开源项目,您可以获得无限的时间和 10 个免费的并行作业。本部分介绍如何设置 Azure Pipelines 来运行扩展测试。

首先,在Azure DevOps上创建一个免费帐户,并为您的扩展创建一个Azure DevOps 项目

然后,将以下azure-pipelines.yml文件添加到扩展存储库的根目录中。除了xvfb在无头 Linux CI 机器中运行 VS Code 所需的 Linux 设置脚本之外,定义很简单:

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 自动发布

  1. 使用Azure DevOps 机密指令设置VSCE_PAT为机密变量。
  2. 安装vscedevDependencies(npm install @vscode/vsce --save-devyarn add @vscode/vsce --dev)。
  3. 声明一个不带 PAT 的deploy脚本(默认情况下,将使用环境变量作为个人访问令牌)。package.jsonvsceVSCE_PAT
"scripts": {
  "deploy": "vsce publish --yarn"
}
  1. 配置 CI,以便在创建标签时构建也将运行:
trigger:
  branches:
    include:
    - main
  tags:
    include:
    - refs/tags/v*
  1. 添加一个使用秘密变量进行调用的publish步骤。azure-pipelines.ymlyarn 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)

条件属性告诉 CI 仅在某些情况下运行发布步骤。

在我们的示例中,条件具有三项检查:

  • succeeded()- 仅在测试通过时发布。
  • startsWith(variables['Build.SourceBranch'], 'refs/tags/')- 仅在标记(发布)版本时发布。
  • eq(variables['Agent.OS'], 'Linux')- 包括您的构建是否在多个代理(Windows、Linux 等)上运行。如果没有,请删除该部分条件。

由于VSCE_PAT是秘密变量,因此它不能立即用作环境变量。因此,我们需要显式地将环境变量映射VSCE_PAT到秘密变量。

GitHub 操作

您还可以配置 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@v3
    - name: Install Node.js
      uses: actions/setup-node@v3
      with:
        node-version: 16.x
    - run: npm install
    - run: xvfb-run -a npm test
      if: runner.os == 'Linux'
    - run: npm test
      if: runner.os != 'Linux'

GitHub Actions 自动发布

  1. 使用GitHub Actions 机密说明设置VSCE_PAT为加密机密。
  2. 安装vscedevDependencies(npm install @vscode/vsce --save-devyarn add @vscode/vsce --dev)。
  3. deploypackage.json没有 PAT 的情况下声明脚本。
"scripts": {
  "deploy": "vsce publish --yarn"
}
  1. 配置 CI,以便在创建标签时构建也将运行:
on:
  push:
    branches:
    - main
  release:
    types:
    - created
  1. 将作业添加到使用秘密变量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 等)上运行。如果没有,请删除该部分条件。

亚搏体育appGitLab持续集成

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 自动化发布

  1. 使用GitLab CI 文档设置VSCE_PAT为屏蔽变量。
  2. 安装vscedevDependencies(npm install @vscode/vsce --save-devyarn add @vscode/vsce --dev)。
  3. deploypackage.json没有 PAT 的情况下声明脚本。
"scripts": {
  "deploy": "vsce publish --yarn"
}
  1. 添加一个使用屏蔽变量deploy调用的作业,npm run deploy该变量仅在标签上触发。
deploy:
  only:
    - tags
  script:
    - npm run deploy

特拉维斯·西尔

@vscode/test-electron还包括Travis CI 构建定义。Travis CI 中定义环境变量的方式与其他 CI 框架不同,因此xvfb脚本也不同:

language: node_js
os:
- osx
- linux
node_js: 10

install:
- |
  if [ $TRAVIS_OS_NAME == "linux" ]; then
    export DISPLAY=':99.0'
    /usr/bin/Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 &
  fi
script:
- |
  echo ">>> Compile vscode-test"
  yarn && yarn compile
  echo ">>> Compiled vscode-test"
  cd sample
  echo ">>> Run sample integration test"
  yarn && yarn compile && yarn test
cache: yarn

Travis CI 自动化发布

  1. VSCE_PAT使用Travis CI 加密密钥使用说明设置为加密密钥。
  2. 安装vscedevDependencies(npm install @vscode/vsce --save-devyarn add @vscode/vsce --dev)。
  3. deploypackage.json没有 PAT 的情况下声明脚本。
"scripts": {
  "deploy": "vsce publish --yarn"
}
  1. 添加使用秘密变量deploy调用的阶段。npm run deploy
deploy:
  provider: script
  script: "npm run deploy"
  skip_cleanup: true
  on:
    tags: true

部署属性告诉 CI 在满足一组条件时将工件部署到给定的提供程序拉取请求不会触发部署阶段

在我们的示例中,检查的条件:

  • tags: true- 仅当从 git 标签触发构建时才发布(发布)
  • skip_cleanup: true- 防止 travis 删除构建期间创建的部署可能需要的任何文件。

常见问题

我需要使用 Yarn 进行持续集成吗?

上述所有示例均指使用Yarn构建的假设项目,但可以调整为使用npmGruntGulp或任何其他 JavaScript 构建工具。