3

I'm attempting to automate NuGet Package updates through Nuke and CI/CD on Azure DevOps. Everything is building just fine, but during the PushNuGet step, the process tries to authenticate with Azure via a pop-up window, which is obviously never rendered [in devops] or answered

class Build : NukeBuild
{
    /// Support plugins are available for:
    ///   - JetBrains ReSharper        https://nuke.build/resharper
    ///   - JetBrains Rider            https://nuke.build/rider
    ///   - Microsoft VisualStudio     https://nuke.build/visualstudio
    ///   - Microsoft VSCode           https://nuke.build/vscode

    public static int Main () => Execute<Build>(x => x.PushNuGet);

    [Parameter("Configuration to build - Default is 'Debug' (local) or 'Release' (server)")]
    readonly Configuration Configuration = IsLocalBuild ? Configuration.Debug : Configuration.Release;

    [Solution] readonly Solution Solution;
    [GitRepository] readonly GitRepository GitRepository;

    AbsolutePath SourceDirectory => RootDirectory / "src";
    AbsolutePath TestsDirectory => RootDirectory / "tests";
    AbsolutePath ArtifactsDirectory => RootDirectory / "artifacts";

    string VersionNumber = "1.0.2";

    Target Clean => _ => _
        .Executes(() =>
        {
            SourceDirectory.GlobDirectories("**/bin", "**/obj").ForEach(DeleteDirectory);
            TestsDirectory.GlobDirectories("**/bin", "**/obj").ForEach(DeleteDirectory);
            EnsureCleanDirectory(ArtifactsDirectory);
        });

    Target Restore => _ => _
        .DependsOn(Clean)
        .Executes(() =>
        {
            DotNetRestore(s => s
                .SetProjectFile(Solution));
        });

    Target Compile => _ => _
        .DependsOn(Restore)
        .Executes(() =>
        {
            DotNetBuild(s => s
                .SetProjectFile(Solution)
                .SetConfiguration(Configuration)
                .EnableNoRestore());
        });

    Target Pack => _ => _
        .DependsOn(Compile)
        .Executes(() =>
        {
            DotNetPack(s => s
                .SetProject(RootDirectory + "\\Fuze.Models\\Fuze.Models.csproj")
                .SetNoBuild(true)
                .SetConfiguration(Configuration)    
                .SetVersion(VersionNumber)
            );
        });

    Target AddSource => _ => _
       .DependsOn(Pack)
       .Executes(() =>
       {
            var sourceUrl = "https://pkgs.dev.azure.com/DataFuzionHCM/_packaging/DataFuzionHCM/nuget/v3/index.json";
            var sourceName = "DataFuzionHCM";
            var sources = NuGetTasks.NuGetSourcesList();
            if(sources.Any(source => source.Text.Contains(sourceName)))
            {
               NuGetTasks.NuGetSourcesRemove(s => s.SetName(sourceName));
            }
            NuGetTasks.NuGetSourcesAdd(s => s
                .SetName(sourceName)
                .SetSource(sourceUrl)
                .SetUserName("NuGet Feed Token")
                .SetPassword("fakepassword")
            );
       });

    Target PushNuGet => _ => _
        .DependsOn(AddSource)
        .Executes(() =>
        {
            NuGetTasks.NuGetPush(s => s
                .SetSource("DataFuzionHCM")
                .SetApiKey("az")
                .SetTargetPath(RootDirectory + $"/FUZE.Models/bin/debug/Fuze.Models.{VersionNumber}.nupkg")
            );
        });
}

On the Azure Build Pipeline, During the last step, it can be seen in the job log that it's getting stuck on some auth window with azure.

Using credentials from config. UserName: NuGet Feed Token
    [CredentialProvider]Using the ADAL UI  flow for uri https://pkgs.dev.[hidden]ure.com/DataFuzionHCM/_packaging/DataFuzionHCM/nuget/v3/index.json. User sign-in required in a pop-up authentication window.
    [CredentialProvider]Using the ADAL UI  flow for uri https://pkgs.dev.[hidden]ure.com/DataFuzionHCM/_packaging/DataFuzionHCM/nuget/v3/index.json. User sign-in required in a pop-up authentication window.
    [CredentialProvider]Using the ADAL UI  flow for uri https://pkgs.dev.[hidden]ure.com/DataFuzionHCM/_packaging/DataFuzionHCM/nuget/v3/index.json. User sign-in required in a pop-up authentication window.
##[error]Unable to load the service index for source https://pkgs.dev.[hidden]ure.com/DataFuzionHCM/_packaging/DataFuzionHCM/nuget/v3/index.json.
##[error]  The HTTP request to 'GET https://pkgs.dev.[hidden]ure.com/DataFuzionHCM/_packaging/DataFuzionHCM/nuget/v3/index.json' has timed out after 100000ms.
##[error]Process 'NuGet.exe' exited with code 1.

Is there a method to programmatically authenticate with Azure so it doesn't hang and timeout at the popup-auth?

Chris Phillips
  • 1,997
  • 2
  • 19
  • 34
  • Hi, Could you check the proxy settings into Nuget.Config file and then share the result here? Refer to this link for details: [Nuget Config Section](https://learn.microsoft.com/en-us/nuget/reference/nuget-config-file#config-section) and [Nuget Proxy Settings](http://skolima.blogspot.com/2012/07/nuget-proxy-settings.html). By the way, what happens if you run locally? – Vito Liu Oct 09 '20 at 10:40
  • When I ran it locally, a prompt window would appear for me to auth to azure. Entering my personal credentials allowed the request to pass - I posted the resolution to my answer below. – Chris Phillips Oct 09 '20 at 17:21

1 Answers1

3

It turns out that the password for the NuGet feed was expired, so when auth failed, it prompted for auth instead of throwing an auth error. I went into DevOps and updated the expiration date on the password and, from there, everything worked fine.

I do find it odd that instead of throwing an auth error, it instead asks for a password from the local user on a separate window. Perhaps automation wasn't something that was taken into account when the API's for updating NuGet packages were designed.

Chris Phillips
  • 1,997
  • 2
  • 19
  • 34
  • Hi @Chris Phillips, Thanks for your sharing, you could accept your answer. In this case, others could directly find the useful solution. Thanks – Vito Liu Oct 14 '20 at 07:42