How to pass Azure Auth when Deploying NuGet Package via Nuke.Common/NuGet.CommandLine

1k Views Asked by At

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?

1

There are 1 best solutions below

1
On BEST ANSWER

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.