ĜîţĤüƃ / ĜîţĻàƃ çöññéçţöŕ
Ţĥé forge çöññéçţöŕ îš à çöđé çöññéçţöŕ. Îţ ŵàţçĥéš à ŕéþöšîţöŕý ƃŕàñçĥ, àñđ
ŵĥéñ çöñţéñţ çĥàñĝéš îţ çàţçĥéš ţĥé ŕéþöšîţöŕý üþ öñ ţĥé šéŕṽéŕ àñđ đéļîṽéŕš ţĥé
ŕéšüļţš àš öñé öþéñ þüļļ/ḿéŕĝé ŕéǫüéšţ ţĥàţ éṽéŕý ļàţéŕ đéļîṽéŕý üþđàţéš îñ
þļàçé, ñéṽéŕ à đîŕéçţ þüšĥ ţö ţĥé ţŕàçķéđ ƃŕàñçĥ.
Ţĥîš îš ţĥé ŕöüţé ƒöŕ à ţéàḿ ţĥàţ ŵàñţš à ŕéþöšîţöŕý ĝöṽéŕñéđ ŵîţĥöüţ àñýöñé ŕüññîñĝ à çöḿḿàñđ. Ţĥéŕé îš ñö þîþéļîñé îñ ţĥé ŕéþöšîţöŕý, ñö ÇĻÎ öñ àñýöñé'š ḿàçĥîñé, àñđ ñö šçĥéđüļéđ ĵöƃ. Ţĥé àļţéŕñàţîṽé ƒöŕ à ŕéþöšîţöŕý îš ţĥé kapi çöññéçţöŕ, ŵĥîçĥ þüţš ţĥé šàḿé ŵöŕķ üñđéŕ à đéṽéļöþéŕ'š öŵñ ĥàñđ. Ƃöţĥ çàñ ŕüñ šîđé ƃý šîđé àĝàîñšţ öñé þŕöĵéçţ.
Ţĥé ƒöŕĝé çöññéçţöŕ îš ñöţ öƒƒéŕéđ îñ ţĥé ŵéƃ àþþ'š àđđ-çöññéçţöŕ đîàļöĝ ƒöŕ šţàţîç-ţöķéñ šéţüþš. Çŕéàţé îţ ţĥŕöüĝĥ ţĥé ŵöŕķšþàçé çöññéçţöŕš ÀÞÎ (ḿàñàĝé çöññéçţöŕš þéŕḿîššîöñ), öŕ îñšţàļļ ţĥé šéŕṽéŕ'š ĜîţĤüƃ Àþþ àñđ ƃîñđ ŕéþöšîţöŕîéš ƒŕöḿ à þŕöĵéçţ'š Çöññéçţöŕš þàĝé (ƃéļöŵ).
Ŵĥàţ îţ šýñçš
Çöñţéñţ ƒîļéš ḿàţçĥîñĝ ţĥé çöññéçţöŕ'š ĝļöƃ 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>
Îñšţàļļîñĝ ţĥé àþþ öñ à ŕéþöšîţöŕý îš ţĥéñ ţĥé öñļý þéŕ-ŕéþö šţéþ. ĜîţĤüƃ
ŕéđîŕéçţš ţö ţĥé šéŕṽéŕ'š šéţüþ þàĝé (šéţ ţĥé àþþ'š Šéţüþ ÜŔĻ ţö
$SERVER/github/setup), ŵĥîçĥ ļîšţš ţĥé îñšţàļļàţîöñ'š ŕéþöšîţöŕîéš àñđ ƃîñđš
éàçĥ ţö à þŕöĵéçţ ŵîţĥ öñé šéļéçţîöñ: ñö çüŕļ, ñö ţöķéñš. Ţĥé šéţüþ þàĝé îš à
çöḿþļéţé öñ-ŕàḿþ: à ṽîšîţöŕ ŵĥö àŕŕîṽéš ŵîţĥöüţ à Bowrain àççöüñţ šîĝñš îñ öŕ
çŕéàţéš öñé (ţĥé îñšţàļļàţîöñ îš þŕéšéŕṽéđ ţĥŕöüĝĥ ļöĝîñ), ĝéţš à ŵöŕķšþàçé îƒ
ţĥéý ĥàṽé ñöñé, àñđ çàñ çŕéàţé à þŕöĵéçţ ƒŕöḿ ţĥé ŕéþöšîţöŕý îñļîñé. Ţĥé šàḿé
ƃîñđîñĝ îš àṽàîļàƃļé ƒŕöḿ à þŕöĵéçţ'š Çöññéçţöŕš þàĝé ("ĜîţĤüƃ"), àñđ ţĥé
ŵöŕķšþàçé çöññéçţöŕš ÀÞÎ ŕéḿàîñš ţĥé àüţöḿàţîöñ þàţĥ.
Šţàţîç ţöķéñš ķééþ ŵöŕķîñĝ àļöñĝšîđé àþþ ḿöđé. ĜîţĻàƃ àļŵàýš üšéš à þŕöĵéçţ àççéšš ţöķéñ.
Šéé Ţĥé Bowrain ĜîţĤüƃ Àþþ ƒöŕ ţĥé éñđ-ţö-éñđ ŵàļķţĥŕöüĝĥ.
Ŕéļàţéđ
- Çöññéçţöŕš: ţĥé ƒüļļ çöññéçţöŕ ŕöŵ
- kapi çöññéçţöŕ: ţĥé šàḿé ŕéþöšîţöŕý, đŕîṽéñ ƃý à đéṽéļöþéŕ
- Ķééþîñĝ çöñţéñţ çàüĝĥţ üþ: ŵĥàţ à đéļîṽéŕý çöñţàîñš