ĜîţĤüƃ / ĜîţĻàƃ çöññéçţöŕ
Ţĥé forge çöññéçţöŕ ķééþš à ŕéþöšîţöŕý'š çöñţéñţ çàüĝĥţ üþ ŵîţĥ ñöƃöđý
ŕüññîñĝ à çöḿḿàñđ. Îţ ŵàţçĥéš à ŕéþöšîţöŕý ƃŕàñçĥ. Ŵĥéñ çöñţéñţ çĥàñĝéš, îţ
çàţçĥéš ţĥé ŕéþöšîţöŕý üþ öñ ţĥé šéŕṽéŕ àñđ đéļîṽéŕš ţĥé ŕéšüļţš àš öñé öþéñ
þüļļ/ḿéŕĝé ŕéǫüéšţ, ŵĥîçĥ éṽéŕý ļàţéŕ đéļîṽéŕý üþđàţéš îñ þļàçé. Ţĥé ţŕàçķéđ
ƃŕàñçĥ çĥàñĝéš öñļý ŵĥéñ ýöü ḿéŕĝé.
Ţĥé ŕéþöšîţöŕý ñééđš ñö þîþéļîñé, ñöƃöđý îñšţàļļš à ÇĻÎ, àñđ ţĥéŕé îš ñö šçĥéđüļéđ ĵöƃ. Ţö ŕüñ ţĥé šàḿé ŵöŕķ ƒŕöḿ à đéṽéļöþéŕ'š ḿàçĥîñé, üšé ţĥé ķàþî çöññéçţöŕ. Ƃöţĥ çàñ ŕüñ šîđé ƃý šîđé àĝàîñšţ öñé þŕöĵéçţ.
Ƒöŕ à šţàţîç-ţöķéñ šéţüþ, çŕéàţé ţĥé çöññéçţöŕ ţĥŕöüĝĥ ţĥé ŵöŕķšþàçé çöññéçţöŕš ÀÞÎ (ḿàñàĝé çöññéçţöŕš þéŕḿîššîöñ), ƃéçàüšé ţĥé ŵéƃ àþþ'š àđđ-çöññéçţöŕ đîàļöĝ ļéàṽéš îţ öüţ. Ŵîţĥ ţĥé šéŕṽéŕ'š ĜîţĤüƃ Àþþ îñšţàļļéđ, ýöü ƃîñđ ŕéþöšîţöŕîéš ƒŕöḿ à þŕöĵéçţ'š Çöññéçţöŕš þàĝé (ƃéļöŵ).
Ŵĥàţ îţ šýñçš
Çöñţéñţ ƒîļéš ḿàţçĥîñĝ ţĥé çöññéçţöŕ'š ĝļöƃ patterns öñ ţĥé ţŕàçķéđ ƃŕàñçĥ.
Ţàŕĝéţ ƒîļéš ļàñđ àţ ţĥé çöñṽéñţîöñàļ þéŕ-ļöçàļé þàţĥ: à þàţĥ šéĝḿéñţ öŕ
ƒîļéñàḿé šţéḿ éǫüàļ ţö ţĥé šöüŕçé ļàñĝüàĝé ƃéçöḿéš ţĥé ţàŕĝéţ ļàñĝüàĝé
(locales/en/app.json → locales/fr/app.json); öţĥéŕ ļàýöüţš ĝéţ ţĥé ļàñĝüàĝé
šüƒƒîẋéđ ţö ţĥé šţéḿ.
Ŵĥéñ à ŕüñ ļéàṽéš ŵöŕķ ŵàîţîñĝ ƒöŕ ŕéṽîéŵ, ţĥé þüļļ/ḿéŕĝé ŕéǫüéšţ šàýš šö. Àþþŕöṽàļš ḿàđé îñ ţĥé þŕöĵéçţ'š ŕéṽîéŵ šéššîöñ àŕŕîṽé îñ à ļàţéŕ đéļîṽéŕý.
Šéţüþ ŵîţĥ à ţöķéñ
Çŕéàţé ţĥé çöññéçţöŕ, ţĥéñ þöîñţ à ŵéƃĥööķ àţ ţĥé šéŕṽéŕ:
curl -X POST "$SERVER/api/v1/$WORKSPACE/connectors" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"type": "forge",
"name": "website",
"config": {
"repo": "https://github.com/acme/website.git",
"branch": "main",
"project_id": "<project-id>",
"token": "<forge API token>",
"webhook_secret": "<random secret>",
"patterns": "src/locales/**/*.json"
}
}'
Ţĥéñ àđđ à þüšĥ ŵéƃĥööķ îñ ţĥé ŕéþöšîţöŕý šéţţîñĝš þöîñţîñĝ àţ
$SERVER/api/webhooks/forge/<connector-id> ŵîţĥ ţĥé šàḿé šéçŕéţ. ĜîţĤüƃ šîĝñš
ţĥé þàýļöàđ (šéçŕéţ ƒîéļđ), ĜîţĻàƃ šéñđš îţ àš ţĥé šéçŕéţ ţöķéñ. Ţĥé ţöķéñ ñééđš
þüļļ/ḿéŕĝé-ŕéǫüéšţ ŵŕîţé àççéšš: à ĜîţĤüƃ ƒîñé-ĝŕàîñéđ ÞÀŢ ŵîţĥ çöñţéñţš +
þüļļ-ŕéǫüéšţš ŵŕîţé, öŕ à ĜîţĻàƃ þŕöĵéçţ àççéšš ţöķéñ ŵîţĥ àþî šçöþé.
Öþţîöñàļ çöñƒîĝ: forge (github | gitlab; đéƒàüļţ îñƒéŕŕéđ ƒŕöḿ ţĥé ŕéþö
ĥöšţ, šéļƒ-ḿàñàĝéđ ĜîţĻàƃ îñçļüđéđ), delivery_branch (đéƒàüļţ
bowrain/translations), pr_title, pr_labels.
Çŕéđéñţîàļš àŕé éñçŕýþţéđ àţ ŕéšţ ļîķé éṽéŕý çöññéçţöŕ šéçŕéţ. Ţĥé çöññéçţöŕ îĝñöŕéš þüšĥéš ţö öţĥéŕ ƃŕàñçĥéš, îñçļüđîñĝ ţĥé đéļîṽéŕý ƃŕàñçĥ, šö îţš öŵñ đéļîṽéŕîéš ñéṽéŕ šţàŕţ àñöţĥéŕ ŕüñ.
ĜîţĤüƃ Àþþ ḿöđé (ñö ţöķéñš, ñö þéŕ-ŕéþö ŵéƃĥööķš)
Ŵîţĥ à ĜîţĤüƃ Àþþ ŕéĝîšţéŕéđ ƒöŕ ýöüŕ šéŕṽéŕ, çöññéçţöŕš öñ ĜîţĤüƃ ñééđ ñéîţĥéŕ à ţöķéñ ñöŕ à ŵéƃĥööķ šéçŕéţ. ĜîţĤüƃ ŕöüţéš éṽéŕý îñšţàļļéđ ŕéþöšîţöŕý'š þüšĥéš ţö öñé àþþ éñđþöîñţ, àñđ ţĥé šéŕṽéŕ ḿîñţš šĥöŕţ-ļîṽéđ þéŕ-îñšţàļļàţîöñ ţöķéñš ƒöŕ éàçĥ đéļîṽéŕý:
{
"type": "forge",
"name": "website",
"config": {
"repo": "https://github.com/acme/website.git",
"branch": "main",
"project_id": "<project-id>",
"auth": "app",
"patterns": "src/locales/**/*.json"
}
}
Ŕéĝîšţéŕ ţĥé àþþ öñçé (ĜîţĤüƃ → Šéţţîñĝš → Đéṽéļöþéŕ šéţţîñĝš → ĜîţĤüƃ Àþþš →
Ñéŵ) ŵîţĥ ŵéƃĥööķ ÜŔĻ $SERVER/api/webhooks/github-app, à ŵéƃĥööķ šéçŕéţ,
ţĥé þüšĥ éṽéñţ, àñđ ŕéþöšîţöŕý þéŕḿîššîöñš Çöñţéñţš: ŕéàđ & ŵŕîţé,
Þüļļ ŕéǫüéšţš: ŕéàđ & ŵŕîţé, Ḿéţàđàţà: ŕéàđ. Đöŵñļöàđ ţĥé þŕîṽàţé ķéý
àñđ çöñƒîĝüŕé ţĥé šéŕṽéŕ:
GITHUB_APP_ID=<app id>
GITHUB_APP_PRIVATE_KEY_FILE=/etc/bowrain/github-app.pem # or GITHUB_APP_PRIVATE_KEY (PEM text)
GITHUB_APP_WEBHOOK_SECRET=<webhook secret>
GITHUB_API_URL=https://<host>/api/v3 # GitHub Enterprise Server only; omit for github.com
Ţĥé öñļý þéŕ-ŕéþöšîţöŕý šţéþ îš ţĥéñ ţö îñšţàļļ ţĥé àþþ öñ ţĥé ŕéþöšîţöŕý.
ĜîţĤüƃ ŕéđîŕéçţš ţö ţĥé šéŕṽéŕ'š šéţüþ þàĝé (šéţ ţĥé àþþ'š Šéţüþ ÜŔĻ ţö
$SERVER/github/setup). Ţĥé þàĝé ļîšţš ţĥé îñšţàļļàţîöñ'š ŕéþöšîţöŕîéš, àñđ
öñé šéļéçţîöñ ƃîñđš éàçĥ ţö à þŕöĵéçţ, ŵîţĥ ñö çüŕļ àñđ ñö ţöķéñš.
À ṽîšîţöŕ ŵĥö àŕŕîṽéš àţ ţĥé šéţüþ þàĝé ŵîţĥöüţ à Ƃöŵŕàîñ àççöüñţ šîĝñš îñ öŕ çŕéàţéš öñé, àñđ ţĥé îñšţàļļàţîöñ îš ķéþţ ţĥŕöüĝĥ ļöĝîñ. Ţĥéý ĝéţ à ŵöŕķšþàçé îƒ ţĥéý ĥàṽé ñöñé, àñđ çàñ çŕéàţé à þŕöĵéçţ ƒŕöḿ ţĥé ŕéþöšîţöŕý öñ ţĥé šàḿé þàĝé. À þŕöĵéçţ'š Çöññéçţöŕš þàĝé ("ĜîţĤüƃ") öƒƒéŕš ţĥé šàḿé ƃîñđîñĝ, àñđ ţĥé ŵöŕķšþàçé çöññéçţöŕš ÀÞÎ çöṽéŕš àüţöḿàţîöñ.
Šţàţîç ţöķéñš ķééþ ŵöŕķîñĝ àļöñĝšîđé àþþ ḿöđé. ĜîţĻàƃ àļŵàýš üšéš à þŕöĵéçţ àççéšš ţöķéñ.
Šéé Ţĥé Ƃöŵŕàîñ ĜîţĤüƃ Àþþ ƒöŕ ţĥé éñđ-ţö-éñđ ŵàļķţĥŕöüĝĥ.
Ŕéļàţéđ
- Çöññéçţöŕš: ţĥé ƒüļļ çöññéçţöŕ ŕöŵ
- ķàþî çöññéçţöŕ: ţĥé šàḿé ŕéþöšîţöŕý, đŕîṽéñ ƃý à đéṽéļöþéŕ
- Ķééþîñĝ çöñţéñţ çàüĝĥţ üþ: ŵĥàţ à đéļîṽéŕý çöñţàîñš