Šķîþ ţö ḿàîñ çöñţéñţ

Àüţöḿàţîöñ

Bowrain þŕöṽîđéš ţŵö çöḿþļéḿéñţàŕý ļàýéŕš öƒ àüţöḿàţîöñ: šéŕṽéŕ-šîđé ŕüļéš, çöñƒîĝüŕéđ îñ ţĥé ŵéƃ àþþ, ţĥàţ ŕéšþöñđ ţö éṽéñţš àçŕöšš ţĥé ŵĥöļé ŵöŕķšþàçé, àñđ ļöçàļ ŕüļéš đéçļàŕéđ öñ à þŕöĵéçţ ŕéçîþé ƒöŕ kapi-đŕîṽéñ (ÇĻÎ/ÇÎ) ŵöŕķƒļöŵš.

Šéŕṽéŕ-šîđé àüţöḿàţîöñ

Šéŕṽéŕ-šîđé àüţöḿàţîöñš àŕé éṽéñţ-đŕîṽéñ ŕüļéš çöñƒîĝüŕéđ îñ ţĥé Bowrain ŵéƃ àþþ üñđéŕ Þŕöĵéçţ > Àüţöḿàţîöñš. Ţĥéý ŕéšþöñđ ţö éṽéñţš öñ ţĥé šéŕṽéŕ àñđ ţŕîĝĝéŕ àçţîöñš šüçĥ àš ŕüññîñĝ ƒļöŵš öŕ šéñđîñĝ ñöţîƒîçàţîöñš. Ƃéçàüšé ţĥéý ŕéàçţ ţö éṽéñţš öñ ţĥé šéŕṽéŕ, ţĥéý àþþļý ţö çöñţéñţ ƒŕöḿ àñý çöññéçţöŕ, ñöţ ĵüšţ à ļöçàļ çĥéçķöüţ.

Ţĥé Àüţöḿàţîöñš šüŕƒàçé ĥàš ţĥŕéé ţàƃš: Ŕüñš (ŕüñ ĥîšţöŕý), Ŕüļéš (ţŕîĝĝéŕ + çöñđîţîöñš + àçţîöñš), àñđ Ƒļöŵš (ţĥé ƒļöŵ çàñṽàš; šéé Šéŕṽéŕ-šîđé ƒļöŵš). Ţĥé Ƒļöŵš ţàƃ àñđ ţĥé Ŕüļéš ţàƃ àŕé öñé éđîţöŕ, šö à run_flow àçţîöñ àñđ ţĥé ƒļöŵ îţ ŕüñš àŕé àüţĥöŕéđ îñ öñé þļàçé.

Ţŕîĝĝéŕš

À ŕüļé ƒîŕéš öñ öñé öƒ ţĥéšé éṽéñţš:

ŢŕîĝĝéŕƑîŕéš ŵĥéñ
connector.push.completedÇöñţéñţ îš þüšĥéđ, ƒŕöḿ à çĥéçķöüţ öŕ à ŕéþöšîţöŕý
project.updatedÞŕöĵéçţ šéţţîñĝš çĥàñĝé
quality.gate.failÀ ļàñĝüàĝé šţöþš ḿééţîñĝ à šĥîþ ĝàţé
push.automations.completedÉṽéŕý àüţöḿàţîöñ ƒöŕ à þüšĥ ĥàš çöḿþļéţéđ
source.review.completedÀ šöüŕçé ŕéṽîéŵ ţàšķ îš çöḿþļéţéđ

À çöññéçţöŕ ƒéţçĥ éḿîţš ñö éṽéñţ, šö à ŕüļé çàññöţ ŕéàçţ ţö çöñţéñţ àŕŕîṽîñĝ ƒŕöḿ à çöñţéñţ þļàţƒöŕḿ; çàţçĥ ţĥàţ çöñţéñţ üþ ƃý šţàŕţîñĝ à ŕüñ. Ñö éṽéñţ ƒîŕéš ŵĥéñ à ƒļöŵ ƒîñîšĥéš, šö à ŕüļé çàññöţ çĥàîñ öñ à ƒļöŵ'š çöḿþļéţîöñ.

