ื”ืกืจืช ืขื ืฃ ืชื›ื•ื ื” ืžื™ื•ืฉืŸ ื‘ืืฉื›ื•ืœ Kubernetes

ื”ืกืจืช ืขื ืฃ ืชื›ื•ื ื” ืžื™ื•ืฉืŸ ื‘ืืฉื›ื•ืœ Kubernetes

ื”ื™ื™! ืกื ื™ืฃ ืชื›ื•ื ื” (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 (ื™ื™ืฉื•ื ืฉื™ืฉ ืœื• ื’ื™ืฉื” ืœืžืฉืื‘ื™ ืืฉื›ื•ืœ), ืงื™ืฉื•ืจ ืœืคืจื•ื™ืงื˜ ื‘-Github. ื–ื” ืžืกื™ืจ ืžืจื—ื‘ื™ ืฉืžื•ืช ื”ืฉื™ื™ื›ื™ื ืœืขื ืคื™ ืชื›ื•ื ื•ืช ื™ืฉื ื™ื. ื‘-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):

  1. ืื ื• ื“ื•ื—ืคื™ื ื”ืชื—ื™ื™ื‘ื•ืช ื—ื“ืฉื” ืœืกื ื™ืฃ.
  2. ืขืœ ื”ืžื‘ื ื” ืžื•ืคืขืœื™ื linters ื•/ืื• ื‘ื“ื™ืงื•ืช.
  3. ืชืฆื•ืจื•ืช ื‘ืงืฉืช ื”ืžืฉื™ื›ื” ืฉืœ Kubernetes ื ื•ืฆืจื•ืช ืชื•ืš ื›ื“ื™ ืชื ื•ืขื” (ืœื“ื•ื’ืžื”, ื”ืžืกืคืจ ืฉืœื” ืžื•ื›ื ืก ืœืชื‘ื ื™ืช ื”ืžื•ื’ืžืจืช).
  4. ื‘ืืžืฆืขื•ืช kubectl application, ืชืฆื•ืจื•ืช ืžืชื•ื•ืกืคื•ืช ืœืืฉื›ื•ืœ (ืคืจื™ืกื”).
  5. ื‘ืงืฉืช ื”ืžืฉื™ื›ื” ืžืชืžื–ื’ืช ืœืกื ื™ืฃ ื”ืจืืฉื™.

ื‘ื–ืžืŸ ืฉืืชื” ืขื•ื‘ื“ ื‘ื‘ืงืฉืช ืžืฉื™ื›ื”, ื›ืœ ืคืจื™ืกื” ื ื•ื›ื—ื™ืช ื—ื“ืฉื” ืฉืœ 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 ะผะธะฝัƒั‚ะฐะผ.

ืึตื™ืš ืžึทืคืขึดื™ืœึดื™ื ืึถืช ื–ึถื”

ื‘ืคื•ืขืœ, ืชืฆื˜ืจืš:

  1. ืกึทื•ึธืจ ืœืขื‘ื•ื“ื” ื‘ืกื‘ื™ื‘ื” ืžื‘ื•ื“ื“ืช.
  2. ืžื™ื ื™ืงื•ื‘ ื™ื’ื“ืœ ืืฉื›ื•ืœ Kubernetes ื‘ืื•ืคืŸ ืžืงื•ืžื™.
  3. ืงื•ื‘ืงื˜ืœ - ืžืžืฉืง ืฉื•ืจืช ืคืงื•ื“ื” ืœื ื™ื”ื•ืœ ืืฉื›ื•ืœื•ืช.

ืื ื• ืžื’ื™ื™ืกื™ื ืืฉื›ื•ืœ 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 ืžืกืคืจ ืคืขืžื™ื ื•ื•ื“ื ืฉื”ื ื™ื•ืกืจื• ืชื•ืš ื“ืงื”.

ืืœื˜ืจื ื˜ื™ื‘ื•ืช

