ЁЯУо рдзрдбрд╛ 03 тАФ CI/CD push: courier robot рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА deploy рдХрд░рддреЛ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-drift-problem ┬╖ рдкреБрдвреЗ: lesson-04-limits-of-push
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ02, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд рдкрд╣рд┐рд▓рд╛ рдЦрд░рд╛ рдЙрдкрд╛рдп: рдкреНрд░рддреНрдпреЗрдХ push рд╡рд░ test, build рдЖрдгрд┐ deploy рдХрд░рдгрд╛рд░реА CI/CD pipeline тАФ рдореНрд╣рдгрдЬреЗ push model, рдЬреНрдпрд╛рдд рдмрд╛рд╣реЗрд░рдЪреА рдПрдЦрд╛рджреА system рдмрджрд▓ рдЬреЛрд░рд╛рдиреЗ cluster рдордзреНрдпреЗ рдврдХрд▓рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдореБрд▓реЗ рд╣рд╛рддрд╛рдиреЗ рдЧреГрд╣рдкрд╛рда рдкреЛрд╣реЛрдЪрд╡рддрд╛рдд рдпрд╛рд▓рд╛ рд╢рд╛рд│рд╛ рдХрдВрдЯрд╛рд│рд▓реА, рдореНрд╣рдгреВрди рддрд┐рдиреЗ рдПрдХ
courier robot ЁЯУо рдХрд╛рдорд╛рд╡рд░ рдареЗрд╡рд▓рд╛. рдЖрддрд╛ рддреБрдореНрд╣реА рдлрдХреНрдд рддреБрдордЪрд╛ рдЧреГрд╣рдкрд╛рда рдЯрдкрд╛рд▓рдкреЗрдЯреАрдд рдЯрд╛рдХрддрд╛
(git push) рдЖрдгрд┐ robot рджрд░ рд╡реЗрд│реА рдЕрдЧрджреА рддреНрдпрд╛рдЪ рдкрд╛рдпрд▒реНрдпрд╛ рдХрд░рддреЛ:
- рддрдкрд╛рд╕рддреЛ тЬЕ тАФ рд╢реБрджреНрдзрд▓реЗрдЦрди рдЖрдгрд┐ рдЧрдгрд┐рдд (tests рдЪрд╛рд▓рд╡рддреЛ). рд╡рд╛рдИрдЯ рдЧреГрд╣рдкрд╛рда рдХрдзреАрдЪ рдЯрдкрд╛рд▓рдЦреЛрд▓реАрддреВрди рдмрд╛рд╣реЗрд░ рдкрдбрдд рдирд╛рд╣реА.
- рдЭреЗрд░реЙрдХреНрд╕ рдХрд╛рдврддреЛ ЁЯН▒ тАФ рдЕрдзрд┐рдХреГрдд рдкреНрд░рдд (container image build рдХрд░рддреЛ).
- рдкреНрд░рдд рдЬрдкреВрди рдареЗрд╡рддреЛ ЁЯЧДя╕П тАФ рдХрдкрд╛рдЯрд╛рдд (registry рд▓рд╛ push рдХрд░рддреЛ).
- рдкреЛрд╣реЛрдЪрд╡рддреЛ ЁЯЪЪ тАФ рдЧрд╛рдбреА рдЪрд╛рд▓рд╡рдд рд╢рд╛рд│реЗрдд рдЬрд╛рддреЛ, рд╕реНрд╡рддрдГрдХрдбрдЪреНрдпрд╛ deployment credentials ЁЯФС рдиреЗ рджрд╛рд░ рдЙрдШрдбрддреЛ (рд╕рдЧрд│реНрдпрд╛рдд рд╡рд╛рдИрдЯ рдореНрд╣рдгрдЬреЗ рд╕рд╛рдард╡рд▓реЗрд▓реЗ kubeconfig, рд╕рдЧрд│реНрдпрд╛рдд рдЪрд╛рдВрдЧрд▓реЗ рдореНрд╣рдгрдЬреЗ рдереЛрдбреНрдпрд╛ рдХрд╛рд│рд╛рд╕рд╛рдареАрдЪрд╛ OIDC badge), рдЖрдгрд┐ рд╕рдЧрд│реЗ рдЬрд╛рдЧреЗрд╡рд░ рд▓рд╛рд╡рддреЛ (
kubectl apply).
рдЦреВрдк рдореЛрдареА рд╕реБрдзрд╛рд░рдгрд╛! рдЖрддрд╛ рд╡рд┐рд╕рд░рд▓реЗрд▓реНрдпрд╛ рдкрд╛рдпрд▒реНрдпрд╛ рдирд╛рд╣реАрдд, "рдорд╛рдЭреНрдпрд╛ machine рд╡рд░ рдЪрд╛рд▓рддреЗ" рдирд╛рд╣реА, рдЖрдгрд┐ рдЯрдкрд╛рд▓рдЦреЛрд▓реАрдд рдкреЛрд╣реЛрдЪрд╡рдгреНрдпрд╛рдЪреА рдиреЛрдВрджрд╡рд╣реА рдЖрд╣реЗ. рдкрдг рддреНрдпрд╛ credentials рд╡рд░ рд▓рдХреНрд╖ рдареЗрд╡рд╛ тАФ рдЖрдгрд┐ robot рдирд┐рдШреВрди рдЧреЗрд▓реНрдпрд╛рд╡рд░ рдирдВрддрд░ рдХрд╛рдп рд╣реЛрддреЗ рддреНрдпрд╛рд╡рд░рд╣реАтАж (рдзрдбрд╛ 04 ЁЯШИ)
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
dev["ЁЯзСтАНЁЯТ╗ dev<br/>git push"]
subgraph ci["ЁЯУо the courier robot - CI/CD"]
t["тЬЕ test"] --> b["ЁЯН▒ build image"] --> r["ЁЯЧДя╕П registry"]
end
cluster["ЁЯПл cluster<br/>kubectl apply from OUTSIDE<br/>with deployment credentials ЁЯФС"]
dev -->|"1"| ci
r -->|"3 PUSH deploy"| cluster
t -.->|"2 bad code stops here"| dev
тЭУ рдХрд╛рдп
- CI (Continuous Integration): рдкреНрд░рддреНрдпреЗрдХ push рдЖрдкреЛрдЖрдк test рдЖрдгрд┐ build рд╣реЛрддреЛ.
- CD (Continuous Delivery/Deployment): build рдЭрд╛рд▓реЗрд▓реЗ artifact рдЖрдкреЛрдЖрдк release рд╣реЛрддреЗ. рджреЛрдиреНрд╣реА рдорд┐рд│реВрди: рдЖрддрд╛ рдХреЛрдгреАрдЪ рд╣рд╛рддрд╛рдиреЗ deploy рдХрд░рдд рдирд╛рд╣реА.
- Push model: рдмрд╛рд╣реЗрд░реВрди cluster рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рд╕рд╛рдареА pipeline рд▓рд╛ deployment credentials рд▓рд╛рдЧрддрд╛рдд тАФ рд╕рдЧрд│реНрдпрд╛рдд рд╕рд╛рдзреНрдпрд╛ setup рдордзреНрдпреЗ CI secret рдореНрд╣рдгреВрди рд╕рд╛рдард╡рд▓реЗрд▓реЗ kubeconfig, рдХрд┐рдВрд╡рд╛ OIDC рджреНрд╡рд╛рд░реЗ рдорд┐рд│рд╡рд▓реЗрд▓реЗ рдереЛрдбреНрдпрд╛ рдХрд╛рд│рд╛рдЪреЗ credentials (CI/CD рд╢рд╛рд│рд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕рд╛рдард╡рд▓реЗрд▓реНрдпрд╛ keys рд╢рд┐рд╡рд╛рдп OIDC рд╢рд┐рдХрд╡рддреЗ; Docker рд╢рд╛рд│реЗрдЪрд╛ рдзрдбрд╛ 12 рддреЗ ECR рд╕рд╛рдареА рджрд╛рдЦрд╡рддреЛ, рдЖрдгрд┐ рд╣реАрдЪ рдХрд▓реНрдкрдирд╛ EKS рд╕рд╛рдареАрд╣реА рдЪрд╛рд▓рддреЗ). рдХрд╕реЗрд╣реА рдЕрд╕рд▓реЗ рддрд░реА, рдмрд╛рд╣реЗрд░рдЪреА system рдмрджрд▓ рдЖрдд рдврдХрд▓рддреЗ.
- рдиреЗрдордХреЗ рд╣реЗрдЪ
Kubernetes рдХреЛрд░реНрд╕рдЪреА CircleCI pipeline
рдХрд░рддреЗ: test тЖТ build тЖТ ECR рд▓рд╛ push тЖТ manual approval тЖТ
kubectl apply.
ЁЯдФ рдХрд╛
Pipeline рдзрдбрд╛ 01 рдордзрд▓реНрдпрд╛ рдорд╛рдгрд╕рд╛рдВрдЪреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рддреЗ: рд╡рд┐рд╕рд░рд▓реЗрд▓реНрдпрд╛ рдкрд╛рдпрд▒реНрдпрд╛, рд╡рдЧрд│рд▓реЗрд▓реНрдпрд╛ tests, рдПрдХрд╛рдЪ рд╡реНрдпрдХреНрддреАрдХрдбрдЪреЗ рдЬреНрдЮрд╛рди, рдкреЛрд╣реЛрдЪрд╡рдгреНрдпрд╛рдЪреА рдиреЛрдВрдж рдирд╕рдгреЗ. рдкреНрд░рддреНрдпреЗрдХ deploy рдЖрддрд╛ рдПрдЦрд╛рджреНрдпрд╛ commit рдкрд░реНрдпрдВрдд рдорд╛рдЧреЛрд╡рд╛ рдШреЗрддрд╛ рдпреЗрддреЛ рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛ рдХрд░рддрд╛ рдпреЗрддреЛ. рдПрд╡рдвреЗрдЪ рд╣реА рдПрдХ рдкреНрд░рдЪрдВрдб, рдЦрд░реА рд╕реБрдзрд╛рд░рдгрд╛ рдЖрд╣реЗ тАФ рдмрд╣реБрддреЗрдХ teams рдиреА ArgoCD рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдгреНрдпрд╛рдЖрдзреА рдЗрдердкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд╛рдпрд▓рд╛ рд╣рд╡реЗ.
ЁЯФз рдХрд╕реЗ (рдПрдХ рдЫреЛрдЯреЗ рдЙрджрд╛рд╣рд░рдг)
GitHub Actions рдордзрд▓рд╛ push-style deploy job рдЕрд╕рд╛ рджрд┐рд╕рддреЛ (рдлрдХреНрдд рдЙрджрд╛рд╣рд░рдгрд╛рд╕рд╛рдареА тАФ рдЦрд░реЗ cluster credentials commit рдХрд░реВ рдирдХрд╛, CI secrets рд╡рд╛рдкрд░рд╛):
# .github/workflows/deploy.yml (example тАФ the k8s course uses CircleCI, same idea)
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: echo "$KUBECONFIG_DATA" | base64 -d > kubeconfig # ЁЯФС deployment credentials тАФ here a stored kubeconfig; see the OIDC note
env: { KUBECONFIG_DATA: ${{ secrets.KUBECONFIG_DATA }} }
- run: KUBECONFIG=kubeconfig kubectl apply -f k8s/ # push it in
- run: KUBECONFIG=kubeconfig kubectl -n gitops-school rollout status deploy/hello-school
рдЖрддреНрддрд╛ рдХрд╛рдп рдЭрд╛рд▓реЗ рддреЗ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛: cluster рдЪреА key рдЖрддрд╛ cluster рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рд░рд╛рд╣рддреЗ, CI system рдЪреНрдпрд╛ secret store рдордзреНрдпреЗ. рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛.
ЁЯкк рд╕рд╛рдард╡рд▓реЗрд▓реА key рд╡рд┐рд░реБрджреНрдз OIDC. рд╣реЗ рдЙрджрд╛рд╣рд░рдг kubeconfig CI secret рдореНрд╣рдгреВрди рд╕рд╛рдард╡рддреЗ тАФ рд╕рдЧрд│реНрдпрд╛рдд рд╕реЛрдкрд╛ рдЖрдгрд┐ рд╕рдЧрд│реНрдпрд╛рдд рдХрдореА рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рдХрд╛рд░. рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓рд╛ рдкреНрд░рдХрд╛рд░ рдореНрд╣рдгрдЬреЗ CI/CD рд╢рд╛рд│рд╛ рдЬреЗ рд╢рд┐рдХрд╡рддреЗ тАФ рдЖрдгрд┐ Docker рд╢рд╛рд│реЗрдЪрд╛ рдзрдбрд╛ 12 ECR рд╕рд╛рдареА рдЬреЗ рдХрд░рддреЛ: job OIDC рджреНрд╡рд╛рд░реЗ рдЖрдкрд▓реА рдУрд│рдЦ рд╕рд┐рджреНрдз рдХрд░рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ рдереЛрдбреНрдпрд╛ рдХрд╛рд│рд╛рдЪреЗ credential рдорд┐рд│рддреЗ (EKS рд╕рд╛рдареА:
role-to-assumeрдирдВрддрд░aws eks update-kubeconfig). CI рдордзреНрдпреЗ рджреАрд░реНрдШрдХрд╛рд│ рдЯрд┐рдХрдгрд╛рд░реА key рдмрд╕реВрди рд░рд╛рд╣рдд рдирд╛рд╣реА тАФ рдкрдг pipeline рд▓рд╛ рдмрд╛рд╣реЗрд░реВрди рдЖрдд рдпреЗрдгреНрдпрд╛рдЪрд╛ рдХреЛрдгрддрд╛ рддрд░реА рдорд╛рд░реНрдЧ рд▓рд╛рдЧрддреЛрдЪ, рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ рдЕрд░реНрде рдХрд╛рдп рд╣рд╛ рдзрдбрд╛ 04 рдЪрд╛ рд╡рд┐рд╖рдп рдЖрд╣реЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (robot рдЪреЗ local simulation)
# play courier robot yourself тАФ the exact steps a pipeline runs:
kubectl diff -f k8s/ || true # 1. what would change?
kubectl apply -f k8s/ # 2. deliver
kubectl -n gitops-school rollout status deploy/hello-school # 3. confirm it landed
# the pipeline's superpower is that it NEVER does it differently.
# your superpower is that you now know each step it automates.
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
Robot рдЪреЗ local simulation рдХрд░рддрд╛рдирд╛, рд╢реЗрд╡рдЯрдЪреА command тАФ kubectl -n gitops-school rollout status deploy/hello-school тАФ successfully rolled out рдЫрд╛рдкрддреЗ. рдЦрд▒реНрдпрд╛ pipeline рдордзреНрдпреЗ: рд╣рд┐рд░рд╡рд╛ job, рдЖрдгрд┐ kubectl -n gitops-school get deploy hello-school -o jsonpath='{.spec.template.spec.containers[0].image}' рдиреЗрдордХрд╛ рддреНрдпрд╛ job рдиреЗ build рдХреЗрд▓реЗрд▓рд╛ tag рджрд╛рдЦрд╡рддреЗ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
рдХрд╛рд╣реАрдЪ install рдЭрд╛рд▓реЗ рдирд╛рд╣реА. рддреБрдореНрд╣реА fork рд╡рд░ рдЦрд░рд╛ workflow рдмрдирд╡рд▓рд╛ рдЕрд╕реЗрд▓, рддрд░ рдХрд╛рдо рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рд╕рд╛рдард╡рд▓реЗрд▓реЗ kubeconfig secret delete рдХрд░рд╛ тАФ рддреЗ рддреБрдордЪреНрдпрд╛ cluster рдЪреЗ credential рдЖрд╣реЗ, рдЕрдЧрджреА local cluster рдЕрд╕рд▓реЗ рддрд░реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- cluster-admin kubeconfig CI secrets рдордзреНрдпреЗ рдЪрд┐рдХрдЯрд╡рдгреЗ рдЖрдгрд┐ рдХрд╛рдо рдЭрд╛рд▓реЗ рдЕрд╕реЗ рдорд╛рдирдгреЗ тАФ рддреНрдпрд╛рдЪреА рд╡реНрдпрд╛рдкреНрддреА рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рд╛, рдХрд┐рдВрд╡рд╛ рдЕрдЬреВрди рдЪрд╛рдВрдЧрд▓реЗ, OIDC рджреНрд╡рд╛рд░реЗ рдереЛрдбреНрдпрд╛ рдХрд╛рд│рд╛рдЪреЗ credentials рдорд┐рд│рд╡рд╛ (CI/CD рд╢рд╛рд│рд╛, Docker рд╢рд╛рд│рд╛ L12)
- tests fail рдЭрд╛рд▓реНрдпрд╛ рддрд░реА deploy step рдЪрд╛рд▓реВ рджреЗрдгреЗ (job ordering /
needs:) :latestdeploy рдХрд░рдгреЗ тАФ рдордЧ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХрд╛рдп ship рдЭрд╛рд▓реЗ рддреЗ pipeline рд╕рд╛рдВрдЧреВ рд╢рдХрдд рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рдЦрд▒реНрдпрд╛ deployments рдкреИрдХреА рдмрд╣реБрддреЗрдХ push pipelines рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛ рд╣рд╛рддрд╛рдиреЗ deploy рдХрд░рдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЦрд░реА рд╕реБрдзрд╛рд░рдгрд╛ рдЖрд╣реЗрдд. ArgoCD рдХрдбреЗ рд╡рд│рдгреНрдпрд╛рдЖрдзреА рддреНрдпрд╛ рдиреАрдЯ рдХрд░рд╛ тАФ рдереЛрдбреНрдпрд╛ рдХрд╛рд│рд╛рдЪреЗ credentials, tag = commit SHA, рдлрд╛рдЯрдХ рдореНрд╣рдгреВрди
rollout status. GitOps рдПрдХ reconcile loop рдЬреЛрдбрддреЗ; рддреЗ CI рдЪреА рдЬрд╛рдЧрд╛ рдШреЗрдд рдирд╛рд╣реА.
тПня╕П рдкреБрдвреЗ
Courier рдЫрд╛рди рдЖрд╣реЗ тАФ рдордЧ рдпрд╛ рдХреЛрд░реНрд╕рдЪрд╛ рднрд╛рдЧ 2 рдХрд╛ рдЖрд╣реЗ? рдХрд╛рд░рдг courier рдЬреЗ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА рддреНрдпрд╛рдореБрд│реЗ. рдзрдбрд╛ 04 рддреНрдпрд╛ рддреНрд░реБрдЯреА рдореЛрдЬрддреЛ.
git checkout lesson-04-limits-of-push