Brug fremforges registries fra GitHub Actions og OpenShift
Oversat fra den engelske original. Hvis de to versioner er forskellige, gælder den engelske. Oversættelsen er endnu ikke korrekturlæst af en dansk modersmålsbruger.
Din kildekode og CI kan blive på GitHub og dine clusters på OpenShift, mens pakkerne ligger i din fremforge-organisation. Begge når registryet gennem en registry robot: et login, der tilhører organisationen og ikke en person.
En registry robot:
- læser, eller læser og udgiver, pakkerne i én organisation, af alle pakketyper;
- kan ikke læse kode, åbne webbrugerfladen eller nå nogen anden organisation;
- optager ingen plads;
- udløber senest efter 365 dage, hvorefter den og alle dens tokens holder op med at virke;
- står, sammen med hvem der har oprettet den, under Administration → Sikkerhed → Adgang → Registry-robotter, og hver oprettelse, rotation og sletning står i organisationens revisionslog.
I fremforges egen CI har du ikke brug for en: et Forgejo Actions-job har allerede et token til sin egen organisations pakker. Se Udgivelse fra Forgejo Actions.
Opret en robot
I konsollen: Administration → Sikkerhed → Adgang → Registry-robotter → Opret en robot. Vælg Læse pakker til et pull secret og Læse og udgive pakker til et CI-job, der udgiver.
Siden viser derefter robottens brugernavn og token én gang. Kopiér begge; tokenet vises ikke igen. Mister du det, udsteder Rotér token et nyt og tilbagekalder det gamle med det samme.
Eller med API’et, med et API-token, der har scopet policy:write:
curl -sS -X POST "https://frem.sh/_app/api/v1/orgs/<org>/registry-robots" \
-H "Authorization: Bearer $FREMFORGE_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "github-publish", "access": "write", "expires_in_days": 90}'Svaret indeholder username og token. access er read eller write, og
expires_in_days er 1 til 365 (standard 90). Rotér med
POST /orgs/<org>/registry-robots/<id>/rotate, eventuelt med {"expires_in_days": n} for at sætte en
ny udløbsdato, og slet med DELETE /orgs/<org>/registry-robots/<id>.
Brugernavnet har formen <org>-fremforge-bot-reg-<8 hex characters>. Alle klienterne nedenfor tager
det som brugernavn og tokenet som adgangskode.
GitHub Actions
Gem robotten i GitHub-repositoryet eller -organisationen: brugernavnet som variablen
FREMFORGE_REGISTRY_USER og tokenet som secret’en FREMFORGE_REGISTRY_TOKEN. Sæt ORG til din
fremforge-organisation.
Container-images
- name: Push to fremforge
env:
FREMFORGE_USER: ${{ vars.FREMFORGE_REGISTRY_USER }}
FREMFORGE_TOKEN: ${{ secrets.FREMFORGE_REGISTRY_TOKEN }}
ORG: <org>
run: |
echo "$FREMFORGE_TOKEN" | docker login frem.sh -u "$FREMFORGE_USER" --password-stdin
docker build -t "frem.sh/$ORG/app:$GITHUB_SHA" .
docker push "frem.sh/$ORG/app:$GITHUB_SHA"Pull på samme måde, med docker pull frem.sh/<org>/app:<tag>. Et pushet tag kan ikke overskrives,
når uforanderlige releases er slået til for organisationen.
npm
npm sender kun et token til en registry-URL, der matcher præcist, så giv den scopets registry og tokenet til netop den URL:
- name: Publish to fremforge
env:
FREMFORGE_TOKEN: ${{ secrets.FREMFORGE_REGISTRY_TOKEN }}
ORG: <org>
run: |
printf '@<scope>:registry=https://frem.sh/api/packages/%s/npm/\n//frem.sh/api/packages/%s/npm/:_authToken=%s\n' \
"$ORG" "$ORG" "$FREMFORGE_TOKEN" > .npmrc
npm publishDen samme .npmrc installerer @<scope>/…-pakker med npm install.
PyPI
- name: Publish to fremforge
env:
FREMFORGE_USER: ${{ vars.FREMFORGE_REGISTRY_USER }}
FREMFORGE_TOKEN: ${{ secrets.FREMFORGE_REGISTRY_TOKEN }}
ORG: <org>
run: |
python -m pip install twine
twine upload --repository-url "https://frem.sh/api/packages/$ORG/pypi" \
-u "$FREMFORGE_USER" -p "$FREMFORGE_TOKEN" dist/*Installér med robottens legitimation i indeks-URL’en:
pip install --index-url "https://$FREMFORGE_USER:$FREMFORGE_TOKEN@frem.sh/api/packages/$ORG/pypi/simple/" <package>Maven
Tilføj en server med det id, din pom.xml bruger til fremforge-repositoryet, og læs robotten fra
miljøet:
<settings>
<servers>
<server>
<id>fremforge</id>
<username>${env.FREMFORGE_USER}</username>
<password>${env.FREMFORGE_TOKEN}</password>
</server>
</servers>
</settings>- name: Publish to fremforge
env:
FREMFORGE_USER: ${{ vars.FREMFORGE_REGISTRY_USER }}
FREMFORGE_TOKEN: ${{ secrets.FREMFORGE_REGISTRY_TOKEN }}
run: mvn --batch-mode -s .ci/settings.xml deploymed repositoryet i pom.xml som under Maven:
https://frem.sh/api/packages/<org>/maven.
Uden et gemt secret: GitHubs OIDC-token
En robot kan også acceptere GitHub Actions’ eget OIDC-token i stedet for et gemt registry-token. Giv
robotten din GitHub-organisations (eller -brugers) numeriske id og eventuelt ét repository under
GitHub Actions på robotten, eller med github_repository_owner_id og github_repository i
API’et. Et job hos den ejer beder derefter om sit OIDC-token med audience https://frem.sh/<org>
(permissions: id-token: write) og veksler det på POST https://frem.sh/_app/api/v1/registry/oidc-token
(org, robot, id_token) til robottens brugernavn og et token, der gælder i 1 time. Vekslingen er
beskrevet i API-referencen under Registry robots; hvert token, den udsteder, står i
revisionsloggen med repository, ref og run-id.
SBOM’er
SBOM’er sendes til fremforges API, ikke til registryet, med et API-token, der har scopet sboms:write.
Se Upload SBOMs from GitHub Actions.
OpenShift og Kubernetes
Hent images fra fremforge med en robot med læseadgang som image pull secret:
kubectl create secret docker-registry frem-sh \
--docker-server=frem.sh \
--docker-username=<robot username> \
--docker-password=<robot token> \
--namespace=<namespace>og henvis til det fra workloaden:
spec:
imagePullSecrets:
- name: frem-sh
containers:
- name: app
image: frem.sh/<org>/app:1.4.2OpenShift læser det samme kubernetes.io/dockerconfigjson-secret. Rotér robotten, før den
udløber, og erstat secret’et med et nyt, lavet ud fra det nye token.
Hosts, der skal åbnes i en egress-firewall
| Host | Port | Bruges til |
|---|---|---|
frem.sh | 443 | Alle registry-forespørgsler: logins, indekser, uploads samt manifester og lag til container-images |
obs.eu-de.otc.t-systems.com | 443 | Download af andre pakkefiler end container-images: npm-tarballs, wheels, JAR-filer og så videre |
En download af en anden pakkefil end et container-image svarer 303 med et kortlivet signeret
link til filen i object storage på obs.eu-de.otc.t-systems.com, som klienten følger.
Det navn er et CNAME for obs.lz01.eu-de.otc.t-systems.com, så en firewall, der tjekker hvert navn i
kæden, skal have begge. Lagene i container-images serveres af frem.sh selv.
frem.sh serveres gennem et CDN, så adresserne skifter: tillad den ved navn, ikke ved IP-adresse.
Dependency-proxy
En pull-through-cache for Docker Hub, npm, PyPI og andre offentlige registries, som bruges gennem den samme robot, kommer efter 6. november 2026.