在tfs build中版本更改时仅npm发布

f45qwnt8  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(119)

我创建了一个发布到Azure工件的私有npm包。为了发布我的npm包,我在tfs生成定义中有一个npm发布步骤。我使用的是tfs版本16.131.28507.4
这一切都按预期工作。然而,如果在npm包版本未更改的情况下触发构建,npm发布将失败,并禁止403。此错误导致我的构建的其余部分失败。npm包是更大项目的一部分,因此在npm包未更改的情况下进行构建并不罕见。
如果我的packages feed中的当前版本与包json中指定的版本相同,是否可以阻止执行npm publish的tfs构建步骤运行?
我知道构建步骤中的“自定义条件”,但不确定如何将Azure Artifacts当前发布的版本与我的package.json中的版本链接。我还知道构建定义中的“出错时继续”选项,但这会创建一个部分成功的构建,在这种情况下我希望避免。

kadbb459

kadbb4591#

如果在npm软件包版本未更改的情况下触发构建,npm发布将失败,并显示403禁止。
这是预期的行为。因为您的软件包名称/版本没有更改。之前已经发布过一个同名的软件包,所以您需要在package.json文件中使用一个不同的名称,然后再次发布npm。
在你的情况下,最简单的解决方案之一是更新你的npm包的最低版本,即使什么都没有改变。另一个如你所指出的,使用构建定义中的“Continue on Error”选项,但这会创建一个部分成功的构建。
我们没有任何内置设置/配置Azure Artifacts或npm任务可以判断您的包提要中的当前版本是否与包json中指定的版本相同。
而对于客户条件,我们也不提供这样一个表达式来控制这个任务应该在什么时候运行,这个你可以看一下这个官方链接--Conditions
另一个解决方法是分离你的构建管道,一个用于构建一些东西,npm发布包。一个用于构建一些东西,在azure包提要中引用你的npm包。如果你想每次npm版本改变时自动触发第二次构建。你可以使用Trigger Build Task来链接构建。

ktecyv1j

ktecyv1j2#

这是我们当前在Azure管道中使用的解决方案,当我们将我们的包发布到Azure工件时。
首先,将当前正在构建的包版本与所有发布的版本进行比较,并设置变量供其他任务用途:

- 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脚本当然可以精简或改进,但他们做的工作。

相关问题