Delta-NPrivate package hosting met Azure DevOps
NPMNPM is een van de meest gebruikte package managers van dit moment. Door de eenvoudige installatie en de implementatie van een goed verzorgd versioning systeem kunnen veel developers bijna niet meer zonder. Het is een geweldige tool om open-source packages binnen te halen, maar ook om eigen packages te uploaden. Soms is het echter niet wenselijk dat deze packages publiekelijk beschikbaar zijn. Helaas biedt npm deze functionaliteit alleen tegen betaling, maar er is een alternatief: Azure DevOps!

Azure DevOps en NPM

Bij Azure DevOps is namelijk ook goed nagedacht over de ondersteuning van npm-feeds. Hiermee kan een private library eenvoudig gedeeld worden over de verschillende projecten die op Azure DevOps worden gehost. Daarnaast zitten er in Azure DevOps nog een paar extra snufjes die het gebruik maken van een npm-feed extra veilig maken. Zo word er een token veilig lokaal opgeslagen op de computer van de developer, in plaats van een configuratiefile (.npmrc) die bij de repository wordt ingecheckt. De rechten worden ook intern beheerd door Azure Devops. Hierdoor is de package volledig afgeschermd van de personen die hier niets te zoeken hebben. Wanneer een medewerker bijvoorbeeld uit dienst gaat, zal deze persoon geen toegang meer hebben om de package te downloaden.

Azure DevOpsOm een library te delen moet er allereerst een project in Azure DevOps worden aangemaakt. Bijvoorbeeld een project genaamd ‘Common-components’ om een paar herbruikbare Angular componenten te delen over verschillende projecten, maar dit kan van alles zijn. Onder het tabje ‘Artifacts’ in het menu aan de linkerzijde kan er een feed aangemaakt worden. In dat menu kunnen andere basis-instellingen worden geconfigureerd. Denk hierbij aan bijvoorbeeld wie er toegang tot de feed moet krijgen, maar ook de optie om publieke npm packages via Azure DevOps te laten lopen. Hierdoor wordt een extra stuk zekerheid gecreëerd wanneer een afhankelijk package wordt verwijderd of wanneer een externe stream opeens down is.

Daarna zal de gemaakte library gepubliceerd moeten worden naar de stream. Dit kan heel eenvoudig gedaan worden door ’npm publish’ aan te roepen. Hiervoor moet de gebruiker wel de juiste rechten hebben op Azure DevOps. Ook kan de publish-functie aangeroepen worden in een pipelijn, waardoor automatisch versiebeheer makkelijk in te stellen is. Om deze stap te kunnen uitvoeren, moeten er nog een paar verbindingen worden gelegd door middel van een tool.

Nu de private NPM package is gepubliceerd naar de stream in Azure DevOps, is deze klaar om gebruikt te worden in de projecten. Om met deze feed/stream te verbinden, moet de gebruiker allereerst toegang hebben tot de artifacts van het project. Deze zijn meestal al bij het aanmaken van de stream gedefinieerd. De gebruiker moet hierna met de vsts-npm-auth tool inloggen om de credentials op te slaan. Deze tool kan makkelijk via npm global worden geïnstalleerd op de laptop van de gebruiker met de command ‘’npm install -g vsts-npm-auth –registry https://registry.npmjs.com –always-auth false‘’. Dit command is ook terug te vinden bij de gedetailleerde beschrijving op Azure DevOps.

Vervolgens moet er een configuratie file (.npmrc) worden toegevoegd aan de repositories van de gebruikmakende projecten. Het is voor de CI/CD van het project eenvoudiger om dit binnen de zelfde organisatie te doen, maar dit is niet benodigd. Indien de package vanuit een andere organisatie moet worden bereikt is er ook een mogelijkheid een security token handmatig aan te maken en toe te voegen aan het configuratie bestand. Als het project in dezelfde organisatie staat, dan is deze vorm van authenticatie namelijk niet nodig. Hier zorgt Azure DevOps helemaal zelf voor. In het configuratie-bestand moet nog naar de aangemaakte feed worden verwezen. Hiervoor moet de volgende regel worden toegevoegd aan het bestand:

‘registry=https://pkgs.dev.azure.com/{organisatie}/_packaging/{feed_naam}/npm/registry/
always-auth=true’Hiermee laat men node weten dat de volgende stream moet worden gebruikt voor het ophalen van packages binnen dat project. Omdat we gebruikmaken van de vsts-npm-auth tool hoeven hier verder geen credentials te worden opgeslagen in de source-code; iets wat bij veel andere externe streams wel het geval is. Ten slotte moet de gebruiker de credentials ophalen door gebruik te maken van de tool. Simpelweg ‘vsts-npm-auth -config .npmrc’ aanroepen is voldoende. De gebruiker zal hier gevraagd worden in te loggen met Azure DevOps. Het token wordt lokaal opgeslagen en is maximaal 30 dagen geldig. Een gebruiker zal zich dan met de tool opnieuw moeten inloggen.De private package kan nu als elk ander NPM-package gebruikt worden door deze toe te voegen aan het package JSON-bestand.

Met Azure DevOps is het mogelijk om veilig en zonder extra kosten Private NPM package te hosten. De instructies in deze blog waren specifiek voor het opzetten van een NPM-stream, maar er zijn nog vele andere package managers die ondersteund worden door Azure DevOps. Zo worden ook populaire alternatieven als NuGet, Gradle, Maven, en Pip ondersteund.

Private package hosting met Azure DevOps

Giovanni Paul – Software Developer