Çŕéàţîñĝ ŕüļéš

  1. Ñàṽîĝàţé ţö Þŕöĵéçţ > Àüţöḿàţîöñš > Ŕüļéš
  2. Çļîçķ Ñéŵ Ŕüļé
  3. Šéļéçţ à ţŕîĝĝéŕ éṽéñţ
  4. Àđđ öþţîöñàļ çöñđîţîöñš (ƒîļţéŕ ƃý þŕöĵéçţ, ļöçàļé, öŕ éṽéñţ đàţà)
  5. Àđđ öñé öŕ ḿöŕé àçţîöñš. À run_flow àçţîöñ þîçķš à ƒļöŵ ƒŕöḿ ţĥé þŕöĵéçţ'š ƒļöŵ ŕéĝîšţŕý (ţĥé ƃüîļţ-îñ çàţàļöĝ þļüš àñý þŕöĵéçţ ƒļöŵš àüţĥöŕéđ öñ ţĥé Ƒļöŵš ţàƃ); ţĥé šàḿé ƒļöŵ àþþļîéš ţö çöñţéñţ ƒŕöḿ àñý çöññéçţöŕ
  6. Šàṽé àñđ éñàƃļé ţĥé ŕüļé

Ŕüļéš àñđ ţĥé ƒļöŵ đéƒîñîţîöñš ţĥéý ŕéƒéŕéñçé àŕé þéŕšîšţéđ ţĥŕöüĝĥ ţĥé þŕöĵéçţ-šçöþéđ ŔÉŠŢ ÀÞÎ: /api/v1/:ws/:id/automations ƒöŕ ŕüļéš àñđ /api/v1/:ws/:id/flows ƒöŕ ƒļöŵ đéƒîñîţîöñš. Ŕüļéš çàñ ƃé ŕéöŕđéŕéđ, đîšàƃļéđ, àñđ đüþļîçàţéđ ƒŕöḿ ţĥé éđîţöŕ. À ŕüļé îš çĥéçķéđ ŵĥéñ îţ îš šàṽéđ: éṽéŕý àçţîöñ ḿüšţ ƃé öñé ţĥé šéŕṽéŕ ŕüñš, àñđ à run_flow àçţîöñ ḿüšţ ñàḿé à ƒļöŵ ţĥé þŕöĵéçţ çàñ šéé, šö à ŕüļé ţĥàţ šàṽéš îš à ŕüļé ţĥàţ ƒîŕéš.

Àçţîöñš

ÀçţîöñŴĥàţ îţ đöéš
run_flowŔüñš à ƒļöŵ öṽéŕ ţĥé þŕöĵéçţ'š šţöŕéđ çöñţéñţ àñđ ŵŕîţéš ţĥé ŕéšüļţš ƃàçķ
auto_translateŠţàŕţš ţŕàñšļàţîöñ ĵöƃš ƒöŕ ţĥé þüšĥéđ îţéḿš îñ éṽéŕý ţàŕĝéţ ļàñĝüàĝé
create_review_tasksÖþéñš à ŕéṽîéŵ ţàšķ þéŕ ţàŕĝéţ ļàñĝüàĝé ƒöŕ ţĥé þŕöĵéçţ'š ŕéṽîéŵéŕš
create_source_reviewÖþéñš à šöüŕçé ŕéṽîéŵ ţàšķ
notifyŠéñđš àñ îñ-àþþ ñöţîƒîçàţîöñ

À run_flow àçţîöñ ţàķéš ţĥéšé þàŕàḿéţéŕš:

ÞàŕàḿéţéŕḾéàñîñĝ
flowŢĥé ƒļöŵ ţö ŕüñ: à ƃüîļţ-îñ ƒļöŵ öŕ öñé àüţĥöŕéđ öñ ţĥé þŕöĵéçţ'š Ƒļöŵš ţàƃ. Ŕéǫüîŕéđ.
streamŢĥé šţŕéàḿ ţö ŕéàđ àñđ ŵŕîţé. Đéƒàüļţš ţö ţĥé šţŕéàḿ ţĥé éṽéñţ ñàḿéš, öŕ main.
itemsÇöḿḿà-šéþàŕàţéđ îţéḿ ñàḿéš. Đéƒàüļţš ţö ţĥé îţéḿš ţĥé éṽéñţ ñàḿéš (à þüšĥ'š ƒîļéš), öŕ éṽéŕý îţéḿ.
target_localesÇöḿḿà-šéþàŕàţéđ ţàŕĝéţ ļöçàļéš, öñé þàšš éàçĥ. Đéƒàüļţš ţö ţĥé þŕöĵéçţ'š ţàŕĝéţ ļàñĝüàĝéš.

Ţĥé ƒļöŵ ŕüñš îñ ţĥé ƃàçķĝŕöüñđ öṽéŕ öñé îţéḿ àţ à ţîḿé, àñđ ţĥé ŕüñ'š šţéþ ŕéçöŕđš ŵĥàţ îţ ŵŕöţé. À ƒļöŵ ţĥé þŕöĵéçţ çàññöţ šéé, à ƒļöŵ ŵĥöšé ţööļ ţĥîš šéŕṽéŕ ļàçķš, öŕ à ţööļ ţĥàţ ƒàîļš þàŕţ ŵàý ḿàŕķš ţĥé šţéþ ƒàîļéđ ŵîţĥ ţĥé ŕéàšöñ, îñ ţĥé ŕüñ ĥîšţöŕý àñđ îñ ţĥé éẋéçüţîöñ ĥîšţöŕý.

Ŕüñ ĥîšţöŕý

Éṽéŕý šéŕṽéŕ-šîđé àüţöḿàţîöñ ŕüñ îš ŕéçöŕđéđ üñđéŕ Þŕöĵéçţ > Àüţöḿàţîöñš > Ŕüñš, ŵîţĥ îţš ţŕîĝĝéŕ, îţš šţéþš, ţĥé öüţçöḿé öƒ éàçĥ šţéþ, àñđ þéŕ-šţéþ ļöĝš. À ŕüñ îñ þŕöĝŕéšš üþđàţéš îñ þļàçé àš éàçĥ šţéþ šţàŕţš àñđ ƒîñîšĥéš. Ţĥîš îš ţĥé ŕéçöŕđ ţö çöñšüļţ ŵĥéñ à ŕüļé đîđ ñöţ đö ŵĥàţ ýöü éẋþéçţéđ.

Ļöçàļ àüţöḿàţîöñ (ÇĻÎ)

Ļöçàļ àüţöḿàţîöñš ŕüñ îñ kapi (ŵîţĥ ţĥé bowrain þļüĝîñ) àñđ àŕé đéçļàŕéđ àţ ţĥé ţöþ ļéṽéļ öƒ ýöüŕ þŕöĵéçţ'š kapi.yaml ŕéçîþé. Ţĥéý ĥööķ îñţö ÇĻÎ çöḿḿàñđš àñđ éẋéçüţé àçţîöñš ƃéƒöŕé öŕ àƒţéŕ þüšĥ, þüļļ, àñđ ƒļöŵ ŕüñš: ţĥé đéṽéļöþéŕ ŵöŕķƒļöŵ àñđ ÇÎ ļàýéŕ ţĥàţ çöḿþļéḿéñţš ţĥé šéŕṽéŕ ŕüļéš àƃöṽé.

Çöñƒîĝüŕàţîöñ

Àđđ àñ automations: šéçţîöñ ţö ýöüŕ kapi.yaml ŕéçîþé:

automations:
- name: checks-before-push
trigger: pre-push
actions:
- type: run_flow
config:
flow: qa

- name: sync-on-push
trigger: post-push
actions:
- type: wait_translate
config:
timeout: 5m
- type: pull

Ţŕîĝĝéŕ ţýþéš

ŢŕîĝĝéŕƑîŕéš ŵĥéñ
pre-pushƂéƒöŕé kapi push šéñđš çöñţéñţ ţö ţĥé šéŕṽéŕ
post-pushÀƒţéŕ kapi push çöḿþļéţéš šüççéššƒüļļý
pre-pullƂéƒöŕé kapi pull ƒéţçĥéš çöñţéñţ ƒŕöḿ ţĥé šéŕṽéŕ
post-pullÀƒţéŕ kapi pull ŵŕîţéš ƒîļéš ļöçàļļý
pre-flowƂéƒöŕé kapi run éẋéçüţéš à ƒļöŵ
post-flowÀƒţéŕ kapi run çöḿþļéţéš

Àçţîöñ ţýþéš

ÀçţîöñĐéšçŕîþţîöñ
run_flowŔüñ à ƒļöŵ ƃý ñàḿé öṽéŕ ţĥé þŕöĵéçţ'š çöļļéçţîöñš, àš kapi run <flow> đöéš ŵîţĥ ñö --input
wait_translateŴàîţ ƒöŕ ţĥé šéŕṽéŕ-šîđé ŕüñ ţö çöḿþļéţé (ŵîţĥ çöñƒîĝüŕàƃļé ţîḿéöüţ)
pullÞüļļ ŕéšüļţš ƒŕöḿ ţĥé šéŕṽéŕ
pushÞüšĥ ļöçàļ çöñţéñţ ţö ţĥé šéŕṽéŕ

À ļöçàļ run_flow àçţîöñ ţàķéš ţĥéšé þàŕàḿéţéŕš:

ÞàŕàḿéţéŕḾéàñîñĝ
flowŢĥé ƒļöŵ ţö ŕüñ: öñé đéçļàŕéđ üñđéŕ flows: öñ ţĥé ŕéçîþé, öŕ à ƃüîļţ-îñ ƒļöŵ šüçĥ àš qa. Ŕéǫüîŕéđ.
fail_on_errortrue àƃöŕţš ţĥé çöḿḿàñđ ŵĥéñ ţĥé ƒļöŵ'š çĥéçķ šţéþš ŕéþöŕţ ƒîñđîñĝš, öŕ ŵĥéñ îţš çĥéçķš đîđ ñöţ ŕüñ: ţĥé ƒļöŵ ĥöļđš ñö çĥéçķ šţéþ, öŕ îţš çĥéçķ šţéþš ŕéàđ ñö çöñţéñţ. Đéƒàüļţ false: ŕéþöŕţ àñđ çöñţîñüé.

Ţĥé ƒļöŵ ŕüñš ţĥé ŵàý kapi run <flow> ŕüñš îţ îñšîđé ţĥé þŕöĵéçţ: öṽéŕ éṽéŕý ƒîļé ţĥé ŕéçîþé'š çöļļéçţîöñš ḿàţçĥ, öñé þàšš þéŕ ţàŕĝéţ ļàñĝüàĝé ţĥé ƒļöŵ àþþļîéš ţö, ŵîţĥ ţĥé ŕéçîþé'š ṽöîçé þŕöƒîļé àñđ ţéŕḿš ƃöüñđ, àñđ ŵîţĥ ţĥé ŕéšüļţš çöḿḿîţţéđ ţö ţĥé þŕöĵéçţ šţöŕé ŕàţĥéŕ ţĥàñ ŵŕîţţéñ ţö ţàŕĝéţ ƒîļéš. Îţš öüţþüţ, îñçļüđîñĝ ţĥé ƒîñđîñĝš ţàƃļé îţš çĥéçķ šţéþš þŕöđüçé, þŕîñţš îñ ţĥé öüţþüţ öƒ ţĥé çöḿḿàñđ ţĥàţ ţŕîĝĝéŕéđ îţ (öñ šţđéŕŕ üñđéŕ --json, šö ţĥé çöḿḿàñđ'š đöçüḿéñţ šţàýš îñţàçţ). À ƒļöŵ ţĥàţ çàññöţ ŕüñ, ƃéçàüšé ţĥé ñàḿé îš üñķñöŵñ öŕ à ţööļ ƒàîļš, àƃöŕţš ţĥé çöḿḿàñđ ŵĥàţéṽéŕ fail_on_error šàýš.

Éẋàḿþļé: à çĥéçķ ĝàţé ƃéƒöŕé þüšĥ

Þŕéṽéñţ þüšĥîñĝ çöñţéñţ ţĥàţ ƒàîļš ţĥé çĥéçķš:

automations:
- name: checks-gate
trigger: pre-push
actions:
- type: run_flow
config:
flow: qa
fail_on_error: true

΃ qa ŕéþöŕţš ƒîñđîñĝš àñđ fail_on_error îš true, ţĥé þüšĥ îš àƃöŕţéđ ƃéƒöŕé àñýţĥîñĝ îš šéñţ, ŵîţĥ ţĥé ƒîñđîñĝš šüḿḿàŕý àñđ ţĥé éẋîţ çöđé kapi check üšéš ƒöŕ à ƒàîļéđ ĝàţé. Ŵîţĥöüţ fail_on_error ţĥé ƒîñđîñĝš àŕé ŕéþöŕţéđ àñđ ţĥé þüšĥ ĝöéš àĥéàđ.

À ƒļöŵ çàñ ŕéàçĥ ñö ṽéŕđîçţ îñ ţŵö ŵàýš, àñđ ƃöţĥ çöüñţ àš çĥéçķš ţĥàţ đîđ ñöţ ŕüñ. À çĥéçķ šţéþ öṽéŕ ñö çöñţéñţ ƃļöçķ, ƒöŕ éẋàḿþļé ŵĥéñ éṽéŕý ḿàţçĥéđ ƒîļé îš éḿþţý, ŕéþöŕţš ţĥé çàüšé nothing_to_check. À ƒļöŵ ţĥàţ ĥöļđš ñö çĥéçķ šţéþ, šüçĥ àš pseudo-translate, çĥéçķš ñöñé öƒ ţĥé çöñţéñţ îţ ŕüñš öṽéŕ àñđ ŕéþöŕţš ţĥé çàüšé content_not_checked. Ŵîţĥ fail_on_error ţĥé þüšĥ îš àƃöŕţéđ ŵîţĥ ţĥé çàüšé àñđ ţĥé éẋîţ çöđé kapi check üšéš ŵĥéñ à çĥéçķ đîđ ñöţ ŕüñ. Ŵîţĥöüţ îţ, ţĥé çöḿḿàñđ þŕîñţš ţĥé çàüšé àñđ ţĥé þüšĥ ĝöéš àĥéàđ.

Çàţçĥîñĝ üþ öñ éṽéŕý þüšĥ

Çàţçĥîñĝ ţĥé þŕöĵéçţ üþ öñ þüšĥ îš ţĥé þŕöĵéçţ'š bowrain.converge þöļîçý ŕàţĥéŕ ţĥàñ àñ àüţöḿàţîöñ. Ŵîţĥ ţĥé đéƒàüļţ on-push, ţĥé šéŕṽéŕ ŕüñš à ƒüļļ þàšš (ŕéüšé, đŕàƒţîñĝ, çĥéçķš, ţéŕḿš, ĝàţéš, þàŕķîñĝ) àƒţéŕ éṽéŕý þüšĥ, ŕéçöŕđéđ àš à ŕüñ àñýöñé çàñ ŵàţçĥ:

# kapi.yaml
bowrain:
url: https://bowrain.example.com/my-team/abc123
converge: on-push # on-push (default) | manual

kapi push ƒŕöḿ ÇÎ ĵüšţ þüšĥéš; ţĥé šéŕṽéŕ çàţçĥéš ţĥé þŕöĵéçţ üþ öñ îţš öŵñ çļöçķ; kapi up îš þüšĥ, ţĥéñ ŵàţçĥ ţĥé ŕüñ, ţĥéñ þüļļ. Šéé Ķééþîñĝ çöñţéñţ çàüĝĥţ üþ ƒöŕ ţĥé ḿöđéļ.

Éṽéŕý ŕüñ, šţàŕţéđ ƃý à þüšĥ, ƃý kapi up, öŕ ḿàñüàļļý, àþþéàŕš îñ ţĥé þŕöĵéçţ'š Ŕüñš ṽîéŵ îñ ţĥé ŵéƃ àñđ đéšķţöþ àþþ, ŵîţĥ îţš šţàţé (Ŕüññîñĝ, Üþ ţö đàţé, Þàŕķéđ), îţš ţŕîĝĝéŕ, ţĥé þàšš çöüñţ, àñđ à þéŕ-ļöçàļé šüḿḿàŕý šüçĥ àš "3 šĥîþþàƃļé · 1 þàŕķéđ". À Ŕüñ ñöŵ ƃüţţöñ šţàŕţš à ŕüñ ƒŕöḿ ţĥé àþþ, àñđ àñ îñ-ƒļîĝĥţ ŕüñ çàñ ƃé çàñçéļéđ. Þàŕķéđ üñîţš ļàñđ îñ ţĥé ŕéṽîéŵ šéššîöñ.

Ǫüàļîţý ĝàţé éṽéñţš

Bowrain đéŕîṽéš éàçĥ ţàŕĝéţ ļàñĝüàĝé'š šĥîþ šţàţé ƒŕöḿ ƒîṽé ĝàţéš: çöṽéŕàĝé (translated), ţĥé çĥéçķš (checks), ţéŕḿîñöļöĝý ŵĥéŕé ţéŕḿš ĝöṽéŕñ ţĥé ļàñĝüàĝé (terms), đéçîšîöñš öñ šöüŕçé ţĥàţ ĥàš çĥàñĝéđ (stale), àñđ ŵöŕđîñĝ à ŕéṽîéŵéŕ ŕéĵéçţéđ (rejected). Ŵĥéñ à ļàñĝüàĝé šţöþš ḿééţîñĝ à ĝàţé, Bowrain þüƃļîšĥéš quality.gate.fail ƒöŕ ţĥàţ ĝàţé àñđ ļàñĝüàĝé. Ŵĥéñ îţ ḿééţš ţĥé ĝàţé àĝàîñ, Bowrain þüƃļîšĥéš quality.gate.pass. Àñ üñçĥàñĝéđ ŕéšüļţ þüƃļîšĥéš ñöţĥîñĝ, àñđ à ļàñĝüàĝé ŵĥöšé ƒîŕšţ ŕéšüļţ ḿééţš éṽéŕý ĝàţé þüƃļîšĥéš ñö þàšš. À ƒàîļ ƒöŕ à ĝàţé ţĥàţ îš üñḿéţ ƃéçàüšé à çĥéçķ ĥàš ñö ŕéšüļţ šàýš šö.

Bowrain đéŕîṽéš šĥîþ šţàţéš ŵĥéñ à çöñṽéŕĝéñçé ŕüñ ƒîñîšĥéš àñđ ŵĥéñ šöḿéöñé ŕéàđš ţĥé þŕöĵéçţ đàšĥƃöàŕđ öŕ ţĥé šĥîþ ƒééđ, šö àñ éṽéñţ ƒöļļöŵš ţĥé çĥàñĝé îţ ŕéþöŕţš ƃý àţ ḿöšţ öñé öƒ ţĥéšé.

Ţĥé éṽéñţš ŕéþöŕţ šţàţé àñđ ƃļöçķ ñöţĥîñĝ. À ŕüļé öñ quality.gate.fail çàñ ŕüñ à ƒļöŵ, àñđ à ƒàîļéđ ĝàţé ñöţîƒîéš ţĥé þŕöĵéçţ'š ḿéḿƃéŕš. Ţö šţöþ çöñţéñţ ţĥàţ đöéš ñöţ ḿééţ à ƃàŕ, ĝàţé ŵĥéŕé îţ îš þŕöđüçéđ: kapi check --ship éẋîţš ñöñ-žéŕö ŵĥéñ à šĥîþ ĝàţé îš üñḿéţ, àñđ à ļöçàļ run_flow àçţîöñ ŵîţĥ fail_on_error: true àƃöŕţš ţĥé çöḿḿàñđ öñ ţĥé ƒļöŵ'š ƒîñđîñĝš.

Ļööþ þŕéṽéñţîöñ

Àüţöḿàţîöñ çĥàîñš àŕé ţŕàçķéđ ţĥŕöüĝĥ à çàüšàţîöñ çĥàîñ. ΃ à çĥàîñ öƒ ŕüļéš éẋçééđš ƒîṽé ļéṽéļš đééþ, îţ šţöþš àüţöḿàţîçàļļý àñđ à ŵàŕñîñĝ îš ļöĝĝéđ. Ţĥîš þŕéṽéñţš çîŕçüļàŕ ŕüļéš ƒŕöḿ ŕüññîñĝ îñđéƒîñîţéļý.