繁体   English   中英

Azure DevOps 管道 - Maven 仅在不存在时部署发布

[英]Azure DevOps Pipeline - Maven deploy release only if it does not exist

我是 Azure DevOps 和 Maven 的新手。

我们已经建立了一个 Azure 构建管道,这样它将为快照构建和发布部署工件。

我希望发布工件的部署是幂等的。 也就是说,如果工件已经部署,它不应该是一个错误。

问题是我收到409“资源冲突”

Q 有没有办法告诉 maven 仅在工件不存在时才部署,并且如果存在则不是错误。

DevOps 有没有办法做到这一点?

对于我自己的教育,我也想知道如何为 maven(没有 Azure)执行此操作。 这可以通过命令行开关 pom.xml 或 maven settings.xml

似乎暗示没有,如果是这样,这是一个令人惊讶的遗漏。 我想了解其中的原理。

如果有一种方法可以检查所部署的工件实际上与管道刚刚构建的工件是否相同,则可以加分。

相关的管道片段是:

   task: Maven@3
#          condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
          inputs:
            mavenPomFile: 'pom.xml'
            options: '-B -s $(mvnSettings.secureFilePath) -DWHERE="AzureDevops" clean deploy'
            mavenAuthenticateFeed: true
            publishJUnitResults: true
            testResultsFiles: '**/TEST-*.xml'

作为背景,这就是我对 Azure 和 Maven 的了解。 如果我误解了任何事情,这可能是一个促成因素。

Maven 允许您部署两种工件:

快照

  • 快照是 package 的开发版本。
  • 快照具有后缀 -SNAPSHOT。 例如 1.2.0-SNAPSHOT
  • 快照是可变的。 部署操作可以用新版本替换 SNAPSHOT(更新的开发版本可以替换开发版本)

发布

  • 任何不以后缀 -SNAPSHOT 结尾的版本都被视为发布版本。
  • 发布是不可变的。 如果版本已部署到存储库,则部署操作将失败。

Azure 和 Maven 都认为已发布的工件是不可变的。 Azure 在充当 maven 存储库时理解 -SNAPSHOT 并允许覆盖开发版本。 这个想法是您不能(或至少不容易)替换其他可能依赖的已发布工件。

409 = 资源冲突

这可能意味着:

  • 工件已发布,无法覆盖

  • 该工件无法发布,因为它是错误的类型。 例如,将发布发布到仅接受快照的存储库或将快照发布到仅接受发布的存储库

我不确定如何告诉 maven 如果工件已经存在,部署失败是可以的。 明显和错误的 hack(在 Linux 中)是:

mvn deploy || /bin/true

这很糟糕,因为如果由于其他原因而失败,它将报告部署步骤成功。

有一个 maven 插件( https://github.com/chonton/exists-maven-plugin )可以做到这一点。 我不确定您将如何在 Azure 中使用它。 这个插件是事实上的标准吗?

也可以看看:


2020 年 6 月 23 日更新

我快到了,但卡住了:

    variables: 
    - name: artifactDoesNotExist
      value: '0'
    - name: mavenRepoURL
      value: 'https://blahblah.visualstudio.com/_packaging/myazurefeedname/maven/v1/com/mycompany/myproject'

    - task: Bash@3
      displayName: 'Check if Maven artifact exists'
      inputs:
        targetType: inline
        failOnStderr: false
        script: |
               #set variable iff artifact exists
               VERSION=`cat VERSION.MVN`; mvn -X -B -s $(mvnSettings.secureFilePath) -DWHERE="AzureDevops" -DremoteRepositories=$(mavenRepoUrl) dependency:get -Dartifact=com.mycompany.project:artifiactId:"$VERSION"
            echo "##vso[task.setvariable variable=artifactDoesNotExist]$?"

    - task: Bash@3
      condition: and(succeeded(), eq(variables['artifactDoesNotExist'], '0'))
      inputs:
        targetType: inline
        script: |
            echo artifactDoesNotExist == 0 -> true

    - task: Bash@3
      condition: and(succeeded(), eq(variables['artifactDoesNotExist'], '1'))
      inputs:
        targetType: inline
        script: |
            echo artifactDoesNotExist == 1 -> true

我怀疑 dependency:get 命令行可能不太正确。

注意:在测试命令时,我必须记住从 ~/.m2/repository 中删除工件,因为它在本地文件中看起来。

另一件奇怪的事情正在发生。 尽管我已经部署了工件的新测试版本,但它们并未出现在相关的 Azure 提要中。 然而,第一次尝试上传成功,而后续上传失败。 这些上传到哪里去了,为什么我在 Dev Ops 中看不到它们?

我发现此问题的版本仍作为 maven 工件“com.mycompany.myproject:artifactId”在提要中,并带有一个版本。

另请参阅上传和下载 azure 工件的等效 maven 命令和设置是什么?

这应该与 Maven 更相关,在 Azure DevOps 端没有具体配置。

您可以尝试在构建管道中使用命令行任务首先检查该发行版本是否存在:

mvn dependency:get -Dartifact=g:a:v -o -DrepoUrl=file://path/to/your/repo

更多详细信息请查看如何从命令行确定 Maven 工件是否在我的仓库中?

如果给定的 (group-artifact-version) 确实存在,那么您不要继续构建 rest。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM