เบเบฒเบ™เบฅเบถเบšเบชเบฒเบ‚เบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ—เบตเปˆเบฅเป‰เบฒเบชเบฐเป„เปเบขเบนเปˆเปƒเบ™เบเบธเปˆเบก Kubernetes

เบเบฒเบ™เบฅเบถเบšเบชเบฒเบ‚เบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ—เบตเปˆเบฅเป‰เบฒเบชเบฐเป„เปเบขเบนเปˆเปƒเบ™เบเบธเปˆเบก Kubernetes

Hello! เบชเบฒเบ‚เบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” (aka deploy preview, review app) - เบ™เบตเป‰เปเบกเปˆเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบ‚เบฒเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบ–เบทเบเบ™เปเบฒเป„เบ›เปƒเบŠเป‰, เปเบ•เปˆเบเบฑเบ‡เปเบ•เปˆเบฅเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡เป„เบ›เบซเบฒ URL เบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบœเบฐเบฅเบดเบ”; เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ”เบถเบ‡, เปเบ•เปˆเบฅเบฐ commit เปƒเบซเบกเปˆ deploy เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบซเบฑเบ”เป€เบเบปเปˆเบฒเบˆเบฐเบ–เบทเบเบฅเบถเบš, เปเบฅเบฐ deploy เปƒเบซเบกเปˆเบชเปเบฒเบฅเบฑเบšเบฅเบฐเบซเบฑเบ”เปƒเบซเบกเปˆเปเบกเปˆเบ™ rolled เบญเบญเบ. เบ„เปเบฒเบ–เบฒเบกเบญเบฒเบ”เบˆเบฐเป€เบเบตเบ”เบ‚เบทเป‰เบ™เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เบฅเบงเบกเป€เบญเบปเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบชเบฒเบ‚เบฒเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš. เบ—เปˆเบฒเบ™เบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฒเบ‚เบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบญเบตเบเบ•เปเปˆเป„เบ›, เปเบ•เปˆเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ Kubernetes เบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบเบธเปˆเบก.

เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบชเบฒเบ‚เบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”

เบงเบดเบ—เบตเปœเบถเปˆเบ‡เปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เบชเบฒเบ‚เบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เปƒเบ™ Kubernetes เปเบกเปˆเบ™เบเบฒเบ™เปƒเบŠเป‰ namespaces. เปƒเบ™เบชเบฑเป‰เบ™, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบœเบฐเบฅเบดเบ”เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ:

kind: Namespace
apiVersion: v1
metadata:
  name: habr-back-end
...

kind: Deployment
apiVersion: apps/v1
metadata:
  namespace: habr-back-end
spec:
  replicas: 3
...

เบชเปเบฒเบฅเบฑเบšเบชเบฒเบ‚เบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”, namespace เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เบ”เป‰เบงเบเบ•เบปเบงเบฅเบฐเบšเบธเบ‚เบญเบ‡เบกเบฑเบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ”เบถเบ‡) เปเบฅเบฐเบšเบฒเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒ / postfix (เบ•เบปเบงเบขเปˆเบฒเบ‡, -pr-):

kind: Namespace
apiVersion: v1
metadata:
  name: habr-back-end-pr-17
...

kind: Deployment
apiVersion: apps/v1
metadata:
  namespace: habr-back-end-pr-17
spec:
  replicas: 1
...

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ‚เบฝเบ™ เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™ Kubernetes (เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ‚เบญเบ‡เบเบธเปˆเบก), เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เปƒเบ™ Github. เบกเบฑเบ™เป€เบญเบปเบฒ namespaces เบ—เบตเปˆเบ‚เบถเป‰เบ™เบเบฑเบšเบชเบฒเบ‚เบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เป€เบเบปเปˆเบฒ. เปƒเบ™ Kubernetes, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบฅเบถเบš namespace, เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบญเบทเปˆเบ™เป†เปƒเบ™ namespace เบ™เบฑเป‰เบ™เบเปเปˆเบˆเบฐเบ–เบทเบเบฅเบถเบšเป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”.

$ kubectl get pods --all-namespaces | grep -e "-pr-"
NAMESPACE            ... AGE
habr-back-end-pr-264 ... 4d8h
habr-back-end-pr-265 ... 5d7h

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบฒเบ‚เบฒเบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เป€เบ›เบฑเบ™เบเบธเปˆเบก เบ—เบตเปˆเบ™เบตเป‰ ะธ เบ—เบตเปˆเบ™เบตเป‰.

เปเบฎเบ‡เบเบฐเบ•เบธเป‰เบ™

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบขเบนเปˆเปƒเบ™เบงเบปเบ‡เบˆเบญเบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ”เบถเบ‡เปเบšเบšเบ›เบปเบเบเบฐเบ•เบดเบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡ (continuous integration):

  1. เบžเบงเบเป€เบฎเบปเบฒเบเบนเป‰เบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปƒเบซเบกเปˆเบเบฑเบšเบชเบฒเบ‚เบฒ.
  2. เปƒเบ™เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡, linters เปเบฅเบฐ / เบซเบผเบทเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™.
  3. เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ”เบถเบ‡ Kubernetes เปเบกเปˆเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™เบ—เบฑเบ™เบ—เบต (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ•เบปเบงเป€เบฅเบเบ‚เบญเบ‡เบกเบฑเบ™เบ–เบทเบเปƒเบชเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เปเบกเปˆเปเบšเบšเบชเปเบฒเป€เบฅเบฑเบ”เบฎเบนเบš).
  4. เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ kubectl เบ™เปเบฒเปƒเบŠเป‰, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบˆเบฐเบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆเบเบธเปˆเบก (เบ›เบฑเบšเปƒเบŠเป‰).
  5. เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡เบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบชเบฒเบ‚เบฒเปเบกเปˆเบšเบปเบ”.

เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ”เบถเบ‡, เปเบ•เปˆเบฅเบฐเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเปƒเบซเบกเปˆเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเป„เบ›เปƒเบŠเป‰เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบซเบฑเบ”เป€เบเบปเปˆเบฒเบˆเบฐเบ–เบทเบเบฅเบถเบšเบ–เบดเป‰เบก, เปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เปƒเบซเบกเปˆเบชเปเบฒเบฅเบฑเบšเบฅเบฐเบซเบฑเบ”เปƒเบซเบกเปˆเปเบกเปˆเบ™ rolled เบญเบญเบ. เปเบ•เปˆเป€เบกเบทเปˆเบญเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ”เบถเบ‡เป„เบ”เป‰เบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบชเบฒเบ‚เบฒเปเบกเปˆเบšเบปเบ”, เบกเบตเบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบ‚เบฒเปเบกเปˆเบšเบปเบ”เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบกเบฑเบ™เบ›เบฐเบเบปเบ”เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฅเบทเบกเปเบฅเป‰เบงเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ”เบถเบ‡, เปเบฅเบฐเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ Kubernetes เบ‚เบญเบ‡เบกเบฑเบ™เบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบเบธเปˆเบก.

เบงเบดเบ—เบตเปƒเบŠเป‰

เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ”เป‰เบงเบเบ„เปเบฒเบชเบฑเปˆเบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰:

$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.yml

เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบกเบตเป€เบ™เบทเป‰เบญเบซเบฒเบ•เปเปˆเป„เบ›เบ™เบตเป‰เปเบฅเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบœเปˆเบฒเบ™ kubectl apply -f:

apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
  name: stale-feature-branch
spec:
  namespaceSubstring: -pr-
  afterDaysWithoutDeploy: 3

Parameter namespaceSubstring เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเบเบฑเปˆเบ™เบ•เบญเบ‡ namespaces เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบถเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบˆเบฒเบ namespaces เบญเบทเปˆเบ™เป†. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ–เป‰เบฒเบเบธเปˆเบกเบกเบต namespaces เบ•เปเปˆเป„เบ›เบ™เบตเป‰: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบœเบนเป‰เบชเบฐเบซเบกเบฑเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฅเบถเบšเบˆเบฐเป€เบ›เบฑเบ™ habr-back-end-pr-17, habr-back-end-pr-33.

Parameter afterdaysWithoutDeploy เบ•เป‰เบญเบ‡เบเบฒเบ™เบฅเบถเบš namespaces เป€เบเบปเปˆเบฒ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ–เป‰เบฒ namespace เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™ 3 ะดะฝั 1 ั‡ะฐั เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™, เปเบฅเบฐเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™ 3 ะดะฝั, namespace เบ™เบตเป‰เบˆเบฐเบ–เบทเบเบฅเบถเบš. เบกเบฑเบ™เบเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเปƒเบ™เบ—เบดเบ”เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบกเบ–เป‰เบฒ namespace เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™ 2 ะดะฝั 23 ั‡ะฐัะฐ เบเบฑเบšเบ„เบทเบ™เป„เบ›เบšเปˆเบญเบ™, เปเบฅเบฐเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™ 3 ะดะฝั, namespace เบ™เบตเป‰เบˆเบฐเบšเปเปˆเบ–เบทเบเบฅเบถเบš.

เบกเบตเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบซเบ™เบถเปˆเบ‡, เบกเบฑเบ™เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเปเบเบ™ namespaces เบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบฅเบทเป‰เบญเบเป†เปเบฅเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบกเบทเป‰เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ - เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบ—เบธเบโ€‹เบ™เบฒโ€‹เบ—เบตโ€‹. เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบกเบฑเบ™เป€เบ—เบปเปˆเบฒเบเบฑเบš 30 ะผะธะฝัƒั‚ะฐะผ.

เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ™เบตเป‰

เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹, เบ—เปˆเบฒเบ™โ€‹เบˆเบฐโ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹:

  1. Docker เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเป‚เบ”เบ”เบ”เปˆเบฝเบง.
  2. เบกเบดเบ™เบดเบ„เบดเบš เบˆเบฐเบเบปเบเบเบธเปˆเบก Kubernetes เบขเบนเปˆเปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™.
  3. kubectl - เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป€เบชเบฑเป‰เบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบธเปˆเบก.

เบžเบงเบเป€เบฎเบปเบฒเบเบปเบเบเบธเปˆเบก Kubernetes เบขเบนเปˆเปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™:

$ minikube start --vm-driver=docker
minikube v1.11.0 on Darwin 10.15.5
Using the docker driver based on existing profile.
Starting control plane node minikube in cluster minikube.

เบฅเบฐเบšเบธเบงเปˆเบฒ kubectl เปƒเบŠเป‰เบเบธเปˆเบกเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ•เบฒเบกเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™:

$ kubectl config use-context minikube
Switched to context "minikube".

เบ”เบฒเบงเป‚เบซเบฅเบ”เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบœเบฐเบฅเบดเบ”:

$ curl https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.yml > stale-feature-branch-production-configs.yml

เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เบœเบฐเบฅเบดเบ”เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบžเบทเปˆเบญเบเบงเบ”เป€เบšเบดเปˆเบ‡ namespace เป€เบเบปเปˆเบฒ, เปเบฅเบฐเบเบธเปˆเบกเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบซเบกเปˆเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบกเบตเบžเบงเบเบกเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เปˆเบฝเบ™เบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก. IS_DEBUG เบชเบธเบ” true. เบ”เป‰เบงเบเบ„เปˆเบฒเบ™เบตเป‰เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต afterDaysWithoutDeploy เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เป€เบญเบปเบฒโ€‹เป€เบ‚เบปเป‰เบฒโ€‹เปƒเบ™โ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เปเบฅเบฐ namespaces เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบเบงเบ”โ€‹เบชเบญเบšโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบกเบทเป‰โ€‹เป‚เบ”เบโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹, เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบเบตเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹เบ‚เบญเบ‡ substring (-pr-).

เบ–เป‰เบฒเป€เบˆเบปเป‰เบฒเบขเบนเปˆ Linux:

$ sed -i 's|false|true|g' stale-feature-branch-production-configs.yml

เบ–เป‰เบฒเป€เบˆเบปเป‰เบฒเบขเบนเปˆ macOS:

$ sed -i "" 's|false|true|g' stale-feature-branch-production-configs.yml

เบเบฒเบ™โ€‹เบ•เบดเบ”โ€‹เบ•เบฑเป‰เบ‡โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹:

$ kubectl apply -f stale-feature-branch-production-configs.yml

เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบงเปˆเบฒเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เป„เบ”เป‰เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบเบธเปˆเบก StaleFeatureBranch:

$ kubectl api-resources | grep stalefeaturebranches
NAME                 ... APIGROUP                             ... KIND
stalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranch

เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป„เบ”เป‰เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบเบธเปˆเบก:

$ kubectl get pods --namespace stale-feature-branch-operator
NAME                                           ... STATUS  ... AGE
stale-feature-branch-operator-6bfbfd4df8-m7sch ... Running ... 38s

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป€เบšเบดเปˆเบ‡เบšเบฑเบ™เบ—เบถเบเบ‚เบญเบ‡เบกเบฑเบ™, เบกเบฑเบ™เบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเบ›เบธเบ‡เปเบ•เปˆเบ‡เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ StaleFeatureBranch:

$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Operator Version: 0.0.1"}
...
... "msg":"Starting EventSource", ... , "source":"kind source: /, Kind="}
... "msg":"Starting Controller", ...}
... "msg":"Starting workers", ..., "worker count":1}

เบžเบงเบเป€เบฎเบปเบฒเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบžเป‰เบญเบก fixtures (เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เปเบฅเป‰เบงเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เปเบšเบšเบˆเปเบฒเบฅเบญเบ‡เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบเบธเปˆเบก) เบชเปเบฒเบฅเบฑเบšเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ StaleFeatureBranch:

$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/stale-feature-branch.yml

เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบชเบฐโ€‹เปเบ”เบ‡โ€‹เปƒเบซเป‰โ€‹เป€เบซเบฑเบ™โ€‹เบเบฒเบ™โ€‹เบ„เบปเป‰เบ™โ€‹เบซเบฒโ€‹เบชเปเบฒโ€‹เบฅเบฑเบš namespaces เบเบฑเบš substring เป€เบ›เบฑเบ™โ€‹ -pr- เบ—เบธเบเป†เบ„เบฑเป‰เบ‡ 1 ะผะธะฝัƒั‚ัƒ.:

apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
  name: stale-feature-branch
spec:
  namespaceSubstring: -pr-
  afterDaysWithoutDeploy: 1 
  checkEveryMinutes: 1

เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เป„เบ”เป‰เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เปเบฅเบฐเบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเบเบงเบ”เบชเบญเบš namespaces:

$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Stale feature branch is being processing.","namespaceSubstring":"-pr-","afterDaysWithoutDeploy":1,"checkEveryMinutes":1,"isDebug":"true"}

เบ•เบดเบ”เบ•เบฑเป‰เบ‡ fixtures, เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบชเบญเบ‡ namespaces (project-pr-1, project-pr-2) เปเบฅเบฐโ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹ deployments, services, ingress, เปเบฅเบฐเบญเบทเปˆเบ™เป†:

$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/first-feature-branch.yml -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/second-feature-branch.yml
...
namespace/project-pr-1 created
deployment.apps/project-pr-1 created
service/project-pr-1 created
horizontalpodautoscaler.autoscaling/project-pr-1 created
secret/project-pr-1 created
configmap/project-pr-1 created
ingress.extensions/project-pr-1 created
namespace/project-pr-2 created
deployment.apps/project-pr-2 created
service/project-pr-2 created
horizontalpodautoscaler.autoscaling/project-pr-2 created
secret/project-pr-2 created
configmap/project-pr-2 created
ingress.extensions/project-pr-2 created

เบžเบงเบเป€เบฎเบปเบฒเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบขเปˆเบฒเบ‡เบชเปเบฒเป€เบฅเบฑเบ”เบœเบปเบ™:

$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 && kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2
...
NAME                              ... READY ... STATUS  ... AGE
pod/project-pr-1-848d5fdff6-rpmzw ... 1/1   ... Running ... 67s

NAME                         ... READY ... AVAILABLE ... AGE
deployment.apps/project-pr-1 ... 1/1   ... 1         ... 67s
...

เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบฅเบงเบก debug, namespaces project-pr-1 ะธ project-pr-2, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบญเบทเปˆเบ™เป†เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเบฅเบถเบšเบ—เบฑเบ™เบ—เบตเป‚เบ”เบเบšเปเปˆเบ•เป‰เบญเบ‡เบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต afterDaysWithoutDeploy. เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เปƒเบ™เบšเบฑเบ™เบ—เบถเบเบ‚เบญเบ‡เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™:

$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Namespace should be deleted due to debug mode is enabled.","namespaceName":"project-pr-1"}
... "msg":"Namespace is being processing.","namespaceName":"project-pr-1","namespaceCreationTimestamp":"2020-06-16 18:43:58 +0300 EEST"}
... "msg":"Namespace has been deleted.","namespaceName":"project-pr-1"}
... "msg":"Namespace should be deleted due to debug mode is enabled.","namespaceName":"project-pr-2"}
... "msg":"Namespace is being processing.","namespaceName":"project-pr-2","namespaceCreationTimestamp":"2020-06-16 18:43:58 +0300 EEST"}
... "msg":"Namespace has been deleted.","namespaceName":"project-pr-2"}

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ„เบงเบฒเบกเบžเป‰เบญเบกเบ‚เบญเบ‡เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™, เบžเบงเบเป€เบ‚เบปเบฒเบˆเบฐเบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐ Terminating (เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบฅเบถเบš) เบซเบผเบทเบ–เบทเบเบฅเบถเบšเปเบฅเป‰เบง (เบเบฒเบ™เบชเบปเปˆเบ‡เบญเบญเบเบ„เปเบฒเบชเบฑเปˆเบ‡เปเบกเปˆเบ™เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ).

$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 && kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2
...

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡ fixtures เบซเบผเบฒเบเบ„เบฑเป‰เบ‡เปเบฅเบฐเปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบžเบงเบเบกเบฑเบ™เบ–เบทเบเป‚เบเบเบเป‰เบฒเบเบญเบญเบเบžเบฒเบเปƒเบ™เบซเบ™เบถเปˆเบ‡เบ™เบฒเบ—เบต.

