Skip to content

Instantly share code, notes, and snippets.

@dennisdoomen
Last active November 12, 2021 11:03
Show Gist options
  • Save dennisdoomen/e2f7d2f0d8490f6fc7be6a2ee8ecfe52 to your computer and use it in GitHub Desktop.
Save dennisdoomen/e2f7d2f0d8490f6fc7be6a2ee8ecfe52 to your computer and use it in GitHub Desktop.
Nuke script to build and push an NPM package
using System;
using System.IO;
using System.Linq;
using System.Text;
using Microsoft.VisualBasic;
using Nuke.Common;
using Nuke.Common.CI;
using Nuke.Common.Execution;
using Nuke.Common.IO;
using Nuke.Common.ProjectModel;
using Nuke.Common.Tooling;
using Nuke.Common.Tools.GitVersion;
using Nuke.Common.Tools.Npm;
using Nuke.Common.Utilities.Collections;
using static Nuke.Common.EnvironmentInfo;
using static Nuke.Common.IO.FileSystemTasks;
using static Nuke.Common.IO.PathConstruction;
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.NpmPush);
[GitVersion(NoFetch = true, UpdateBuildNumber = true, Framework = "net5.0")]
readonly GitVersion GitVersion;
[Parameter]
readonly string NpmCiFeed = "//company.jfrog.io/company/api/npm/dev-npm-ci/";
[Parameter]
readonly string NpmReleaseFeed = "//company.jfrog.io/company/api/npm/dev-npm-release/";
[Parameter]
readonly string NpmFeedUsername;
[Parameter]
readonly string NpmFeedPassword;
[Parameter("A branch specification, like refs/tags/1.0.0")]
readonly string BranchSpec = "";
AbsolutePath ArtifactsDirectory => RootDirectory / "artifacts";
AbsolutePath SourceDirectory => RootDirectory / "src";
Target Clean => _ => _
.Executes(() =>
{
EnsureCleanDirectory(ArtifactsDirectory);
});
Target ConfigureNpm => _ => _
.OnlyWhenStatic(() => !string.IsNullOrWhiteSpace(NpmFeedUsername))
.OnlyWhenStatic(() => !string.IsNullOrWhiteSpace(NpmFeedPassword))
.Executes(() =>
{
string npmFeed = BranchSpec.Contains("refs/tags/") ? NpmReleaseFeed : NpmCiFeed;
var base64Password = Convert.ToBase64String(Encoding.UTF8.GetBytes(NpmFeedPassword));
string contents = $@"
@evision:registry=https:{npmFeed}
{npmFeed}:_password={base64Password}
{npmFeed}:username={NpmFeedUsername}
{npmFeed}:email=prod-ops@mycompany.com
{npmFeed}:always-auth=true
";
File.WriteAllText(SourceDirectory / ".npmrc", contents);
});
Target NpmPack => _ => _
.DependsOn(Clean)
.Executes(() =>
{
EnsureExistingDirectory(ArtifactsDirectory);
NpmTasks.Npm($"version {GitVersion.FullSemVer} --allow-same-version", SourceDirectory);
NpmTasks.Npm($"pack {SourceDirectory} --loglevel=warn", ArtifactsDirectory);
});
Target NpmPush => _ => _
.DependsOn(NpmPack)
.DependsOn(ConfigureNpm)
.OnlyWhenStatic(() => !string.IsNullOrWhiteSpace(NpmFeedUsername))
.OnlyWhenStatic(() => !string.IsNullOrWhiteSpace(NpmFeedPassword))
.Executes(() =>
{
NpmTasks.Npm($"publish", SourceDirectory);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment