рдирдорд╕реНрддреЗ! рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛ (рдЙрд░реНрдл рдбрд┐рдкреНрд▓реЛрдп рдкреНрд░рд┐рднреНрдпреВ, рд░рд┐рднреНрдпреБ рдПрдк) - рдпреЛ рддрдм рд╣реБрдиреНрдЫ рдЬрдм рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдорд╛рддреНрд░ рдирднрдИ рдЕрдирдиреНрдп URL рдорд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкрдирд┐ рдЧрд░рд┐рдиреНрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдХреЛрдб рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдгрдорд╛ рдХрд╛рдо рдЧрд░реНрдЫ рдХрд┐ рдЧрд░реНрджреИрди рднрдиреЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ; рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд╣рд░реВ рд╡рд╛ рдЙрддреНрдкрд╛рджрди рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрд╣рд░реВрд▓рд╛рдИ рджреЗрдЦрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫред рдЬрдм рддрдкрд╛рдЗрдБ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдорд╛ рдХрд╛рдо рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ, рдкреБрд░рд╛рдиреЛ рдХреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛рдБ рдХрдорд┐рдЯ рд╣рд╛рд▓рдХреЛ рдбрд┐рдкреНрд▓реЛрдп рдореЗрдЯрд╛рдЗрдиреНрдЫ, рд░ рдирдпрд╛рдБ рдХреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ рдбрд┐рдкреНрд▓реЛрдп рд░реЛрд▓ рдЖрдЙрдЯ рд╣реБрдиреНрдЫред рддрдкрд╛рдИрдВрд▓реЗ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛рдорд╛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдорд░реНрдЬ рдЧрд░реНрджрд╛ рдкреНрд░рд╢реНрдирд╣рд░реВ рдЙрдареНрди рд╕рдХреНрдЫрдиреНред рддрдкрд╛рдИрд▓рд╛рдИ рдЕрдм рдлреАрдЪрд░ рд╢рд╛рдЦрд╛рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрджреИрди, рддрд░ Kubernetes рд╕реНрд░реЛрддрд╣рд░реВ рдЕрдЭреИ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдЫрдиреНред
рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдердк
Kubernetes рдорд╛ рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛ рдмрдирд╛рдЙрди рдХреЛ рд▓рд╛рдЧреА рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╛рдорд╕реНрдерд╛рди рдХреЛ рдЙрдкрдпреЛрдЧ рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдЫред рдЫреЛрдЯрдХрд░реАрдорд╛, рдЙрддреНрдкрд╛рджрди рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:
kind: Namespace
apiVersion: v1
metadata:
name: habr-back-end
...
kind: Deployment
apiVersion: apps/v1
metadata:
namespace: habr-back-end
spec:
replicas: 3
...
рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛рдХреЛ рд▓рд╛рдЧрд┐, рдирд╛рдорд╕реНрдерд╛рди рдпрд╕рдХреЛ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдирдореНрдмрд░) рд░ рдХреЗрд╣реА рдкреНрд░рдХрд╛рд░рдХреЛ рдЙрдкрд╕рд░реНрдЧ/рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, -рдкреНрд░-):
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 рдЕрдкрд░реЗрдЯрд░ (рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЬрд╕рдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрд░реЛрддрд╣рд░реВрдорд╛ рдкрд╣реБрдБрдЪ рдЫ),
$ kubectl get pods --all-namespaces | grep -e "-pr-"
NAMESPACE ... AGE
habr-back-end-pr-264 ... 4d8h
habr-back-end-pr-265 ... 5d7h
рддрдкрд╛рдИрдВ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛рд╣рд░реВ рдХрд╕рд░реА рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ
рдкреНрд░реЗрд░рдгрд╛
рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг (continuous integration
):
- рд╣рд╛рдореА рд╢рд╛рдЦрд╛рдорд╛ рдирдпрд╛рдБ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдзрдХреНрдХрд╛ рджрд┐рдиреНрдЫреМрдВред
- рдирд┐рд░реНрдорд╛рдгрдорд╛, рд▓рд┐рдиреНрдЯрд░рд╣рд░реВ рд░/рд╡рд╛ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЪрд▓рд╛рдЗрдиреНрдЫред
- Kubernetes рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд╣рд░реВ рдЙрдбрд╛рдирдорд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫрдиреН (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрд╕рдХреЛ рдирдореНрдмрд░ рд╕рдорд╛рдкреНрдд рдЯреЗрдореНрдкреНрд▓реЗрдЯрдорд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реБрдиреНрдЫ)ред
- kubectl рд▓рд╛рдЧреВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд╣рд░реВ рдХреНрд▓рд╕реНрдЯрд░ (рдбрд┐рдкреНрд▓реЛрдп) рдорд╛ рдердкрд┐рдиреНрдЫрдиреНред
- рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛рдорд╛ рдорд░реНрдЬ рдЧрд░рд┐рдПрдХреЛ рдЫред
рдЬрдм рддрдкрд╛рдЗрдБ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдорд╛ рдХрд╛рдо рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ, рдкреБрд░рд╛рдиреЛ рдХреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛рдБ рдХрдорд┐рдЯ рд╣рд╛рд▓рдХреЛ рдбрд┐рдкреНрд▓реЛрдп рдореЗрдЯрд╛рдЗрдиреНрдЫ, рд░ рдирдпрд╛рдБ рдХреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ рдбрд┐рдкреНрд▓реЛрдп рд░реЛрд▓ рдЖрдЙрдЯ рд╣реБрдиреНрдЫред рддрд░ рдЬрдм рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛рдорд╛ рдорд░реНрдЬ рд╣реБрдиреНрдЫ, рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдорд╛рддреНрд░ рдирд┐рд░реНрдорд╛рдг рд╣реБрдиреЗрдЫред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдпреЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ рдХрд┐ рд╣рд╛рдореАрд▓реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдХреЛ рдмрд╛рд░реЗрдорд╛ рдмрд┐рд░реНрд╕реЗрдХрд╛ рдЫреМрдВ, рд░ рдпрд╕рдХреЛ 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
рдкрд░рд┐рдорд┐рддрд┐ namespaceSubstring рдЕрдиреНрдп рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВрдмрд╛рдЯ рдкреБрд▓ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рдлрд┐рд▓реНрдЯрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрджрд┐ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдирд┐рдореНрди рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рдЫрдиреН: 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
.
рдкрд░рд┐рдорд┐рддрд┐ afterDaysWithoutDeploy рдкреБрд░рд╛рдирд╛ рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рдореЗрдЯрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрджрд┐ рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ 3 ╨┤╨╜╤П 1 ╤З╨░╤Б
рдкрдЫрд╛рдбрд┐, рд░ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ 3 ╨┤╨╜╤П
, рдпреЛ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдЯрд┐рдиреЗрдЫред рдпрджрд┐ рдиреЗрдорд╕реНрдкреЗрд╕ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ рдпрд╕рд▓реЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛рдорд╛ рдкрдирд┐ рдХрд╛рдо рдЧрд░реНрджрдЫ 2 ╨┤╨╜╤П 23 ╤З╨░╤Б╨░
рдкрдЫрд╛рдбрд┐, рд░ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ 3 ╨┤╨╜╤П
, рдпреЛ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдЯрд┐рдиреЗ рдЫреИрдиред
рддреНрдпрд╣рд╛рдБ рдПрдЙрдЯрд╛ рдердк рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдЫ, рдпреЛ рд╕рдмреИ рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рдХрддрд┐ рдкрдЯрдХ рд╕реНрдХреНрдпрд╛рди рдЧрд░реНрдиреЗ рд░ рддреИрдирд╛рддреА рдмрд┐рдирд╛ рджрд┐рдирд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫ - рд╣рд░реЗрдХ рдорд┐рдиреЗрдЯ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдпреЛ рдмрд░рд╛рдмрд░ рдЫ 30 ╨╝╨╕╨╜╤Г╤В╨░╨╝
.
рдпреЛ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ
рдЕрднреНрдпрд╛рд╕ рдорд╛, рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫ:
рдбрдХрд░ рдПрдХ рдкреГрдердХ рд╡рд╛рддрд╛рд╡рд░рдг рдорд╛ рдХрд╛рдо рдХреЛ рд▓рд╛рдЧреАредMinikube рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рдЦрдбрд╛ рдЧрд░реНрдиреЗрдЫред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
рдЙрддреНрдкрд╛рджрди рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд╣рд░реВ рдкреБрд░рд╛рдиреЛ рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрди рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рд╣реБрдирд╛рд▓реЗ, рд░ рд╣рд╛рдореНрд░реЛ рдирдпрд╛рдБ рдЙрдард╛рдЗрдПрдХреЛ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рддреА рдЫреИрдирдиреН, рд╣рд╛рдореА рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ рдмрджрд▓реНрдиреЗрдЫреМрдВред IS_DEBUG
рдорд╛ true
ред рдпреЛ рдорд╛рди рд╕рдВрдЧ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ afterDaysWithoutDeploy
рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦрд┐рдПрдХреЛ рдЫреИрди рд░ рдирд╛рдорд╕реНрдерд╛рдирд╣рд░реВ рдбрд┐рдкреНрд▓реЛрдЗ рдирдЧрд░реА рджрд┐рдирд╕рдореНрдо рдЬрд╛рдБрдЪ рдЧрд░рд┐рдБрджреИрди, рдХреЗрд╡рд▓ рд╕рдмрд╕реНрдЯреНрд░рд┐рдЩрдХреЛ рдШрдЯрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ (-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
рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд▓реЗ рд╕рдмрд╕реНрдЯреНрд░рд┐рдЩрдХреЛ рд╕рд╛рде рдиреЗрдорд╕реНрдкреЗрд╕ рдЦреЛрдЬреНрди рд╕рдВрдХреЗрдд рдЧрд░реНрдЫ -pr-
рдПрдХ рдкрдЯрдХ рдорд╛ 1 ╨╝╨╕╨╜╤Г╤В╤Г
.:
apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
name: stale-feature-branch
spec:
namespaceSubstring: -pr-
afterDaysWithoutDeploy: 1
checkEveryMinutes: 1
рдЕрдкрд░реЗрдЯрд░рд▓реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рдПрдХреЛ рдЫ рд░ рдиреЗрдорд╕реНрдкреЗрд╕рд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрди рддрдпрд╛рд░ рдЫ:
$ 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
, рджреБрдИ рдирд╛рдорд╕реНрдерд╛рдирд╣рд░реВ (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
, рдиреЗрдорд╕реНрдкреЗрд╕ 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
рдзреЗрд░реИ рдкрдЯрдХ рд░ рдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рддрд┐рдиреАрд╣рд░реВ рдПрдХ рдорд┐рдиреЗрдЯ рднрд┐рддреНрд░ рд╣рдЯрд╛рдЗрдПрдХрд╛ рдЫрдиреНред
рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ
рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЕрдкрд░реЗрдЯрд░рдХреЛ рд╕рдЯреНрдЯрд╛ рдХреЗ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ? рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рджреГрд╖реНрдЯрд┐рдХреЛрдгрд╣рд░реВ рдЫрдиреН, рддреА рд╕рдмреИ рдЕрдкреВрд░реНрдг рдЫрдиреН (рд░ рддрд┐рдиреАрд╣рд░реВрдХрд╛ рдХрдордЬреЛрд░реАрд╣рд░реВ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рдЫрдиреН), рд░ рд╕рдмреИрд▓реЗ рдЖрдлреИрд▓реЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдЫрдиреН рдХрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЙрддреНрддрдо рдХреЗ рд╣реЛ:
-
рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛рдХреЛ рдирд┐рд░рдиреНрддрд░ рдПрдХреАрдХрд░рдг рдирд┐рд░реНрдорд╛рдгрдХреЛ рдХреНрд░рдордорд╛ рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛ рдореЗрдЯрд╛рдЙрдиреБрд╣реЛрд╕реНред
- рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдЬрд╛рдиреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рдХрд┐ рдХреБрди рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдирд┐рд░реНрдорд╛рдг рднрдЗрд░рд╣реЗрдХреЛ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫред рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛ рдиреЗрдорд╕реНрдкреЗрд╕рд▓реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реЗрдХреЛ рд╣реБрдирд╛рд▓реЗ - рдпрд╕рдХреЛ рдирдореНрдмрд░, рд╡рд╛ рд╢рд╛рдЦрд╛рдХреЛ рдирд╛рдо, рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рдзреИрдВ рдХрдорд┐рдЯрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реБрдиреБрдкрд░реНрдЫред
- рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрд╕рдлрд▓ рднрдЗрд░рд╣реЗрдХреЛ рдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд╕рдБрдЧ рдирд┐рдореНрди рдЪрд░рдгрд╣рд░реВ рдЫрдиреН: рдкрд░рд┐рдпреЛрдЬрдирд╛ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд░рд┐рд▓реАрдЬ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд╕реВрдЪрдирд╛рд╣рд░реВ рдкрдард╛рдЙрдиреБрд╣реЛрд╕реН, рдЕрдиреНрддрд┐рдо рдкреБрд▓ рдЕрдиреБрд░реЛрдзрдХреЛ рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛ рдЦрд╛рд▓реА рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрджрд┐ рд╕реВрдЪрдирд╛ рдкрдард╛рдЙрдБрджрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрд╕рдлрд▓ рднрдпреЛ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдореНрдпрд╛рдиреБрдЕрд▓ рд░реВрдкрдорд╛ рд╕рдмреИ рд╕реНрд░реЛрддрд╣рд░реВ рдореЗрдЯреНрдиреБ рдкрд░реНрдиреЗрдЫред
- рдЙрдЪрд┐рдд рд╕рдиреНрджрд░реНрдн рдмрд┐рдирд╛, рдорд╛рд╕реНрдЯрд░ рдмрд┐рд▓реНрдбрдорд╛ рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдЦрд╛рд╣рд░реВ рдореЗрдЯрд╛рдЙрдиреЗ рд╕реНрдкрд╖реНрдЯ рдЫреИрдиред
-
рд╡реЗрдмрд╣реБрдХрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ (
рдПрдХ рдЙрджрд╛рд╣рд░рдг ).- рдпреЛ рддрдкрд╛рдИрдВрдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реБрди рд╕рдХреНрдЫред рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, рдорд╛
рдЬреЗрдирдХрд┐рдиреНрд╕ , рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХрд╛рд░рдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд▓реЗ рд╕реНрд░реЛрдд рдХреЛрдбрдорд╛ рдпрд╕рдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирд╣рд░реВ рдмрдЪрдд рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛рд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред рд╡реЗрдмрд╣реБрдХрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛, рддрдкрд╛рдИрдВрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрди рдЖрдлреНрдиреИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрдЦреНрдиреБрдкрд░реНрдЫред рдпреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓рд╛рдИ рдЬреЗрдирдХрд┐рдиреНрд╕ рдЗрдиреНрдЯрд░рдлреЗрд╕рдорд╛ рд░рд╛рдЦреНрдиреБрдкрд░реНрдиреЗрдЫ, рдЬреБрди рдХрд╛рдпрдо рд░рд╛рдЦреНрди рдЧрд╛рд╣реНрд░реЛ рдЫред
- рдпреЛ рддрдкрд╛рдИрдВрдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реБрди рд╕рдХреНрдЫред рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, рдорд╛
-
рд▓реЗрдЦреНрди
рдХреНрд░реЛрдирдЬрдм рд░ Kubernetes рдХреНрд▓рд╕реНрдЯрд░ рдердкреНрдиреБрд╣реЛрд╕реНред- рд▓реЗрдЦрди рд░ рд╕рдорд░реНрдердирдорд╛ рд╕рдордп рдЦрд░реНрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
- рдЕрдкрд░реЗрдЯрд░ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рдорд╛рди рд╢реИрд▓реА рдорд╛ рдХрд╛рдо рдЧрд░реНрджрдЫ, рджрд╕реНрддрд╛рд╡реЗрдЬ рд░ рд╕рдорд░реНрдерд┐рдд рдЫред
рд▓реЗрдЦрдорд╛ рдзреНрдпрд╛рди рджрд┐рдиреБрднрдПрдХреЛрдорд╛ рдзрдиреНрдпрд╡рд╛рджред
рд╕реНрд░реЛрдд: www.habr.com