【问题标题】:Only npm publish when version changes in tfs build仅当 tfs build 中的版本更改时 npm publish
【发布时间】:2023-03-22 06:03:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: npm tfs tfsbuild azure-artifacts npm-publish


    【解决方案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 链接构建。

      【讨论】:

      • 感谢您的回答,我认为单独的构建管道最适合我的情况。
      猜你喜欢
      • 2016-05-01
      • 2018-08-22
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2020-03-20
      • 2016-12-26
      • 2018-01-17
      • 1970-01-01
      相关资源
      最近更新 更多