当前位置: 首页 > 知识库问答 >
问题:

Azure DevOps管道-仅当Maven部署版本不存在时才发布

钮誉
2023-03-14

我对Azure DevOps和Maven都是新手。

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

我希望发布项目的部署是幂等的。也就是说,如果项目已经部署,则不应出错。

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

问:有没有办法告诉 maven 仅在项目不存在时才进行部署,并且如果存在,则不是错误。

从运营模式上有办法做到这一点吗?

对于我自己的教育,我也想知道如何为maven(没有Azure)做到这一点。这可以通过命令行开关、pom.xml或 maven 设置来实现.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允许您部署两种工件:

快照

    < li >快照是包的开发版本。 < li >快照带有后缀-SNAPSHOT。例如1 . 2 . 0-快照 < li >快照是可变的。部署操作可以用新版本替换快照(更新的开发版本可以替换开发版本)

释放

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

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

409 =资源冲突

这可能意味着:

> < li>

工件已经发布,无法覆盖

无法发布项目,因为它的类型错误。例如,将发布发布到只接受快照的存储库,或将快照发布到只接收发布的存储库

我不知道如何告诉maven,如果工件已经存在,部署失败也没关系。明显且错误的黑客攻击(Linux)是:

mvn deploy || /bin/true

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

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

另请参见:

  • 如何在 Azure 项目中使用相同的版本号更新 maven 依赖项
  • 无法使用 maven 部署项目,错误代码为 409

更新23/06/2020

我几乎就在那里,但卡住了:

    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

我怀疑依赖性:get命令行可能不太正确。

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

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

我发现这个问题的版本仍然作为maven工件的com.mycompany存在于提要中。myproject:artifactId'的版本。

另请参阅用于上传和下载 Azure 项目的等效 maven 命令和设置是什么?

共有1个答案

暴奕
2023-03-14

这应该更多地与Maven相关,在Azure运营模式方面没有具体的配置。

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

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

更多细节请看如何从命令行确定Maven工件是否在我的repo中?

如果给定的(group-artiface-version)确实存在,那么您就不会继续构建的其余部分。

 类似资料:
  • 问题内容: 我有2张桌子- : 第二张桌子- : 我只需要选择未取消的预订(在此示例中仅为ID 3)。我可以轻松地选择带有简单条件的已取消,但由于未在此处取消工作,因此我在努力避免未取消。 问题答案: 要么: 第一个版本更直观,但是我认为第二个版本通常可以获得更好的性能(假设您在联接中使用的列上有索引)。 第二个版本有效,因为返回第一个表中所有行的一行。当条件成功,这些行会包括从第二表中的列,就像

  • 我正在尝试部署一个现有的。Net核心应用程序,通过创建构建和发布管道来使用Azure Devops。构建管道工作正常,但我在运行发布管道(在部署Azure App Service下)时收到以下错误。 错误:未找到具有指定模式的包:D:\a\r1\a***. zip 检查任务中提到的包是作为构建中的工件发布还是作为前一阶段发布并在当前作业中下载。 应该做些什么来解决这个问题?

  • 问题内容: 我希望根据该文件是否已经存在来写一个文件,仅在不存在的情况下才写(实际上,我希望继续尝试文件,直到找到一个不存在的文件为止)。 下面的代码显示在其中一个潜在的攻击者可以插入一个符号,作为建议的方式这篇文章中该文件的测试和写入的文件之间。如果代码以足够高的权限运行,则可能会覆盖任意文件。 有什么办法解决这个问题? 问题答案: 编辑 :另请参见DaveJones的回答:从Python3.3

  • 我试图通过jenkins管道将azure web应用程序部署到azure form git 代码如下所示 这怎么可能?有什么方法可以将git repo url作为参数提供给azure插件吗? 谢了!

  • 我正在使用maven为JBOSS AS 7构建一个war文件。在maven部署之后,会有“测试”。本地存储库中的“war”和“test-2”。远程存储库中的“war”。这一切都如预期的那样(2是POM中的版本)。 如果我手动部署“test.war”,一切正常。如果我部署“test-2.war”,部署失败。如果我将“test-2.war”重命名为“test.war”,部署工作正常,但尝试在浏览器中访

  • 问题内容: 我需要将以下行添加到配置文件的末尾: 到一个名为 我正在寻找用于执行此操作的方法,但无法解决。 如果该行尚不存在,我将如何插入? 问题答案: 保持简单:) grep + echo 应该足够了: 安静 整行匹配 模式是一个普通的字符串 https://linux.die.net/man/1/grep 编辑:合并@cerin和@ thijs-wouters建议 。