簡體   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