ืžื” ืืคืฉืจ ืœืขืฉื•ืช ื‘ืžืงื•ื ืžืคืขื™ืœ ืฉืขื•ื‘ื“ ื‘ืืฉื›ื•ืœ? ื™ืฉื ืŸ ืžืกืคืจ ื’ื™ืฉื•ืช, ื›ื•ืœืŸ ืœื ืžื•ืฉืœืžื•ืช (ื•ื”ื—ืกืจื•ื ื•ืช ืฉืœื”ืŸ ืกื•ื‘ื™ื™ืงื˜ื™ื‘ื™ื™ื), ื•ื›ืœ ืื—ื“ ืžื—ืœื™ื˜ ื‘ืขืฆืžื• ืžื” ื”ื›ื™ ื˜ื•ื‘ ืœืคืจื•ื™ืงื˜ ืžืกื•ื™ื:

  1. ืžื—ืง ืขื ืฃ ืชื›ื•ื ื” ื‘ืžื”ืœืš ื‘ื ื™ื™ืช ืื™ื ื˜ื’ืจืฆื™ื” ืžืชืžืฉื›ืช ืฉืœ ืขื ืฃ ืžืืกื˜ืจ.

    • ื›ื“ื™ ืœืขืฉื•ืช ื–ืืช, ืขืœื™ืš ืœื“ืขืช ืื™ื–ื• ื‘ืงืฉืช ืžืฉื™ื›ื” ืžืชื™ื™ื—ืกืช ืœ-commit ืฉื ื‘ื ื”. ืžื›ื™ื•ื•ืŸ ืฉืžืจื—ื‘ ื”ืฉืžื•ืช ืฉืœ ืขื ืฃ ื”ืคื™ืฆ'ืจื™ื ืžื›ื™ืœ ืืช ืžื–ื”ื” ื‘ืงืฉืช ื”-pull - ื”ืžืกืคืจ ืฉืœื•, ืื• ืฉื ื”ืขื ืฃ, ื”ืžื–ื”ื” ืชืžื™ื“ ื™ืฆื˜ืจืš ืœื”ื™ื•ืช ืžื•ื’ื“ืจ ื‘-commit.
    • ื‘ื ื™ื™ืช ืขื ืคื™ ืžืืกื˜ืจ ื ื›ืฉืœื™ื. ืœื“ื•ื’ืžื”, ื™ืฉ ืœืš ืืช ื”ืฉืœื‘ื™ื ื”ื‘ืื™ื: ื”ื•ืจื“ืช ื”ืคืจื•ื™ืงื˜, ื”ืจืฅ ื‘ื“ื™ืงื•ืช, ื‘ื ื™ื™ืช ื”ืคืจื•ื™ืงื˜, ื‘ื™ืฆื•ืข ืฉื—ืจื•ืจ, ืฉืœื™ื—ืช ื”ื•ื“ืขื•ืช, ื ืงื” ืืช ืขื ืฃ ื”ืคื™ืฆ'ืจื™ื ืฉืœ ื‘ืงืฉืช ื”ืžืฉื™ื›ื” ื”ืื—ืจื•ื ื”. ืื ื”ื‘ื ื™ื™ื” ื ื›ืฉืœืช ื‘ืขืช ืฉืœื™ื—ืช ื”ื•ื“ืขื”, ืชืฆื˜ืจืš ืœืžื—ื•ืง ืืช ื›ืœ ื”ืžืฉืื‘ื™ื ื‘ืืฉื›ื•ืœ ื‘ืื•ืคืŸ ื™ื“ื ื™.
    • ืœืœื ื”ืงืฉืจ ืžืชืื™ื, ืžื—ื™ืงืช ืขื ืคื™ ืชื›ื•ื ื” ื‘-Master build ืื™ื ื” ื‘ืจื•ืจื” ืžืืœื™ื”.

  2. ืฉื™ืžื•ืฉ ื‘-webhooks (ื“ื•ื’ืžื”).

    • ืื•ืœื™ ื–ื• ืœื ื”ื’ื™ืฉื” ืฉืœืš. ืœื“ื•ื’ืžื”, ื‘ ื’'ื ืงื™ื ืก, ืจืง ืกื•ื’ ืื—ื“ ืฉืœ ืฆื™ื ื•ืจ ืชื•ืžืš ื‘ื™ื›ื•ืœืช ืœืฉืžื•ืจ ืืช ื”ืชืฆื•ืจื•ืช ืฉืœื• ื‘ืงื•ื“ ื”ืžืงื•ืจ. ื‘ืขืช ืฉื™ืžื•ืฉ ื‘-webhooks, ืขืœื™ืš ืœื›ืชื•ื‘ ืกืงืจื™ืคื˜ ืžืฉืœืš ื›ื“ื™ ืœืขื‘ื“ ืื•ืชื. ื”ืกืงืจื™ืคื˜ ื”ื–ื” ื™ืฆื˜ืจืš ืœื”ื™ื•ืช ืžืžื•ืงื ื‘ืžืžืฉืง Jenkins, ืฉืงืฉื” ืœืชื—ื–ืง ืื•ืชื•.

  3. ื›ืชื•ื‘ Cronjob ื•ืœื”ื•ืกื™ืฃ ืืฉื›ื•ืœ Kubernetes.

    • ืœื”ืฉืงื™ืข ื–ืžืŸ ื‘ื›ืชื™ื‘ื” ื•ื‘ืชืžื™ื›ื”.
    • ื”ืžืคืขื™ืœ ื›ื‘ืจ ืขื•ื‘ื“ ื‘ืกื’ื ื•ืŸ ื“ื•ืžื”, ืžืชื•ืขื“ ื•ื ืชืžืš.

ืชื•ื“ื” ืขืœ ืชืฉื•ืžืช ื”ืœื‘ ืฉืœืš ืœืžืืžืจ. ืงื™ืฉื•ืจ ืœืคืจื•ื™ืงื˜ ื‘-Github.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”