ЁЯз╣ рдзрдбрд╛ 12 тАФ Pipeline hygiene & рд╣рд╕реНрддрд╛рдВрддрд░: mailroom рдЪреЗ рдирд┐рдпрдордкреБрд╕реНрддрдХ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 12 тАФ рд╢реЗрд╡рдЯрдЪрд╛ рдзрдбрд╛! ┬╖ рдорд╛рдЧреАрд▓: lesson-11-four-dialects
ЁЯФЧ рдкреБрдвреЗ: ArgoCD рд╢рд╛рд│реЗрдЪрд╛ рдзрдбрд╛ 01 рдиреЗрдордХрд╛ рдЗрдереЗ рд╣рд╛ рдзрдбрд╛ рд╕рдВрдкрддреЛ рддрд┐рдереВрди рд╕реБрд░реВ рд╣реЛрддреЛ.
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╕рдЧрд│реЗ 12 рдзрдбреЗ тАФ рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕. рд╢реЗрд╡рдЯ рдореНрд╣рдгрдЬреЗ mailroom рдЪреНрдпрд╛ рднрд┐рдВрддреАрд╡рд░рдЪреЗ poster: рдирд╡рд▓рд╛рдИ рдУрд╕рд░рд▓реНрдпрд╛рдирдВрддрд░рд╣реА courier рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдареЗрд╡рдгрд╛рд▒реНрдпрд╛ рд╕рд╡рдпреА, рдПрдХ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЧреБрдгрдлрд▓рдХ, рд╣рд╛ рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕ рд╕реЛрдбрд╡реВ рд╢рдХрдд рдирд╛рд╣реА рдЕрд╢реА рдПрдХ рд╕рдорд╕реНрдпрд╛, рдЖрдгрд┐ рддреБрдордЪреА рдкрджрд╡реА рдкрд░реАрдХреНрд╖рд╛. рдЦрд▒реНрдпрд╛ files: рд╕рдЧрд│реНрдпрд╛рдЪ тАФ рдЖрдзреАрдкрд╛рд╕реВрди рдЕрд╕рд▓реЗрд▓реНрдпрд╛ hygiene рдЪреНрдпрд╛ рдУрд│реА рдЦрд╛рд▓реА рджрд╛рдЦрд╡рд▓реНрдпрд╛ рдЖрд╣реЗрдд.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Courier robot рдЪрд╛рд▓рддреЛ. рдЖрддрд╛ рд╢рд╛рд│рд╛ рдирд┐рдпрдордкреБрд╕реНрддрдХ poster ЁЯз╣ рд▓рд┐рд╣рд┐рддреЗ, рдореНрд╣рдгрдЬреЗ рддреЛ рдкреБрдврдЪреНрдпрд╛ рд╡рд░реНрд╖реАрд╣реА рдЪрд╛рд▓рдд рд░рд╛рд╣реАрд▓, рдЬреЗрд╡реНрд╣рд╛ рддреЛ рдХреЛрдгреА set up рдХреЗрд▓рд╛ рддреЗ рдХреЛрдгрд╛рд▓рд╛рдЪ рдЖрдард╡рдгрд╛рд░ рдирд╛рд╣реА:
- рдлрдХреНрдд рдордВрдЧрд│рд╡рд╛рд░реА fail рд╣реЛрдгрд╛рд░реА test рд╣реА test рдирд╛рд╣реА ЁЯО▓ тАФ рддреА рд╡реЗрдЧрд│реА рдХрд╛рдврд╛, рджреБрд░реБрд╕реНрдд рдХрд░рд╛, рдкрд╛рд╕ рд╣реЛрдИрдкрд░реНрдпрдВрдд рдлрдХреНрдд retry рдХрд░реВ рдирдХрд╛. Retries рд╕рдбрдгреЗ рд▓рдкрд╡рддрд╛рдд.
- рддреБрдореНрд╣реА рдиреЗрдордХреА рдХреЛрдгрддреА tools рдХрд╛рдорд╛рд╡рд░ рдареЗрд╡рд▓реА рддреЗ рдЬрд╛рдгреВрди рдШреНрдпрд╛ ЁЯУМ тАФ actions, orbs рдЖрдгрд┐ base images рдПрдХрд╛ fingerprint рд╡рд░ pin рдХрд░рд╛ (commit SHA рдХрд┐рдВрд╡рд╛ image digest), рдореНрд╣рдгрдЬреЗ "v4" рддреБрдордЪреНрдпрд╛ рдирдХрд│рдд рдЧреБрдкрдЪреВрдк рдмрджрд▓реВ рд╢рдХрдгрд╛рд░ рдирд╛рд╣реА.
- Robot рд▓рд╛ рдЪрд╛рд▓рдгрд╛рд░реА рд╕рд░реНрд╡рд╛рдд рдЫреЛрдЯреА key рджреНрдпрд╛ ЁЯкк тАФ рдкреНрд░рддреНрдпреЗрдХ workflow рдЖрдгрд┐ job рд╕рд╛рдареА
permissions:, рдЖрдгрд┐ master keys рдирд╛рд╣реАрдд (рдзрдбрд╛ 06). - рдореБрдЦреНрдп рдлрд▓рдХрд╛рд▓рд╛ рдХреБрд▓реВрдк рд▓рд╛рд╡рд╛ ЁЯФТ тАФ рд╣рд┐рд░рд╡рд╛ check рдЖрдгрд┐ review рд╢рд┐рд╡рд╛рдп
mainрд╡рд░ рдХрд╛рд╣реАрд╣реА рдЙрддрд░рдд рдирд╛рд╣реА; pushes рдЙрддрд░рдгреНрдпрд╛рдЖрдзреА secrets рд╕рд╛рдареА scan рдХрд░рд╛. - рдкрд╛рд╡рддреНрдпрд╛ рдареЗрд╡рд╛ ЁЯз╛ тАФ lockfile рд╕рд╛рдВрдЧрддреЗ рдЖрдд рдХрд╛рдп рдЧреЗрд▓реЗ; build provenance рд╕рд╛рдВрдЧрддреЗ рддреЗ рдХреЛрдгреА build рдХреЗрд▓реЗ, рдХреЛрдгрддреНрдпрд╛ commit рд╡рд░реВрди, рдХреЛрдгрддреНрдпрд╛ pipeline рдиреЗ.
- рдШрдбреНрдпрд╛рд│ рд▓рд╛рд╡рд╛ тП▒я╕П тАФ рдЕрдбрдХрд▓реЗрд▓рд╛ job fail рдЭрд╛рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ; рдирд╡рд╛ push рдЬреБрдирд╛ run рд░рджреНрдж рдХрд░рд╛рдпрд▓рд╛ рд╣рд╡рд╛.
рдЖрдгрд┐ рдПрдХ рдЧреБрдгрдлрд▓рдХ ЁЯУК рдЬреЛ рджрд┐рдЦрд╛рдК рдЖрдХрдбрд╛ рдирд╛рд╣реА: рддреБрдореНрд╣реА рдХрд┐рддреА рд╡реЗрд│рд╛ deliver рдХрд░рддрд╛, рдПрдЦрд╛рджрд╛ рдмрджрд▓ рдХрд┐рддреА рд╡реЗрд│ рд╡рд╛рдЯ рдкрд╛рд╣рддреЛ, delivery рдХрд┐рддреА рд╡реЗрд│рд╛ рдХрд╛рд╣реАрддрд░реА рдореЛрдбрддреЗ, рддреБрдореНрд╣реА рддреЗ рдХрд┐рддреА рдкрдЯрдХрди рджреБрд░реБрд╕реНрдд рдХрд░рддрд╛. рдкреНрд░рд╛рдорд╛рдгрд┐рдХрдкрдгреЗ рдореЛрдЬрд▓реЗрд▓реЗ рдЪрд╛рд░ рдЖрдХрдбреЗ рдХреЛрдгрддреНрдпрд╛рд╣реА dashboard рдкреЗрдХреНрд╖рд╛ рд╕рд░рд╕.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
flaky["ЁЯО▓ flaky tests<br/>quarantine тЖТ fix"]
pin["ЁЯУМ pin actions, orbs, images<br/>SHA or digest"]
perm["ЁЯкк least privilege<br/>permissions: per job"]
lock["ЁЯФТ protect main<br/>required checks + review"]
prov["ЁЯз╛ lockfiles + provenance<br/>SLSA, attestations"]
clock["тП▒я╕П timeout-minutes<br/>concurrency"]
dora["ЁЯУК DORA: frequency ┬╖ lead time<br/>failure rate ┬╖ restore time"]
argo["ЁЯдЦ ArgoCD school<br/>drift, self-heal, git as truth"]
flaky -->|"1"| dora
pin -->|"2"| dora
perm -->|"3"| dora
lock -->|"4"| dora
prov -->|"5"| dora
clock -->|"6"| dora
dora -.->|"7 what push cannot fix"| argo
тЭУ рдХрд╛рдп
- Flaky test = рддреНрдпрд╛рдЪ commit рд╡рд░ рдХрдзреА рдкрд╛рд╕ рддрд░ рдХрдзреА fail. рддреА рд╡реЗрдЧрд│реА рдХрд╛рдврд╛ (ticket рд╕рд╣ skip рдХрд░рд╛), рдХрд╛рд░рдг рджреБрд░реБрд╕реНрдд рдХрд░рд╛ (timing, shared state, network), рдордЧ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓реВ рдХрд░рд╛. рдЖрдкреЛрдЖрдк retries рдореБрд│реЗ рдЖрдХрдбрд╛ рдмрд░рд╛ рджрд┐рд╕рддреЛ рдЖрдгрд┐ рд╕рдорд╕реНрдпрд╛ рдЕрджреГрд╢реНрдп рд╣реЛрддреЗ.
- Pinning = dependency рдЪрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЕрд╢рд╛ рдЧреЛрд╖реНрдЯреАрдиреЗ рдХрд░рдгреЗ рдЬреА рд╣рд▓реВ рд╢рдХрдд рдирд╛рд╣реА: action рд╕рд╛рдареА рдкреВрд░реНрдг
commit SHA, orb рд╕рд╛рдареА рдиреЗрдордХреЗ
x.y.z, image рд╕рд╛рдареАsha256:digest. рдордЧ Dependabot рдХрд┐рдВрд╡рд╛ Renovate pin рдкреБрдвреЗ рд╕рд░рдХрд╡рддрд╛рдд, рдПрдХрд╛ diff рд╕рд╣ рдЬреЛ рддреБрдореНрд╣реА review рдХрд░рддрд╛. - Least privilege = рдкреНрд░рддреНрдпреЗрдХ workflow рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛
permissions:(default read-only) рдЖрдгрд┐id-token: writeрдлрдХреНрдд рдЬрд┐рдереЗ badge рд▓рд╛рдЧрддреЛ рддрд┐рдереЗрдЪ. - Branch protection = required status checks рд╣рд┐рд░рд╡реЗ рдЖрдгрд┐ review рдЕрд╕реЗрд▓ рддрд░рдЪ
mainmerges рд╕реНрд╡реАрдХрд╛рд░рддреЗ. Push protection рд╕рд╣ secret scanning рдУрд│рдЦреАрдЪреНрдпрд╛ credential рдЪреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдЪрд╛ рдордЬрдХреВрд░ рдЕрд╕рд▓реЗрд▓рд╛ push рдЙрддрд░рдгреНрдпрд╛рдЖрдзреАрдЪ рдЕрдбрд╡рддреЗ (рдЙрдкрд▓рдмреНрдзрддрд╛ plan рд╡рд░ рдЖрдгрд┐ repo public рдЖрд╣реЗ рдХрд╛ рдпрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди). - Lockfile = build рдордзреНрдпреЗ рдЧреЗрд▓реЗрд▓реЗ рдиреЗрдордХреЗ dependency tree (рдпрд╛ app рдордзреНрдпреЗ
рдПрдХрд╣реА рдирд╛рд╣реА, рдХрд╛рд░рдг рддрд┐рд▓рд╛ dependencies рдирд╛рд╣реАрдд). Build provenance = artifact рдХрд╕реЗ build рдЭрд╛рд▓реЗ
рдпрд╛рдЪреЗ рд╕рд╣реА рдХреЗрд▓реЗрд▓реЗ рдирд┐рд╡реЗрджрди; рддреЗ рдирд┐рд╡реЗрджрди рдХрд┐рддреА рднрдХреНрдХрдо рдЖрд╣реЗ рдпрд╛рдЪреЗ рд╕реНрддрд░ SLSA рдард░рд╡рддреЗ;
actions/attest-build-provenanceрдЕрд╕реЗ рдПрдХ рдирд┐рд╡реЗрджрди рддрдпрд╛рд░ рдХрд░рддреЗ. timeout-minutes/concurrency= job рдХрд┐рддреА рд╡реЗрд│ рдЕрдбрдХреВ рд╢рдХрддреЛ рдпрд╛рдЪреА рдХрдорд╛рд▓ рдорд░реНрдпрд╛рджрд╛, рдЖрдгрд┐ рдирд╡рд╛ run рдЬреБрдиреНрдпрд╛рдЪреА рдЬрд╛рдЧрд╛ рдШреЗрддреЛ рдЕрд╕рд╛ рдирд┐рдпрдо.
ЁЯза рдЧреБрдгрдлрд▓рдХ тАФ DORA рдЪреЗ рдЪрд╛рд░ metrics
| metric | рд╡рд┐рдЪрд╛рд░рддреЛ | рдпрд╛ рдХреЛрд░реНрд╕рдордзрд▓рд╛ рдЙрдкрд╛рдп |
|---|---|---|
| deployment frequency | рд╡реНрд╣реЕрди рдХрд┐рддреА рд╡реЗрд│рд╛ production рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрддреЗ? | рдЫреЛрдЯреЗ рдмрджрд▓, рдХрдВрдЯрд╛рд│рд╡рд╛рдгреА pipeline |
| lead time for changes | commit тЖТ production рдордзреНрдпреЗ рдЪрд╛рд▓реВ: рдХрд┐рддреА рд╡реЗрд│? | рд╡реЗрдЧрд╡рд╛рди CI (L04), рдЖрдкреЛрдЖрдк deploy (L10) |
| change failure rate | рдХрд┐рддреА рдЯрдХреНрдХреЗ deliveries рдирд╛ fix рдХрд┐рдВрд╡рд╛ rollback рд▓рд╛рдЧрддреЛ? | BOX рд╡рд░ tests (L07), рдЖрдзреА staging (L08), probes (L09) |
| time to restore service | рдмрд┐рдШрдбрд▓реЗ рддрд░ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓реВ рд╡реНрд╣рд╛рдпрд▓рд╛ рдХрд┐рддреА рд╡реЗрд│? | рдХрд╛рд▓рдЪрд╛ tag рдкреБрдиреНрд╣рд╛ deploy рдХрд░рд╛ (L09) |
рдЗрдереЗ рдЬрд╛рдгреВрдирдмреБрдЬреВрди рдХреЛрдгрддреЗрд╣реА рд▓рдХреНрд╖реНрдп-рдЖрдХрдбреЗ рдирд╛рд╣реАрдд: рдЪрд╛рдВрдЧрд▓реЗ рдХрд╢рд╛рд▓рд╛ рдореНрд╣рдгрд╛рдпрдЪреЗ рддреЗ team рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ, рдЖрдгрд┐ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╕рдВрд╢реЛрдзрди рджрд░рд╡рд░реНрд╖реА рдмрджрд▓рдгрд╛рд▒реНрдпрд╛ рд╢реНрд░реЗрдгреА рд╕рд╛рдВрдЧрддреЗ. рддреБрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдЪрд╛рд░ рдореЛрдЬрд╛ рдЖрдгрд┐ рдХрд▓ рдкрд╛рд╣рд╛.
ЁЯдФ рдХрд╛
Pipeline рдореНрд╣рдгрдЬреЗ рджреАрд░реНрдШрдХрд╛рд│ рдЪрд╛рд▓рдгрд╛рд░реЗ software рдЬреНрдпрд╛рд╡рд░ рдЗрддрд░ рд▓реЛрдХ рдбреЛрд│реЗ рдЭрд╛рдХреВрди рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рддрд╛рдд. Pin рди рдХреЗрд▓реЗрд▓реА action, рд╕рдЧрд│реЗ рдкреБрдиреНрд╣рд╛ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рддрд╛рдд рдЕрд╢реА flaky test, рдХрдзреАрдЪ рди рд╡рд╛рдкрд░рд▓реЗрд▓рд╛ write access рдЕрд╕рд▓реЗрд▓рд╛ token тАФ рдкреНрд░рддреНрдпреЗрдХ рдкрд╣рд┐рд▓реНрдпрд╛ рджрд┐рд╡рд╢реА рдареАрдХ рдЕрд╕рддреЗ рдЖрдгрд┐ рдЪрд╛рд░рд╢реЗрд╡реНрдпрд╛ рджрд┐рд╡рд╢реА рд╢рд╛рдВрдд рдзреЛрдХрд╛ рдмрдирддреЗ. Docker рд╢рд╛рд│реЗрдЪрд╛ L08 image tags рд╕рд╛рдареА рд╣рд╛рдЪ рдпреБрдХреНрддрд┐рд╡рд╛рдж рдХрд░рддреЛ, рдЖрдгрд┐ AWS рд╢рд╛рд│реЗрдЪрд╛ L06 IAM рд╕рд╛рдареА.
рдирд┐рдпрдордкреБрд╕реНрддрдХ рдХрд╛рдп рджреБрд░реБрд╕реНрдд рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА. рд╡реНрд╣реЕрди рдирд┐рдШреВрди рдЧреЗрд▓реНрдпрд╛рд╡рд░ рдпрд╛
рдХреЛрд░реНрд╕рдордзрд▓реЗ рдХрд╛рд╣реАрд╣реА рдлрд▓рдХрд╛рд╡рд░ рд▓рдХреНрд╖ рдареЗрд╡рдд рдирд╛рд╣реА. рд╣рд╛рддрд╛рдиреЗ рдХреЗрд▓реЗрд▓реЗ kubectl edit, рдШрд╛рдИрдд рдХреЗрд▓реЗрд▓реЗ
rollout undo, рднрд▓реНрдпрд╛ рд╣реЗрддреВрдиреЗ рдПрдЦрд╛рджреНрдпрд╛ рд╢рд┐рдХреНрд╖рд┐рдХреЗрдиреЗ scale рдХреЗрд▓реЗрд▓рд╛ Deployment тАФ pipeline рдЪрд╛ рд╢реЗрд╡рдЯрдЪрд╛ run
рддрд░реАрд╣реА тЬЕ рдореНрд╣рдгрддреЛ. рддреНрдпрд╛ рдлрдЯреАрд▓рд╛ рдПрдХ рдирд╛рд╡ рдЖрд╣реЗ, drift, рдЖрдгрд┐ рддрд┐рдЪрд╛ рдЙрдкрд╛рдп mailroom рдордзреНрдпреЗ рдирд╡реНрд╣реЗ рддрд░
cluster рдЪреНрдпрд╛ рдЖрдд рд░рд╛рд╣рддреЛ. рддреАрдЪ ArgoCD рд╢рд╛рд│рд╛:
L04
рдлрдЯреА рдореЛрдЬрддреЛ, L05
git рд▓рд╛ рд╕рддреНрдпрд╛рдЪрд╛ рдПрдХрдореЗрд╡ рд╕реНрд░реЛрдд рдЖрдгрд┐ pull рдХрд░реВрди рд╕реНрд╡рддрдГрд▓рд╛ рджреБрд░реБрд╕реНрдд рдХрд░рдгрд╛рд░рд╛ agent рдпрд╛рдВрдЪреА рдУрд│рдЦ рдХрд░реВрди рджреЗрддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
Poster рд╡рд░ рдЖрдзреАрдЪ тАФ ci.yml:
permissions:
contents: read # lesson 06: the job's own token gets the least it needs
concurrency: # a newer push cancels the older run of the same branch
group: ci-${{ github.ref }}
cancel-in-progress: true
Jenkinsfile рдШрдбреНрдпрд╛рд│ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рд▓рд┐рд╣рд┐рддреЛ:
options { timestamps(); disableConcurrentBuilds() }
options { timeout(time: 2, unit: 'DAYS') }
Poster рд╡рд░ рдЕрдЬреВрди рдирд╛рд╣реА тАФ files рд╡рд╛рдЪрд╛рдпрд▓рд╛ рд╕реЛрдкреНрдпрд╛ рд░рд╛рд╣рд╛рд╡реНрдпрд╛рдд рдореНрд╣рдгреВрди рд╣рд╛ рдХреЛрд░реНрд╕ @v4 major tags рдареЗрд╡рддреЛ;
production repo pin рдХрд░рддреЗ рдЖрдгрд┐ pins рдкреБрдвреЗ рд╕рд░рдХрд╡рдгреНрдпрд╛рдЪреЗ рдХрд╛рдо bot рд▓рд╛ рджреЗрддреЗ:
# illustrative тАФ pinned and time-boxed
jobs:
test:
timeout-minutes: 10 # a hung job fails instead of waiting for hours
steps:
- uses: actions/checkout@<full-40-char-sha> # v4.x тАФ Dependabot/Renovate bump the pin
# illustrative тАФ the same idea for an image, an orb, and a provenance statement
FROM node:22-alpine@sha256:<digest>
orbs: { aws-cli: circleci/aws-cli@5.1.<patch> } # full x.y.z, not a floating 5.1
- uses: actions/attest-build-provenance@<pinned> # after the image push; needs attestations: write
Branch protection рдЖрдгрд┐ secret scanning рд╣реЗ repository settings рдЖрд╣реЗрдд, files рдирд╛рд╣реАрдд:
рддреБрдордЪреНрдпрд╛ fork рдордзреНрдпреЗ, Settings тЖТ Branches (рдХрд┐рдВрд╡рд╛ Rules) main рд╕рд╛рдареА рдЕрд╕рд╛ рдирд┐рдпрдо рдЬреЛрдбрддреЗ рдЬреЛ
pull request рдЖрдгрд┐ test (node 20|22|24) checks рдЖрд╡рд╢реНрдпрдХ рдХрд░рддреЛ; Settings тЖТ Code
security secret scanning рдЖрдгрд┐ push protection рдЪрд╛рд▓реВ рдХрд░рддреЗ. Menu рдЪреА рдирд╛рд╡реЗ рдмрджрд▓рддрд╛рдд;
рдХрд▓реНрдкрдирд╛ рдмрджрд▓рдд рдирд╛рд╣реА.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# 1) how pinned are we? list the floating references in the four dialects
grep -nE "uses: .*@v[0-9]" .github/workflows/*.yml # major tags тАФ readable, not pinned
grep -nE "image: cimg|aws-cli@|^FROM " .circleci/config.yml app/Dockerfile # image tags and an orb, no digest
# 2) resolve one digest so you know what a pin looks like (needs Docker)
docker pull node:22-alpine >/dev/null && docker inspect --format '{{index .RepoDigests 0}}' node:22-alpine
# 3) the flaky-test drill: run the suite 10 times; one тЭМ means quarantine + fix, not retry
for i in $(seq 1 10); do (cd app && node --test >/dev/null 2>&1) && printf тЬЕ || printf тЭМ; done; echo
# 4) a rough deployment-frequency baseline from your fork's run history
gh run list --workflow=ship.yml --limit=20 --json conclusion,createdAt,updatedAt
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- flaky job рд▓рд╛ retry count рдЬреЛрдбреВрди рдкреБрдвреЗ рдЬрд╛рдгреЗ тАФ failure rate рдХрдореА рдЭрд╛рд▓рд╛ рдирд╛рд╣реА, рддреЛ рдЕрдВрдзрд╛рд░рд╛рдд рдЧреЗрд▓рд╛
actions/checkoutSHA рд╡рд░ pin рдХрд░рдгреЗ рдкрдгnode:22-alpine,cimg/aws:2024.03рдЖрдгрд┐ orb рддрд░рдВрдЧрддреЗ рдареЗрд╡рдгреЗ тАФ pin рд╣рд╛ рд╕рд░реНрд╡рд╛рдд рд╕реИрд▓ pin рдЗрддрдХрд╛рдЪ рдЪрд╛рдВрдЧрд▓рд╛ рдЕрд╕рддреЛ- рд╣рд┐рд░рд╡реА pipeline рдореНрд╣рдгрдЬреЗ cluster git рд╢реА рдЬреБрд│рддреЛ рдпрд╛рдЪрд╛ рдкреБрд░рд╛рд╡рд╛ рдорд╛рдирдгреЗ тАФ рддреА рдлрдХреНрдд рд╢реЗрд╡рдЯрдЪреА рд╡реНрд╣реЕрди рдлреЗрд░реА рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реА рд╣реЗ рд╕рд┐рджреНрдз рдХрд░рддреЗ; рддреНрдпрд╛рдирдВрддрд░ рдлрд▓рдХрд╛рд╡рд░ рдХрд╛рдп рдШрдбрд▓реЗ рддреА ArgoCD рд╢рд╛рд│реЗрдЪреА рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗ
ЁЯОУ рдкрджрд╡реА рдкрд░реАрдХреНрд╖рд╛ тАФ рд╣реЗ рд╕рдордЬрд╛рд╡рддрд╛ рдпреЗрддреЗ рдХрд╛?
рдПрдХ developer pull request рдЙрдШрдбрддреЗ. CI Node 20, 22 рдЖрдгрд┐ 24 рд╡рд░ tests рдЪрд╛рд▓рд╡рддреЗ рдЖрдгрд┐ JUnit report upload рдХрд░рддреЗ.
mainрдордзреНрдпреЗ merge рдЭрд╛рд▓реНрдпрд╛рд╡рд░ pipeline рдПрдХ image build рдХрд░рддреЗ, container рдЪреА smoke-test рдХрд░рддреЗ, рдкреВрд░реНрдг commit SHA рдЪрд╛ tag рд▓рд╛рд╡реВрди рддреА ECR рд▓рд╛ push рдХрд░рддреЗ,stagingрд▓рд╛ deploy рдХрд░рддреЗ, rollout рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддреЗ, рдЖрдгрд┐ reviewerproductionapprove рдХрд░реЗрдкрд░реНрдпрдВрдд рдерд╛рдВрдмрддреЗ.
- рдкрд╣рд┐рд▓рд╛ run рдХреЛрдгрддреНрдпрд╛ event рдиреЗ рд╕реБрд░реВ рдЭрд╛рд▓рд╛, рдЖрдгрд┐ рджреБрд╕рд░рд╛ рдХреЛрдгрддреНрдпрд╛?
- Cache step hit рдЖрд╣реЗ рдХреА miss рд╣реЗ рдХрд╛рдп рдард░рд╡рддреЗ?
- Build job рдЖрдгрд┐ push job рдпрд╛рдВрдЪреНрдпрд╛рдордзреНрдпреЗ рдХрд╛рдп рдкреНрд░рд╡рд╛рд╕ рдХрд░рддреЗ, рдЖрдгрд┐ рддреЛ cache рдХрд╛ рдирд╛рд╣реА?
- рд╕рд╛рдард╡рд▓реЗрд▓реНрдпрд╛ key рд╢рд┐рд╡рд╛рдп push job рд▓рд╛ AWS credentials рдХрд╕реЗ рдорд┐рд│рддрд╛рдд?
- Image tag рдХрд╛рдп рдЖрд╣реЗ, рдЖрдгрд┐
latestрдРрд╡рдЬреА рддреЛрдЪ рдХрд╛? APP_VERSIONрд▓рд╛ рдХрд╛рдп value рджрд┐рд▓реА рдЬрд╛рддреЗ, рдЖрдгрд┐ рддреА рдкрд░рдд рдХреБрдареЗ рд╡рд╛рдЪрддрд╛ рдпреЗрддреЗ?- рдХреЛрдгрддреА рдУрд│, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд рдХреЛрдгрддреЗ repository setting,
productionрд▓рд╛ approval gate рдмрдирд╡рддреЗ? - рдирд╡рд╛ pod рддреБрдЯрд▓реЗрд▓рд╛ рдЕрд╕реЗрд▓ рддрд░ rolling update рдХрд╢рд╛рдореБрд│реЗ рдерд╛рдВрдмрддреЛ?
- Rollback рдЪреЗ рджреЛрди рдорд╛рд░реНрдЧ рдХреЛрдгрддреЗ, рдЖрдгрд┐ рдЖрдзреА рдХреЛрдгрддрд╛ рд╡рд╛рдкрд░рд╛рд╡рд╛?
- рдпрд╢рд╕реНрд╡реА production job рдирдВрддрд░ рдПрдХрд╛ рддрд╛рд╕рд╛рдиреЗ pipeline рд▓рд╛ cluster рдмрджреНрджрд▓ рдХрд╛рдп рдорд╛рд╣реАрдд рдЕрд╕рддреЗ?
рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрддрд░ рдПрдХрд╛ рд╡рд╛рдХреНрдпрд╛рдд рдЖрд▓реЗ, рддрд░ рддреБрдордЪреА рд╣реА рд╢рд╛рд│рд╛ рдкреВрд░реНрдг рдЭрд╛рд▓реА.
ЁЯОУ рдорд╛рд▓рд┐рдХрд╛ тАФ рддреБрдореНрд╣реА рдЖрддрд╛ рдХреБрдареЗ рдЖрд╣рд╛рдд
рддреБрдореНрд╣реА Ops track рдЪрд╛ рдерд╛рдВрдмрд╛ 3я╕ПтГг рдкреВрд░реНрдг рдХреЗрд▓рд╛ рдЖрд╣реЗ. рдПрдХ рдерд╛рдВрдмрд╛ рдЙрд░рд▓рд╛ рдЖрд╣реЗ:
- 0я╕ПтГг тШБя╕П Learn AWS School тАФ account, IAM, robots рд╕рд╛рдареА badges
- 1я╕ПтГг ЁЯН▒ Learn Docker School тАФ рдбрдмрд╛ рднрд░рддреЗ рдЖрдгрд┐ рддреЛ ECR рдордзреНрдпреЗ рдареЗрд╡рддреЗ
- 2я╕ПтГг тШ╕я╕П Learn Kubernetes School тАФ рддреЛ рдЪрд╛рд▓рд╡рддреЗ: pods, Services, probes, rollouts
- 3я╕ПтГг ЁЯУо Learn CI/CD School тАФ рд╣рд╛ рдХреЛрд░реНрд╕ тАФ рддрдкрд╛рд╕рддреЛ, copy рдХрд░рддреЛ, рдкреЛрд╣реЛрдЪрд╡рддреЛ
- 4я╕ПтГг ЁЯдЦ Learn ArgoCD School тАФ рдирдВрддрд░ cluster рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдареЗрд╡рддреЗ: git рд╣реЗрдЪ рд╕рддреНрдп, self-heal, drift рд╕рдВрдкрд▓рд╛
рддрдкрд╛рд╕рд╛. Copy рдХрд░рд╛. рдкреЛрд╣реЛрдЪрд╡рд╛. рдордЧ git рд▓рд╛ рддреЗ рддрд╕реЗрдЪ рдареЗрд╡реВ рджреНрдпрд╛. ЁЯУоЁЯЪЪЁЯдЦ
git checkout main