GitHub bietet mit GitHub Packages eine limitiert kostenfreie Alternative zu den sonst kostenpflichtigen privaten npm Packages an. Allerdings habe ich lange nach einem Weg suchen müssen, private GitHub Packages in GitHub Actions zu verwenden.
npm login
kann man nicht so einfach ausführen, weil der Personal access token eingegeben werden muss und nicht über einen Parameter übergeben werden, kann und der secrets.GITHUB_TOKEN
nicht ausreicht, um private GitHub Packages über npm install
zu laden.
Meine Lösung für das Problem:
1. Eigene .npmrc-Datei für GitHub Actions
Als Erstes müssen wir für GitHub Actions eine eigene .npmrc
-Datei erstellen, damit sich die nicht mit unserer bestehenden .npmrc
-Datei beißt, nennen wir sie .npmrc.githubactions
und benennen sie später um, wenn wir sie benötigen.
Die .npmrc
-Datei sorgt dafür, dass npm
für euren privaten Scope, meiner lautet z.B. @goaround
nicht wie sonst üblich mit registry.npmjs.org
spricht, sondern mit npm.pkg.github.com
. Dabei autorisieren wir uns mit unserem authToken
, den wir im zweiten Schritt erstellen.
Kopiert folgendes Snippet in eure .npmrc.githubactions
und ersetzt myownscope
durch euren eigenen GitHub-Scope:
@myownscope:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}
Code-Sprache: JavaScript (javascript)
2. GitHub Action modifizieren
In eurer yml-Datei für den Workflow (findet ihr in /.github/workflows
) müsst ihr jetzt einige Modifikationen vornehmen, damit die .npmrc.githubactions
bei npm install
verwendet und die Variable ${GITHUB_TOKEN}
gesetzt wird.
Bevor ihr npm install
ausführt, überschreibt ihr mit .npmrc.githubactions
die bestehende .npmrc
und zusätzlich definiert ihr für diesen Schritt noch die Variable GITHUB_TOKEN
mit eurem PERSONAL_GITHUB_TOKEN
:
- name: Install npm dependencies
run: |
mv .npmrc.githubactions .npmrc
npm install --silent
env:
GITHUB_TOKEN: ${{secrets.PERSONAL_GITHUB_TOKEN}}
Code-Sprache: YAML (yaml)
3. Personal Access Token erstellen
Damit das Ganze auch funktioniert, müssen wir noch einen Personal access token mit den entsprechenden Berechtigungen erstellen. Geht dafür auf github.com/settings/tokens und klickt auf Generate new token. Anschließend wählt einen verständlichen Namen z.B. GitHub Actions mypackage, wählt als Expiration am besten No expiration aus (sonst werdet ihr euch irgendwann wundern, warum eurer Workflow nicht mehr durchläuft) und unter Select scopes klicken wir repo und read:packages an.
Mit einem Klick auf Generate token wird der Token erstellt und euch einmalig angezeigt. Kopiert ihn und geht zurück in die GitHub Repository und fügt ihn unter Settings → Security → Secrets → Actions als Repository Secret unter dem Namen PERSONAL_GITHUB_TOKEN hinzu:
Fertig
Anschließend sollte euer Workflow durchlaufen und auch das bei GitHub Packages abgelegte private Paket installieren können.