仅当 tfs build 中的版本更改时 npm publish

Posted

技术标签:

【中文标题】仅当 tfs build 中的版本更改时 npm publish【英文标题】:Only npm publish when version changes in tfs build 【发布时间】:2020-03-07 07:49:08 【问题描述】:

我创建了一个发布到 Azure Artifacts 的私有 npm 包。为了发布我的 npm 包,我在我的 tfs 构建定义中有一个 npm 发布步骤。我正在使用 tfs 版本16.131.28507.4

这一切都按预期进行。但是,如果在 npm 包版本未更改的情况下触发构建,则 npm 发布将失败,并显示 403 禁止。此错误导致我的其余构建失败。 npm 包是较大项目的一部分,因此在 npm 包未更改的情况下进行构建的情况并不少见。

如果我的包提要中的当前版本与包 json 中指定的版本相同,是否可以阻止执行 npm publish 的 tfs 构建步骤运行?

我知道构建步骤中的“自定义条件”,但不确定如何将 Azure Artifacts 当前发布的版本与我的package.json 中的版本关联起来。我也知道构建定义中的“出错时继续”选项,但这会创建一个部分成功的构建,在这种情况下我想避免这种情况。

【问题讨论】:

【参考方案1】:

当我们将包发布到 Azure Artifacts 时,这是我们目前在 Azure Pipelines 中使用的解决方案。

首先,将当前构建的包版本与所有已发布的版本进行比较,并设置变量以供其他任务使用:

- bash:
        PACKAGE_VERSION="$(node -p -e "require('./package.json').version")"
        PACKAGE_NAME="$(node -p -e "require('./package.json').name")"

        FOUND_VERSION=$(npm view $PACKAGE_NAME versions | grep \'$VERSION\')
        
        if $FOUND_VERSION
        then
            IS_NEW_VERSION=true
        fi

        echo "##vso[task.setvariable variable=IS_NEW_VERSION]$IS_NEW_VERSION"

请注意,我们使用npm view <package-name> versions,而不仅仅是version。这是为了确保我们获得所有已发布的版本,而不仅仅是最新版本。

然后做你需要做的事情来发布一个新版本,构建它等等。

然后,仅当 $IS_NEW_VERSIONtrue 时发布:

- bash: |
        npm publish
  displayName: 'Publish NPM package'
  condition: and(not(failed()), eq(variables.IS_NEW_VERSION, 'true'))

也许有点蛮力,bash 脚本当然可以精简或改进,但它们可以完成工作。

【讨论】:

【参考方案2】:

如果在 npm 包版本未更改的情况下触发构建 npm 发布将失败并显示 403 禁止。

这是预期的行为。由于您的软件包名称/版本未更改。具有该名称的包之前已经发布过,因此您需要在 package.json 文件中使用不同的名称,然后再次 npm publish。

在您的情况下,最简单的解决方案是更新您的 npm 包的最低版本,即使没有任何改变。另一个正如您所指出的,在构建定义中使用“出错时继续”选项,但这会创建部分成功的构建。

我们没有 Azure Artifacts 的任何内置设置/配置,npm 任务可以判断您的包源中的当前版本是否与包 json 中指定的版本相同。

对于客户条件,我们也没有提供这样的表达式来控制该任务何时运行。为此,你可以看看这个官方链接--Conditions。

另一种解决方法应该是分离你的构建管道,一个用于构建东西,npm 发布包。一种用于构建某些东西,请在 azure 包提要中引用您的 npm 包。如果您希望每次 npm 版本更改时自动触发第二次构建。您可以使用Trigger Build Task 链接构建。

【讨论】:

感谢您的回答,我认为单独的构建管道最适合我的情况。

以上是关于仅当 tfs build 中的版本更改时 npm publish的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 tfs build 以在发布构建完成时复制 dll

TFS Build 找不到 Grunt

TFS Team Build - 如果 app_code 引用解决方案中的另一个项目,则构建失败

npm install from tfs feed(在构建过程中)给出错误:无法验证

TFS Build Server中的Office引用

TFS Build 报告未显示原始分支的评论