仅当版本变化时,在TFS构建中才发布npm。

5
我已创建了一个私有的npm包,发布到Azure Artifacts上。要发布我的npm包,我在tfs构建定义中设定了一个npm发布步骤。我正在使用tfs版本16.131.28507.4
这一切都按预期工作。然而,如果触发了一个构建,其中npm包版本未更改,则npm发布将以403禁止的方式失败。此错误会导致我的构建其余部分失败。npm包是一个更大项目的一部分,因此构建没有更改npm包的情况并不罕见。
如果我包的当前版本与package.json中指定的版本相同,那么是否可以防止执行执行npm publish的tfs构建步骤呢?
我知道构建步骤中的“自定义条件”,但不确定如何将Azure Artifacts的当前发布版本与我的package.json中的版本链接起来。我也知道构建定义中的“继续错误”选项,但在这种情况下,这会产生部分成功的构建,我想避免这种情况。
2个回答

1
如果构建触发时npm包的版本未更改,则npm发布将失败并显示403禁止访问。这是一种预期行为。因为您的包名称/版本未更改。在此之前已经发布了具有该名称的包,因此您需要在package.json文件中使用不同的名称,然后再次npm发布。在您的情况下,最简单的解决方案是即使没有任何更改也更新npm包的最小版本。另一个解决方案是使用“继续错误”选项在构建定义中,但这会创建部分成功的构建。我们没有任何内置设置/配置,可以判断Azure Artifacts或npm任务中当前版本是否与包json中指定的版本相同。对于客户条件,我们也没有提供控制此任务何时运行的表达式。关于此问题,您可以查看此官方链接--Conditions

另一个解决方法应该是分开您的构建管道,一个用于构建某些内容、npm发布包。另一个用于构建某些内容,在Azure包源中引用您的npm包。如果您希望每次npm版本更改都自动触发第二次构建,则可以使用触发构建任务链接构建。


谢谢您的回答,我认为对于我的情况来说,单独的构建流程是最合适的选择。 - Michael Hancock

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 \'$PACKAGE_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脚本当然可以被简化或改进,但它们能完成任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接