仅当 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_VERSION
为 true
时发布:
- 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 Team Build - 如果 app_code 引用解决方案中的另一个项目,则构建失败