เบ—เบฒเบ‡เป€เบฅเบทเบญเบ

เบชเบดเปˆเบ‡เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบเบธเปˆเบก? เบกเบตเบซเบผเบฒเบเบงเบดเบ—เบตเบเบฒเบ™, เบžเบงเบเบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบšเปเปˆเบชเบปเบกเบšเบนเบ™เปเบšเบš (เปเบฅเบฐเบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เบซเบปเบงเบ‚เปเป‰), เปเบฅเบฐเบ—เบธเบเบ„เบปเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡เบงเปˆเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡:

  1. เบฅเบถเบšเบชเบฒเบ‚เบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบชเบฒเบ‚เบฒเปเบกเปˆเปเบšเบšเบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡.

    • เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฎเบนเป‰เบงเปˆเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒเบ—เบตเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบชเบฒเบ‚เบฒ namespace เบกเบตเบ•เบปเบงเบฅเบฐเบšเบธเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡ - เบ•เบปเบงเป€เบฅเบเบ‚เบญเบ‡เบกเบฑเบ™, เบซเบผเบทเบŠเบทเปˆเบ‚เบญเบ‡เบชเบฒเบ‚เบฒ, เบ•เบปเบงเบฅเบฐเบšเบธเบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเบฅเบฐเบšเบธเบขเบนเปˆเปƒเบ™เบ„เปเบฒเบซเบกเบฑเป‰เบ™เบชเบฑเบ™เบเบฒ.
    • เบเบฒเบ™เบชเป‰เบฒเบ‡เบชเบฒเบ‚เบฒเปเบกเปˆเบšเบปเบ”เบฅเบปเป‰เบกเป€เบซเบฅเบง. เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบ—เปˆเบฒเบ™เบกเบตเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰: เบ”เบฒเบงเป‚เบซเบฅเบ”เป‚เบ„เบ‡เบเบฒเบ™, เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš, เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™, เบเบฒเบ™เบ›เปˆเบญเบเบ•เบปเบง, เบชเบปเปˆเบ‡เบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™, เบฅเป‰เบฒเบ‡เบชเบฒเบ‚เบฒเบ„เบธเบ™เบ™เบฐเบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡เบชเบธเบ”เบ—เป‰เบฒเบ. เบ–เป‰เบฒเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบฅเบปเป‰เบกเป€เบซเบฅเบงเปƒเบ™เป€เบงเบฅเบฒเบชเบปเปˆเบ‡เบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบฅเบถเบšเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ cluster เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡.
    • เบ–เป‰เบฒเบšเปเปˆเบกเบตเบชเบฐเบžเบฒเบšเบเบฒเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก, เบเบฒเบ™เบฅเบถเบšเบชเบฒเบ‚เบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เปƒเบ™ master build เปเบกเปˆเบ™เบšเปเปˆเบˆเบฐเปเบˆเป‰เบ‡.

  2. เปƒเบŠเป‰ webhooks (เบ•เบปเบงเบขเปˆเบฒเบ‡).

    • เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบšเปเปˆเปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™ Jenkins, เบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ—เปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡. เป€เบกเบทเปˆเบญเปƒเบŠเป‰ webhooks, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ‚เบฝเบ™ script เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡เป€เบžเบทเปˆเบญเบ›เบธเบ‡เปเบ•เปˆเบ‡เบžเบงเบเบกเบฑเบ™. script เบ™เบตเป‰เบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเบˆเบฑเบ”เปƒเบชเปˆเปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš Jenkins, เป€เบŠเบดเปˆเบ‡เบเบฒเบเบ—เบตเปˆเบˆเบฐเบฎเบฑเบเบชเบฒ.

  3. เบเบฒเบ™เบ‚เบฝเบ™ Cronjob เปเบฅเบฐเป€เบžเบตเปˆเบกเบเบธเปˆเบก Kubernetes.

    • เปƒเบŠเป‰เป€เบงเบฅเบฒเปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เปเบฅเบฐเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™.
    • เบœเบนเป‰เบ›เบฐเบเบญเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เปเบฅเป‰เบง, เบ–เบทเบเบšเบฑเบ™เบ—เบถเบเปเบฅเบฐเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™.

เบ‚เปเบ‚เบญเบšเปƒเบˆเบ—เปˆเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบเบฑเบšเบšเบปเบ”เบ„เบงเบฒเบก. เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เปƒเบ™ Github.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™