ืืื! ืกื ืืฃ ืชืืื ื (aka deploy preview, review app) - ืื ืืืฉืจ ืื ืจืง ืืขื ืฃ ืืจืืฉื ื ืคืจืก, ืืื ืื ืื ืืงืฉืช ืืฉืืื ืืืชืืืช URL ืืืืืืืช. ืืชื ืืืื ืืืืืง ืื ืืงืื ืขืืื ืืกืืืืช ืืืฆืืจ; ื ืืชื ืืืฆืื ืืช ืืชืืื ื ืืืชืื ืชืื ืืืจืื ืื ืืืืืื ืืืฆืจ. ืืืื ืฉืืชื ืขืืื ืืืงืฉืช ืืฉืืื, ืื ืคืจืืกื ื ืืืืืช ืืืฉื ืฉื commit ืขืืืจ ืืงืื ืืืฉื ื ืืืงืช, ืืืคืจืืกื ืืืืฉื ืขืืืจ ืืงืื ืืืืฉ ืืืคืขืืช. ืฉืืืืช ืขืฉืืืืช ืืืชืขืืจืจ ืืืฉืจ ืืืืื ืืงืฉืช ืืฉืืื ืืชืื ืขื ืฃ ืืืืกืืจ. ืืชื ืืืจ ืื ืฆืจืื ืืช ืขื ืฃ ืืชืืื ืืช, ืืื ืืฉืืื 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
):
- ืื ื ืืืืคืื ืืชืืืืืืช ืืืฉื ืืกื ืืฃ.
- ืขื ืืืื ื ืืืคืขืืื linters ื/ืื ืืืืงืืช.
- ืชืฆืืจืืช ืืงืฉืช ืืืฉืืื ืฉื Kubernetes ื ืืฆืจืืช ืชืื ืืื ืชื ืืขื (ืืืืืื, ืืืกืคืจ ืฉืื ืืืื ืก ืืชืื ืืช ืืืืืืจืช).
- ืืืืฆืขืืช kubectl application, ืชืฆืืจืืช ืืชืืืกืคืืช ืืืฉืืื (ืคืจืืกื).
- ืืงืฉืช ืืืฉืืื ืืชืืืืช ืืกื ืืฃ ืืจืืฉื.
ืืืื ืฉืืชื ืขืืื ืืืงืฉืช ืืฉืืื, ืื ืคืจืืกื ื ืืืืืช ืืืฉื ืฉื commit ืขืืืจ ืืงืื ืืืฉื ื ืืืงืช, ืืืคืจืืกื ืืืืฉื ืขืืืจ ืืงืื ืืืืฉ ืืืคืขืืช. ืืื ืืืฉืจ ืืงืฉืช ืืฉืืื ืืชืืืืช ืืชืื ืขื ืฃ ืืืืกืืจ, ืจืง ืขื ืฃ ืืืืกืืจ ืืืื ื. ืืชืืฆืื ืืื, ืืชืืจืจ ืฉืืืจ ืฉืืื ื ืืช ืืงืฉืช ืืืฉืืื, ืืืฉืืื 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
ืคืจืืืจ ืืืจืืืช ืืฉื ื ืฉื ืืจืื ืฉืืืช ื ืืจืฉ ืืกื ื ืืจืืื ืฉืืืช ืขืืืจ ืืงืฉืืช ืืฉืืื ืืืจืืื ืฉืืืช ืืืจืื. ืืืืืื, ืื ืืืฉืืื ืืฉ ืืช ืืจืืื ืืฉืืืช ืืืืื: 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 ะดะฝั
, ืืจืื ืืฉืืืช ืืื ืื ืืืืืง.
ืืฉ ืขืื ืคืจืืืจ ืืื, ืืื ืืืจืื ืขื ืืชืืืจืืช ืืกืจืืง ืืช ืื ืืจืืื ืืฉืืืช ืืืืืืง ืืืื ืืื ืคืจืืกื - checkEveryMinutes. ืืืจืืจืช ืืืื ืื ืฉืืื 30 ะผะธะฝััะฐะผ
.
ืึตืื ืึทืคืขึดืืึดืื ืึถืช ืึถื
ืืคืืขื, ืชืฆืืจื:
ืกึทืึธืจ ืืขืืืื ืืกืืืื ืืืืืืช.ืืื ืืงืื ืืืื ืืฉืืื Kubernetes ืืืืคื ืืงืืื.ืงืืืงืื - ืืืฉืง ืฉืืจืช ืคืงืืื ืื ืืืื ืืฉืืืืืช.
ืื ื ืืืืืกืื ืืฉืืื 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
ืืกืคืจ ืคืขืืื ืืืื ืฉืื ืืืกืจื ืชืื ืืงื.
ืืืืจื ืืืืืช
ืื ืืคืฉืจ ืืขืฉืืช ืืืงืื ืืคืขืื ืฉืขืืื ืืืฉืืื? ืืฉื ื ืืกืคืจ ืืืฉืืช, ืืืื ืื ืืืฉืืืืช (ืืืืกืจืื ืืช ืฉืืื ืกืืืืืงืืืืืื), ืืื ืืื ืืืืื ืืขืฆืื ืื ืืื ืืื ืืคืจืืืงื ืืกืืื:
-
ืืืง ืขื ืฃ ืชืืื ื ืืืืื ืื ืืืช ืืื ืืืจืฆืื ืืชืืฉืืช ืฉื ืขื ืฃ ืืืกืืจ.
- ืืื ืืขืฉืืช ืืืช, ืขืืื ืืืขืช ืืืื ืืงืฉืช ืืฉืืื ืืชืืืืกืช ื-commit ืฉื ืื ื. ืืืืืื ืฉืืจืื ืืฉืืืช ืฉื ืขื ืฃ ืืคืืฆ'ืจืื ืืืื ืืช ืืืื ืืงืฉืช ื-pull - ืืืกืคืจ ืฉืื, ืื ืฉื ืืขื ืฃ, ืืืืื ืชืืื ืืฆืืจื ืืืืืช ืืืืืจ ื-commit.
- ืื ืืืช ืขื ืคื ืืืกืืจ ื ืืฉืืื. ืืืืืื, ืืฉ ืื ืืช ืืฉืืืื ืืืืื: ืืืจืืช ืืคืจืืืงื, ืืจืฅ ืืืืงืืช, ืื ืืืช ืืคืจืืืงื, ืืืฆืืข ืฉืืจืืจ, ืฉืืืืช ืืืืขืืช, ื ืงื ืืช ืขื ืฃ ืืคืืฆ'ืจืื ืฉื ืืงืฉืช ืืืฉืืื ืืืืจืื ื. ืื ืืื ืืื ื ืืฉืืช ืืขืช ืฉืืืืช ืืืืขื, ืชืฆืืจื ืืืืืง ืืช ืื ืืืฉืืืื ืืืฉืืื ืืืืคื ืืื ื.
- ืืื ืืงืฉืจ ืืชืืื, ืืืืงืช ืขื ืคื ืชืืื ื ื-Master build ืืื ื ืืจืืจื ืืืืื.
-
ืฉืืืืฉ ื-webhooks (
ืืืืื ).- ืืืื ืื ืื ืืืืฉื ืฉืื. ืืืืืื, ื
ื'ื ืงืื ืก , ืจืง ืกืื ืืื ืฉื ืฆืื ืืจ ืชืืื ืืืืืืช ืืฉืืืจ ืืช ืืชืฆืืจืืช ืฉืื ืืงืื ืืืงืืจ. ืืขืช ืฉืืืืฉ ื-webhooks, ืขืืื ืืืชืื ืกืงืจืืคื ืืฉืื ืืื ืืขืื ืืืชื. ืืกืงืจืืคื ืืื ืืฆืืจื ืืืืืช ืืืืงื ืืืืฉืง Jenkins, ืฉืงืฉื ืืชืืืง ืืืชื.
- ืืืื ืื ืื ืืืืฉื ืฉืื. ืืืืืื, ื
-
ืืชืื
Cronjob ืืืืืกืืฃ ืืฉืืื Kubernetes.- ืืืฉืงืืข ืืื ืืืชืืื ืืืชืืืื.
- ืืืคืขืื ืืืจ ืขืืื ืืกืื ืื ืืืื, ืืชืืขื ืื ืชืื.
ืชืืื ืขื ืชืฉืืืช ืืื ืฉืื ืืืืืจ.
ืืงืืจ: www.habr.com