【问题标题】:Using Lerna.js and Azure Devops Pipeline使用 Lerna.js 和 Azure Devops Pipeline
【发布时间】:2020-08-30 03:22:59
【问题描述】:

我正在研究一个新项目的 azuredevops 管道。我对 devops 完全陌生。

在这个项目中,我想使用 lerna.js 来管理我的 monorepo 和我的包。

考虑到我的 monorepo 中有这三个项目:

  • 包 1 (1.0.1)
  • 包 2 (1.0.0)
  • 包 3 (1.0.3)

我想创建一个新的 TAG,它将包 3 增加到 (1.0.4)。我怎样才能触发 Azure Pipeline 仅用于包 3?有指南吗?

我使用 lerna.js 观看了 one talk about monorepos,我试图弄清楚 Azure Pipelines 是否具有类似于 Sail CI 的功能。在示例中,我们有这个方法:

tasks:
  build-package-1:
    image: sailci/demo
    when:
      paths:
        - "packages/package-1/**/*"

我工作的公司正在使用 Azure DevOps,如果我可以在那里拥有该功能,那就太好了。

【问题讨论】:

  • 您的意思是您需要为同一存储库中的每个版本添加额外的项目吗?由于 DevOps 存储库具有所有历史记录,我认为您只需要在存储库中创建一个项目并为每个版本添加标签即可。
  • Lerna.js 是跨包管理 TAG 的自己的方式。我想为管道创建一个触发器,在该管道中,我可以根据特定包的新版本自动部署一个项目。我可以创建管道来执行此部署,但现在没有触发器。触发器是我的问题。

标签: azure-devops azure-pipelines lerna azure-pipelines-yaml


【解决方案1】:

与那个最接近的事情是@Simon Ness 用path filters 编写了多个管道。此外,如果您的包具有相似的结构并且需要相同的步骤来创建/测试/发布包,您应该考虑templates。

你描述的 conspet toi 处理包可以类似于以下步骤。

模板.yaml

parameters:
- name: workingDir 
  type: string
  default: package-1

steps:
- script: npm install
  workingDiretory: ${{ parameters.workingDir }}
- script: yarn install
  workingDiretory: ${{ parameters.workingDir }}
- script: npm run compile
  workingDiretory: ${{ parameters.workingDir }}

Package-1 的管道可能如下所示:


trigger:
  branches:
    include:
    - master
    - releases/*
  paths:
    include:
    - Package-1/*


steps:
- template: templates/template.yaml
  parameters:
    workingDir: Package-1

对于 Package-2:


trigger:
  branches:
    include:
    - master
    - releases/*
  paths:
    include:
    - Package-2/*

steps:
- template: templates/template.yaml
  parameters:
    workingDir: Package-2

编辑

对于标签部分,您需要做的就是更改触发部分:

trigger:
  branches:
    include:
    - master
    - refs/tags/*

当你创建一个标签并推送它时:

git tag release-05
git push origin --tags

您的管道将启动:

但是,触发器的工作方式类似于或条件,因此对于主标签或新标签的任何更改,都会启动。因此,如果您标记另一个分支(不是主)管道将启动。

这就是为什么您可能需要检查您的源分支是否来自触发器部分:


trigger:
  branches:
    include:
    - master
    - refs/tags/*

stages:
- stage: A
  condition: eq(variables['Build.SourceBranch'], 'master')
  jobs:
  - job: JA
    steps:
    - script: |
        echo "This is job Foo."

以上管道将运行:

  • master 分支的变化
  • 任何标签推送到服务器,但只有当你将标签推送到主分支时它才会运行阶段 A

【讨论】:

  • 感谢您的回答,这对我帮助很大。这样,当我的包裹有任何变化时,我就可以触发。当我的包中有更改并且它仅适用于 master 和新 TAG 时,如何触发?我想这样做是因为我想制作一个管道来构建和部署一个包。当我对 master 有任何更改时,您的解决方案就会触发。我找到了one solution at Medium,但我不明白如何将这个“onlyTags”放在我的.yml 文件中。也许我的问题是语法。你能帮帮我吗?
  • @MathiasGhenoAzzolini 你能检查我的编辑吗?对你有帮助吗?
  • 在我的测试中,最后一个示例不起作用,它跳过了“JA”作业的所有执行,并被触发了 3 次。因此,我将“master”更改为“'refs/heads/master'”,并且作业“JA”被触发了 3 次,并且仅针对 TAG 事件跳过了“JA”作业。因此,我尝试使用startsWith 放置“refs/tags/”,它仅针对 TAG 事件触发。 (但仍然是三倍,因为 lerna.js)。但是,当我对其他包执行新 TAG 时,也会触发此解决方案,因此它不是在寻找我的 path 属性。我的最终代码is here
  • 如果你有兴趣研究它,我可以和你分享我的项目。这是一个概念验证项目。
【解决方案2】:

如果您愿意为每个包定义单独的管道,请查看 CI triggers 中的 paths。

通过在触发器部分包含分支- refs/tags/*,可以将标签用作触发器。

【讨论】:

  • 感谢您的回答。当我有路径、分支和新 TAG 时,我仍然需要触发。
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
  • 2022-12-01
  • 2021-06-18
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
相关资源
最近更新 更多