gpt4 book ai didi

maven - Azure DevOps Pipeline - Maven 仅在不存在时部署发布

转载 作者:行者123 更新时间:2023-12-03 16:48:39 26 4
gpt4 key购买 nike

我是 Azure DevOps 和 Maven 的新手。
我们已经设置了一个 Azure 构建管道,以便它将为快照构建和发布部署 Artifact 。
我希望发布 Artifact 的部署是幂等的。
也就是说,如果 Artifact 已经部署,它不应该是一个错误。
问题是我收到了 409 "resource conflict"
Q 有没有办法告诉 maven 仅在 Artifact 不存在的情况下进行部署
如果确实如此,这不是错误。

有没有办法从 DevOps 中做到这一点?
对于我自己的教育,我也想知道如何为 maven(没有 Azure)做到这一点。这可以通过命令行开关、pom.xml 或 maven settings.xml
似乎暗示没有,如果有的话,这是一个令人惊讶的遗漏。我想了解其中的原理。
如果有一种方法可以检查部署的 Artifact 是否与管道刚刚构建的 Artifact 相同,则加分。
相关的管道片段是:

   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 允许您部署两种 Artifact :
快照
  • 快照是包的开发版本。
  • 快照具有后缀 -SNAPSHOT。例如。 1.2.0-快照
  • 快照是可变的。部署操作可以用新版本替换 SNAPSHOT(更新的开发版本可以替换开发版本)

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

  • Azure 和 Maven 都认为已发布的 Artifact 是不可变的。
    Azure 在充当 maven 存储库时理解 -SNAPSHOT,并允许覆盖开发版本。
    这个想法是您不能(或至少不容易)替换其他可能依赖的已发布 Artifact 。
    409 = 资源冲突
    这可能意味着:
  • Artifact 已经发布,无法覆盖
  • 无法发布 Artifact ,因为它的类型错误。
    例如将发布发布到仅接受快照的存储库或将快照发布到仅接受发布的存储库

  • 我不知道如何告诉 Maven 如果 Artifact 已经存在,部署失败是可以的。明显且错误的 hack(在 Linux 中)是:
    mvn deploy || /bin/true
    这很糟糕,因为如果部署步骤由于其他原因失败,它会将部署步骤报告为成功。
    有一个 maven 插件 ( https://github.com/chonton/exists-maven-plugin ) 可以做到这一点。我不确定您将如何在 Azure 中使用它。
    这个插件是事实上的标准吗?
    也可以看看:
  • How to update a maven dependency with a same version number in Azure Artifacts
  • Failed to deploy artifacts using maven, error code 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/repository 中删除 Artifact ,因为它在本地看起来。
    另一件奇怪的事情正在发生。尽管我已经部署了 Artifact 的新测试版本,但它们并未出现在相关的 Azure 源中。然而,第一次尝试上传成功,而后续上传失败。
    这些上传文件去哪里了,为什么我在 Dev Ops 中看不到它们?
    我发现此问题的版本仍作为 maven Artifact “com.mycompany.myproject:artifactId”与版本一起出现在提要中。
    另见 What are the equivalent maven commands and settings to upload and download azure artifacts?

    最佳答案

    这应该与 Maven 更相关,Azure DevOps 方面没有任何特定的配置。

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

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

    更多细节看这个 How to determine if a Maven artifact is in my repo from command line?

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

    关于maven - Azure DevOps Pipeline - Maven 仅在不存在时部署发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62293536/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com