如何从PR在Azure工件中安全地发布到NuGet

时间:2019-10-10 07:57:49

标签: github nuget pull-request azure-artifacts github-package-registry

我在GitHub repository中使用以下yaml,以便在每次使用Git标记时将NuGet程序包在每次提交时发布到Azure Artifacts和GitHub程序包,并发布到正式的NuGet存储库。

- stage: Deploy
  jobs:
  - deployment: AzureArtefacts
    displayName: 'Azure Artefacts'
    pool:
      vmImage: windows-latest
    environment: 'Azure Artefacts'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: NuGetToolInstaller@1
            displayName: 'NuGet Install'
          - task: NuGetAuthenticate@0
            displayName: 'NuGet Authenticate'
          - script: nuget push $(Agent.BuildDirectory)\Windows\*.nupkg -Source https://pkgs.dev.azure.com/serilog-exceptions/_packaging/serilog-exceptions/nuget/v3/index.json -ApiKey AzureArtifacts -SkipDuplicate
            displayName: 'NuGet Push'
            failOnStderr: true
  - deployment: GitHub
    pool:
      vmImage: windows-latest
    environment: 'GitHub'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: NuGetToolInstaller@1
            displayName: 'NuGet Install'
          - script: nuget source Add -Name GitHub -Source https://nuget.pkg.github.com/RehanSaeed/index.json -UserName $(GitHubUserName) -Password $(GitHubPersonalAccessToken)
            displayName: 'NuGet Add Source'
            failOnStderr: true
          - script: nuget push $(Agent.BuildDirectory)\Windows\*.nupkg -Source GitHub -SkipDuplicate
            displayName: 'NuGet Push'
            failOnStderr: true
  - deployment: NuGet
    pool:
      vmImage: windows-latest
    environment: 'NuGet'
    condition: startsWith(variables['Build.sourceBranch'], 'refs/tags/')
    strategy:
      runOnce:
        deploy:
          steps:
          - task: NuGetToolInstaller@1
            displayName: 'Install NuGet'
          - script: nuget push $(Agent.BuildDirectory)\Windows\*.nupkg -Source https://api.nuget.org/v3/index.json -ApiKey $(NuGetApiKey) -SkipDuplicate
            displayName: 'NuGet Push'
            failOnStderr: true

这在我签入时可以正常工作,但是当有人创建PR时,上述发布步骤将失败,因为:

  • 天蓝色工件-用户没有权限。
  • GitHub-用户无权使用秘密变量GitHubUserNameGitHubPersonalAccessToken
  • NuGet-构建不是通过Git标签运行的,因此此步骤无法运行。

是否可以从PR上安全运行Azure Artifacts和GitHub发布步骤?特别是,我不希望有人更改azure-pipelines.yml或我的Cake build build.cake文件来窃取我的秘密变量或发布自己的软件包。

如果这不可能,我想我必须跳过PR的这些步骤。我该怎么办?

1 个答案:

答案 0 :(得分:1)

  

如果这不可能?

恐怕这样做是不可能的。由于用户没有权限,因此秘密变量GitHubUserNameGitHubPersonalAccessToken。这是解决此问题的关键,如果您不想泄漏您的秘密变量,则不能绕开它。

  

我想我必须跳过PR的这些步骤。我该怎么办?

答案是肯定的。

您可以使用表达式对内置变量 Build.Reason 求值,以确定任务是否将执行的构建作为请求请求分支策略的一部分,例如:

condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))

然后当PullRequest触发构建时,这些任务将被跳过。

查看文档Conditions,了解更多详细信息。

希望这会有所帮助。