เช เชฒเซเชเชฎเชพเช, เชนเซเช "Epics" เชเซเชฎ เชตเชฟเชเชธเชพเชตเชตเชพ เชฎเชพเชเซ เชเชพเชฐเซเชฏเชเชพเชฐเซ เชตเชพเชคเชพเชตเชฐเชฃ เชธเซเช เชเชฐเซเชถ, เช เชจเซ OpenFaaS เชฎเชพเช เชเชชเชฏเซเช เชฎเชพเชเซ เชฏเซเชเซเชฏ เชญเชพเชเซเชฎเชพเช เชฐเชฎเชคเชจเซ เชชเชฃ เชตเชฟเชญเชพเชเชฟเชค เชเชฐเซเชถ. เชนเซเช เชฒเชฟเชจเชเซเชธ เชชเชฐ เชคเชฎเชพเชฎ เชฎเซเชจเชฟเชชเซเชฏเซเชฒเซเชถเชจเซเชธ เชเชฐเซเชถ, เชนเซเช เชตเชฐเซเชเซเชฏเซเช เชฒเชฌเซเชเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฎเชฟเชจเซเชเซเชฏเซเชฌเชฎเชพเช เชเซเชฌเชฐเชจเซเชเซเชธ เชเชฎเชพเชตเซเชถ. เชฎเชพเชฐเชพ เชตเชฐเซเช เชฎเชถเซเชจเชฎเชพเช 2 เชชเซเชฐเซเชธเซเชธเชฐ เชเซเชฐเซ เช เชจเซ 12GB RAM เชเซ; เชนเซเช เชธเชฟเชธเซเชเชฎ เชกเชฟเชธเซเช เชคเชฐเซเชเซ SSD เชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช. เชนเซเช เชกเซเชฌเชฟเชฏเชจ 8 เชจเซ เชเชชเชฏเซเช เชฎเชพเชฐเซ เชฎเซเชเซเชฏ เชกเซเชตเชฒเชชเชฎเซเชจเซเช เชธเชฟเชธเซเชเชฎ เชคเชฐเซเชเซ เชเชฐเซเชถ, เชเซเชฎเชพเช emacs, sudo, git เช เชจเซ เชตเชฐเซเชเซเชฏเซเช เชฒเชฌเซเชเซเชธ เชชเซเชเซเชเซ เชเชจเซเชธเซเชเซเชฒ เชฅเชถเซ, เชฌเชพเชเซเชจเซเช เชฌเชงเซเช GitHub เช เชจเซ เช เชจเซเชฏ เชธเซเชคเซเชฐเซเชคเซเชฎเชพเชเชฅเซ เชกเชพเชเชจเชฒเซเชก เชเชฐเซเชจเซ เชเชจเซเชธเซเชเซเชฒ เชฅเชถเซ. เช เชฎเซ เช เชเชชเซเชฒเชฟเชเซเชถเชจเซเชจเซ /usr/local/bin เชฎเชพเช เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเชถเซเช เชธเชฟเชตเชพเชฏ เชเซ เช เชจเซเชฏเชฅเชพ เชเชฒเซเชฒเซเชเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ. เชเชพเชฒเซ, เชถเชฐเซ เชเชฐเซเช!
เชเชพเชฐเซเชฏเชเชพเชฐเซ เชตเชพเชคเชพเชตเชฐเชฃเชจเซ เชคเซเชฏเชพเชฐเซ
Go เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ
เช เชฎเซ เชธเชคเซเชคเชพเชตเชพเชฐ เชตเซเชฌเชธเชพเชเช เชชเชฐเชฅเซ เชธเซเชเชจเชพเชเชจเซเช เชชเชพเชฒเชจ เชเชฐเซเช เชเซเช:
$ curl -L0 https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz -o go.tar.gz
$ sudo tar -C /usr/local -xzf go.tar.gz
$ echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชคเชชเชพเชธเซ เชฐเชนเซเชฏเซเช เชเซ:
$ mkdir -p ~/go/src/hello && cd ~/go/src/hello
$ echo 'package main
import "fmt"
func main() {
fmt.Printf("hello, worldn")
}' > hello.go
$ go build
$ ./hello
hello, world
faas-cli เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ
เช เชฎเซ เชธเชคเซเชคเชพเชตเชพเชฐ เชตเซเชฌเชธเชพเชเช เชชเชฐเชฅเซ เชธเซเชเชจเชพเชเชจเซเช เชชเชพเชฒเชจ เชเชฐเซเช เชเซเช:
$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Downloading package https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli as /tmp/faas-cli
Download complete.
Running with sufficient permissions to attempt to move faas-cli to /usr/local/bin
New version of faas-cli installed to /usr/local/bin
Creating alias 'faas' for 'faas-cli'.
___ _____ ____
/ _ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ / _ '_ | |_ / _` |/ _` ___
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
___/| .__/ ___|_| |_|_| __,_|__,_|____/
|_|
CLI:
commit: 73004c23e5a4d3fdb7352f953247473477477a64
version: 0.11.3
เชตเชงเซเชฎเชพเช, เชคเชฎเซ bash-completion เชธเชเซเชทเชฎ เชเชฐเซ เชถเชเซ เชเซ:
faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cli
Kubernetes เชเชจเซเชธเซเชเซเชฒ เช เชจเซ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
เชตเชฟเชเชพเชธ เชฎเชพเชเซ, เชฎเชฟเชจเซเชเซเชฏเซเชฌ เชชเซเชฐเชคเซเช เชเซ, เชคเซเชฅเซ เชคเซเชจเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เช เชจเซ /usr/local/bin เชฎเชพเช เชเซเชฌเซเชฒเซเช เชเชฐเซ, เช เชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ เชนเซเชฒเซเชฎ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ:
$ curl https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 -o minikube && chmod +x minikube && sudo mv minikube /usr/local/bin/
$ curl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl -o kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/
$ curl https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz | tar -xzvf - linux-amd64/helm --strip-components=1; sudo mv helm /usr/local/bin
เชฎเชฟเชจเซเชเซเชฏเซเชฌ เชฒเซเชเช เชเชฐเซ:
$ minikube start
minikube v1.6.2 on Debian 8.11
Automatically selected the 'virtualbox' driver (alternates: [])
Downloading VM boot image ...
> minikube-v1.6.0.iso.sha256: 65 B / 65 B [--------------] 100.00% ? p/s 0s
> minikube-v1.6.0.iso: 150.93 MiB / 150.93 MiB [-] 100.00% 5.67 MiB p/s 27s
Creating virtualbox VM (CPUs=2, Memory=8192MB, Disk=20000MB) ...
Preparing Kubernetes v1.17.0 on Docker '19.03.5' ...
Downloading kubeadm v1.17.0
Downloading kubelet v1.17.0
Pulling images ...
Launching Kubernetes ... Waiting for cluster to come online ...
Done! kubectl is now configured to use "minikube"
เชคเชชเชพเชธ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ:
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6955765f44-knlcb 1/1 Running 0 29m
kube-system coredns-6955765f44-t9cpn 1/1 Running 0 29m
kube-system etcd-minikube 1/1 Running 0 28m
kube-system kube-addon-manager-minikube 1/1 Running 0 28m
kube-system kube-apiserver-minikube 1/1 Running 0 28m
kube-system kube-controller-manager-minikube 1/1 Running 0 28m
kube-system kube-proxy-hv2wc 1/1 Running 0 29m
kube-system kube-scheduler-minikube 1/1 Running 0 28m
kube-system storage-provisioner 1/1 Running 1 29m
OpenFaaS เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ
เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ 2 เชจเซเชฎเชธเซเชชเซเชธ เชฌเชจเชพเชตเชตเชพเชจเซ เชญเชฒเชพเชฎเชฃ เชเชฐเซ เชเซ:
$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas created
namespace/openfaas-fn created
เชธเซเชเชพเชจ เชฎเชพเชเซ เชญเชเชกเชพเชฐ เชเชฎเซเชฐเซ:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" has been added to your repositories
เชเชพเชฐเซเชเชฎเชพเช เชเชจเซเชธเซเชเซเชฒเซเชถเชจ เชชเชนเซเชฒเชพ เชชเชพเชธเชตเชฐเซเชก เชธเซเช เชเชฐเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ เชเซ, เชเชพเชฒเซ เชคเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เช เชจเซ เชเชเซเชธเซเชธ เชกเซเชเชพเชจเซ k8s เชธเชฟเชเซเชฐเซเช เชคเชฐเซเชเซ เชธเชพเชเชตเซเช:
$ PASSWORD=verysecurerandompasswordstring
$ kubectl -n openfaas create secret generic basic-auth --from-literal=basic-auth-user=admin --from-literal=basic-auth-password="$PASSWORD"
secret/basic-auth created
เชเชพเชฒเซ เชเชฎเชพเชตเซเช:
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "openfaas" chart repository
Update Complete. Happy Helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Release "openfaas" does not exist. Installing it now.
NAME: openfaas
LAST DEPLOYED: Fri Dec 25 10:28:22 2019
NAMESPACE: openfaas
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To verify that openfaas has started, run:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
เชฅเซเชกเชพ เชธเชฎเชฏ เชชเชเซ, เช เชฎเซ เชธเซเชเชฟเชค เชเชฆเซเชถ เชเชฒเชพเชตเซเช เชเซเช:
$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
NAME READY UP-TO-DATE AVAILABLE AGE
alertmanager 1/1 1 1 114s
basic-auth-plugin 1/1 1 1 114s
faas-idler 1/1 1 1 114s
gateway 1/1 1 1 114s
nats 1/1 1 1 114s
prometheus 1/1 1 1 114s
queue-worker 1/1 1 1 114s
เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชคเชชเชพเชธเซ เชฐเชนเซเชฏเซเช เชเซ:
$ kubectl rollout status -n openfaas deploy/gateway
deployment "gateway" successfully rolled out
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Forwarding from 127.0.0.1:8080 -> 8080
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
Calling the OpenFaaS server to validate the credentials...
Handling connection for 8080
WARNING! Communication is not secure, please consider using HTTPS. Letsencrypt.org offers free SSL/TLS certificates.
credentials saved for admin http://127.0.0.1:8080
$ faas-cli list
Function Invocations Replicas
Mongodb เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ
เช เชฎเซ เชธเซเชเชพเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฌเชงเซเช เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเช เชเซเช:
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" has been added to your repositories
$ helm install stable/mongodb --generate-name
NAME: mongodb-1577466908
LAST DEPLOYED: Fri Dec 25 11:15:11 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
MongoDB can be accessed via port 27017 on the following DNS name from within your cluster:
mongodb-1577466908.default.svc.cluster.local
To get the root password run:
export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
To connect to your database run the following command:
kubectl run --namespace default mongodb-1577466908-client --rm --tty -i --restart='Never' --image bitnami/mongodb --command -- mongo admin --host mongodb-1577466908 --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
To connect to your database from outside the cluster execute the following commands:
kubectl port-forward --namespace default svc/mongodb-1577466908 27017:27017 &
mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD
เชคเชชเชพเชธ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ:
kubectl run --namespace default mongodb-1577466908-client --rm --tty -i --restart='Never' --image bitnami/mongodb --command -- mongo admin --host mongodb-1577466908 --authenticationDatabase admin -u root -p $(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
If you don't see a command prompt, try pressing enter.
> db.version();
4.0.14
เชเชจเซเชเซเชจเชฐเชฎเชพเชเชฅเซ เชฌเชนเชพเชฐ เชจเซเชเชณเชตเชพ เชฎเชพเชเซ ctrl+D เชฆเชฌเชพเชตเซ.
emacs เชธเซเชฏเซเชเชฟเชค เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช
เชธเซเชฆเซเชงเชพเชเชคเชฟเช เชฐเซเชคเซ, เชฌเชงเซเช เชชเชนเซเชฒเซเชฅเซ เช เช
เชจเซเชธเชพเชฐ เชเซเช เชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช
เชฐเชฎเชคเชจเซ เชเชพเชฐเซเชฏเซเชฎเชพเช เชคเซเชกเซเชจเซ
เชซเชเชเซเชถเชจเซเชธ เชธเชพเชฅเซเชจเซ เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ HTTP เชชเซเชฐเซเชเซเชเซเชฒ เชฆเซเชตเชพเชฐเชพ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, JWT เชฆเซเชตเชพเชฐเชพ เชตเชฟเชตเชฟเชง เชเชพเชฐเซเชฏเซ เชตเชเซเชเซ เชเชจเซเชก-เชเซ-เชเชจเซเชก เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เชชเซเชฐเชฆเชพเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. Mongodb เชจเซ เชเชชเชฏเซเช เชเซเชเชจเซเชธ เชคเซเชฎเช เชเซเชฎ เชธเซเชเซเช, เชชเซเชฒเซเชฏเชฐ เชกเซเชเชพ, เชคเชฎเชพเชฎ เชเซเชฎเซเชธเชจเซ เชเชพเชฒเชจเชพ เชธเชฟเชเซเชตเชจเซเชธ เช เชจเซ เช เชจเซเชฏ เชฎเชพเชนเชฟเชคเซ เชธเซเชเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ เชฅเชพเชฏ เชเซ. เชเชพเชฒเซ เชธเซเชฅเซ เชตเชงเซ เชฐเชธเชชเซเชฐเชฆ เชฒเชเซเชทเชฃเซ เชชเชฐ เชจเชเซเชเชฅเซ เชจเชเชฐ เชเชฐเซเช.
เชจเซเชเชงเชฃเซ
เช เชซเชเชเซเชถเชจเชจเซเช เชเชจเชชเซเช เชฐเชฎเชคเชจเชพ เชเชชเชจเชพเชฎ เช เชจเซ เชชเชพเชธเชตเชฐเซเชก เชธเชพเชฅเซ JSON เชเซ. เชเซเชฏเชพเชฐเซ เช เชซเชเชเซเชถเชจเชจเซ เชเซเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชคเซ เชคเชชเชพเชธเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซ เช เชเชชเชจเชพเชฎ เชกเซเชเชพเชฌเซเชเชฎเชพเช เชจเชฅเซ; เชเซ เชเซเช เชธเชซเชณ เชฅเชพเชฏ, เชคเซ เชเชชเชจเชพเชฎ เช เชจเซ เชชเชพเชธเชตเชฐเซเชก เชนเซเชถ เชกเซเชเชพเชฌเซเชเชฎเชพเช เชฆเชพเชเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชฐเชฎเชคเชฎเชพเช เชธเชเซเชฐเชฟเชฏเชชเชฃเซ เชญเชพเช เชฒเซเชตเชพ เชฎเชพเชเซ เชจเซเชเชงเชฃเซ เชเชฐเซเชฐเซ เชเซ.
เชชเซเชฐเชตเซเชถเชฆเซเชตเชพเชฐ
เชซเชเชเซเชถเชจ เชเชจเชชเซเช เช เชเซเชฎเชจเชพ เชเชชเชจเชพเชฎ เช เชจเซ เชชเชพเชธเชตเชฐเซเชก เชธเชพเชฅเซ JSON เชเซ; เชเซ เชกเซเชเชพเชฌเซเชเชฎเชพเช เชเซเช เชเชชเชจเชพเชฎ เชนเซเชฏ เช เชจเซ เชกเซเชเชพเชฌเซเชเชฎเชพเช เช เชเชพเช เชธเชพเชเชตเซเชฒ เชชเชพเชธเชตเชฐเซเชก เชธเชพเชฅเซ เชธเชซเชณเชคเชพเชชเซเชฐเซเชตเช เชเชเชพเชธเชพเชฏเซเชฒ เชนเซเชฏ, เชคเซ JWT เชชเชฐเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซ เช เชจเซเชฏ เชซเชเชเซเชถเชจเซเชธเชจเซ เชชเชพเชธ เชเชฐเชตเซเช เชเชตเชถเซเชฏเช เชเซ เชเซเชฏเชพเชฐเซ เชคเซเช เชเชนเซเชตเชพเชฏ เชเซ. เชกเซเชเชพเชฌเซเชเชฎเชพเช เชตเชฟเชตเชฟเชง เชธเซเชตเชพ เชฐเซเชเซเชฐเซเชกเซเชธ เชชเชฃ เชฆเชพเชเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเซเชฒเซเชฒเซ เชฒเซเชเชฟเชจ เชธเชฎเชฏ, เชตเชเซเชฐเซ.
เชฐเชฎเชคเซเชจเซ เชธเซเชเชฟ เชเซเช
เชเซเชเชชเชฃ เช เชจเชงเชฟเชเซเชค เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชธเชเซเชฐเชฟเชฏ เชฐเชฎเชคเซ เชธเชฟเชตเชพเชฏ เชคเชฎเชพเชฎ เชฐเชฎเชคเซเชจเซ เชธเซเชเชฟเชจเซ เชตเชฟเชจเชเชคเซ เชเชฐเซ เชถเชเซ เชเซ. เช เชงเชฟเชเซเชค เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชธเชเซเชฐเชฟเชฏ เชฐเชฎเชคเซเชจเซ เชธเซเชเชฟ เชชเชฃ เชเซเช เชเซ. เชซเชเชเซเชถเชจเชจเซเช เชชเชฐเชฟเชฃเชพเชฎ เช JSON เชเซ เชเซเชฎเชพเช เชฐเชฎเชคเซเชจเซ เชธเซเชเชฟ เชเซ (เชเซเชฎ ID, เชฎเชพเชจเชต เชตเชพเชเชเซ เชถเชเชพเชฏ เชคเซเชตเซเช เชจเชพเชฎ, เชตเชเซเชฐเซ).
เชฐเชฎเชค เชฌเชจเชพเชตเช
เชซเชเชเซเชถเชจ เชซเชเซเชค เช เชงเชฟเชเซเชค เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชธเชพเชฅเซ เช เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ; เชเชจเชชเซเช เชชเชฐ เชเซเชฒเชพเชกเซเชเชจเซ เชฎเชนเชคเซเชคเชฎ เชธเชเชเซเชฏเชพ เชธเซเชตเซเชเชพเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชคเซเชฎเช เชฐเชฎเชคเชจเชพ เชชเชฐเชฟเชฎเชพเชฃเซ (เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เช เชฐเชฎเชคเชฎเชพเช เชเชฏเชพ เช เชเซเชทเชฐเซ เชธเชเซเชฐเชฟเชฏ เชเชฐเชตเชพ, เชเซเชฒเชพเชกเซเชเชจเซ เชฎเชนเชคเซเชคเชฎ เชธเชเชเซเชฏเชพ, เชตเชเซเชฐเซ). เชฐเชฎเชคเชจเซเช เชเช เช เชฒเช เชชเชฐเชฟเชฎเชพเชฃ เช เชเซเชกเชพเชตเชพ เชฎเชพเชเซเชจเชพ เชชเชพเชธเชตเชฐเซเชกเชจเซ เชนเชพเชเชฐเซ เชเซ, เชเซ เชคเชฎเชจเซ เชฌเชฟเชจ-เชเชพเชนเซเชฐ เชฐเชฎเชคเซ เชฌเชจเชพเชตเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ. เชฎเซเชณเชญเซเชค เชฐเซเชคเซ, เชธเชพเชฐเซเชตเชเชจเชฟเช เชฐเชฎเชค เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชซเชเชเซเชถเชจเชจเซเช เชชเชฐเชฟเชฃเชพเชฎ JSON เชเซ, เชเซเชฎเชพเช เชธเชฐเซเชเชจ เชธเชเซเชธเซเชธ เชซเซเชฒเซเชก, เชเช เช เชจเชจเซเชฏ เชฐเชฎเชค เชเชณเชเชเชฐเซเชคเชพ เช เชจเซ เช เชจเซเชฏ เชชเชฐเชฟเชฎเชพเชฃเซ เชเซ.
เชฐเชฎเชคเชฎเชพเช เชเซเชกเชพเชตเซเช
เชซเชเชเซเชถเชจ เชซเชเซเชค เช เชงเชฟเชเซเชค เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชธเชพเชฅเซ เช เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ, เชเชจเชชเซเช เช เชฐเชฎเชค ID เช เชจเซ เชคเซเชจเซ เชชเชพเชธเชตเชฐเซเชก เชเซ, เชเซ เช เชฌเชฟเชจ-เชธเชพเชฐเซเชตเชเชจเชฟเช เชฐเชฎเชค เชเซ, เชคเซ เชเชเชเชชเซเช เชฐเชฎเชค เชชเชฐเชฟเชฎเชพเชฃเซ เชธเชพเชฅเซ JSON เชเซ. เช เชงเชฟเชเซเชค เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเซ เชเซเช เชฐเชฎเชคเชฎเชพเช เชเซเชกเชพเชฏเชพ เชเซ, เชคเซเชฎเช เชฐเชฎเชคเชจเชพ เชจเชฟเชฐเซเชฎเชพเชคเชพ, เชคเซเชเชจเซ เชชเชเซเชฅเซ เชฐเชฎเชคเชจเชพ เชธเชนเชญเชพเชเซเช เชเชนเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เชฐเชฎเชคเชจเซ เชเชเชจเชพเช เชเซเชตเซ
เชเซเชเชชเชฃ เช เชจเชงเชฟเชเซเชค เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชจเชฟเชทเซเชเซเชฐเชฟเชฏ เชฐเชฎเชคเซ เชฎเชพเชเซ เชเชตเซเชจเซเชเซเชธเชจเซ เชธเซเชเชฟเชจเซ เชตเชฟเชจเชเชคเซ เชเชฐเซ เชถเชเซ เชเซ, เช เชจเซ เช เชงเชฟเชเซเชค เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเซเชเชชเชฃ เชธเชเซเชฐเชฟเชฏ เชฐเชฎเชค เชฎเชพเชเซ เชเชตเซเชจเซเชเซเชธเชจเซ เชธเซเชเชฟ เชชเซเชฐเชพเชชเซเชค เชเชฐเซ เชถเชเซ เชเซ. เชซเชเชเซเชถเชจเชจเซ เชตเชงเชพเชฐเชพเชจเซ เชชเชฐเชฟเชฎเชพเชฃ เช เชเชตเซเชจเซเช เชจเชเชฌเชฐ เชนเซเช เชถเชเซ เชเซ เชเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชชเชพเชธเซ เชชเชนเซเชฒเซเชฅเซ เช เชเซ. เช เชเชฟเชธเซเชธเชพเชฎเชพเช, เชซเชเซเชค เชคเซ เช เชเชตเซเชจเซเชเซเชธ เชเซ เชเซ เชชเชเซเชฅเซ เชเชตเซ เชเซ เชคเซ เชธเซเชเชฟเชฎเชพเช เชชเชฐเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ. เชธเชฎเชฏเชพเชเชคเชฐเซ เช เชซเชเชเซเชถเชจเชจเซ เชฒเซเชเช เชเชฐเซเชจเซ, เช เชงเชฟเชเซเชค เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชฐเชฎเชคเชฎเชพเช เชถเซเช เชฅเช เชฐเชนเซเชฏเซเช เชเซ เชคเซ เชเซเช เชเซ. เช เชซเชเชเซเชถเชจ เชเชเซเชถเชจ เชฐเชฟเชเซเชตเซเชธเซเช เชชเชฃ เชชเชฐเชค เชเชฐเซ เชเซ, เชเซเชจเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเซเชฎเชจเชพ เชเชตเซเชจเซเช เชกเชฟเชธเซเชชเซเช เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชตเชพเชฌ เชเชชเซ เชถเชเซ เชเซ.
เชฐเชฎเชค เชเชตเซเชจเซเช เชฎเซเชเชฒเซ เชฐเชนเซเชฏเซเช เชเซ
เชซเชเชเซเชถเชจ เชซเชเซเชค เชฐเชฎเชคเชจเชพ เชธเชนเชญเชพเชเซเช เชฎเชพเชเซ เช เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ: เชฐเชฎเชค เชถเชฐเซ เชเชฐเชตเซ, เชเชพเชฒ เชเชฐเชตเซ, เชฎเชค เชเชชเชตเซ, เชฐเชฎเชค เชเชตเซเชจเซเชเซเชธเชจเซ เชธเซเชเชฟเชฎเชพเช เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชเซเชเซเชธเซเช เชธเชเชฆเซเชถ เชฒเชเชตเซ เชตเชเซเชฐเซ เชถเชเซเชฏ เชเซ.
เชเซเชฎ เชฌเชจเชพเชตเชจเชพเชฐ เช
เชงเชฟเชเซเชค เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชชเซเชคเชพเชจเชพ เชธเชนเชฟเชค เชฐเชฎเชคเชจเชพ เชคเชฎเชพเชฎ เชธเชนเชญเชพเชเซเชเชจเซ เชญเซเชฎเชฟเชเชพเชเชจเซเช เชตเชฟเชคเชฐเชฃ เชเชฐเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซเชฏเซเช, เชคเซเชเช เชธเชฎเชพเชจ เชเชพเชฐเซเชฏเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชคเซเชฎเชจเซ เชญเซเชฎเชฟเชเชพเชจเซ เชชเซเชทเซเชเชฟ เชเชฐเชตเซ เชเชตเชถเซเชฏเช เชเซ. เชเชเชตเชพเชฐ เชฌเชงเซ เชญเซเชฎเชฟเชเชพเชเชจเซ เชชเซเชทเซเชเชฟ เชฅเช เชเชพเชฏ, เชฐเชฎเชค เชเชชเชฎเซเชณเซ เชจเชพเชเช เชฎเซเชก เชชเชฐ เชธเซเชตเชฟเช เชฅเช เชเชพเชฏ เชเซ.
เชฐเชฎเชคเชจเชพ เชเชเชเชกเชพ
เชซเชเชเซเชถเชจ เชซเชเซเชค เชฐเชฎเชคเชจเชพ เชธเชนเชญเชพเชเซเช เชฎเชพเชเซ เช เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ; เชคเซ เชฐเชฎเชคเชจเซ เชธเซเชฅเชฟเชคเชฟ, เชเซเชฒเชพเชกเซเชเชจเซ เชธเซเชเชฟ เช เชจเซ เชธเชเชเซเชฏเชพ (เชเชชเชจเชพเชฎ), เชญเซเชฎเชฟเชเชพเช เช เชจเซ เชคเซเชฎเชจเซ เชธเซเชฅเชฟเชคเชฟ (เชฎเซเชต เชเชฐเซ เชเซ เชเซ เชจเชนเซเช), เชคเซเชฎเช เช เชจเซเชฏ เชฎเชพเชนเชฟเชคเซ เชฆเชฐเซเชถเชพเชตเซ เชเซ. เช เชเชพเชเชจเชพ เชเชพเชฐเซเชฏเชจเซ เชเซเชฎ, เชฌเชงเซเช เชซเชเซเชค เชฐเชฎเชคเชจเชพ เชธเชนเชญเชพเชเซเช เชฎเชพเชเซ เช เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ.
เชธเชฎเชฏเชพเชเชคเชฐเซ เชถเชฐเซ เชเชฐเซเชฒ เชเชพเชฐเซเชฏเซ
เชเซ เชเซเชฎ เชฌเชจเชพเชตเชคเซ เชตเชเชคเซ เชเชฒเซเชฒเซเชเชฟเชค เช เชฎเซเช เชธเชฎเชฏ เชฎเชพเชเซ เชเซเชฎ เชฒเซเชจเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชจ เชนเซเชฏ, เชคเซ เชคเซ เชธเซเชชเชทเซเช เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชธเชเซเชฐเชฟเชฏ เชฐเชฎเชคเซเชจเซ เชธเซเชเชฟเชฎเชพเชเชฅเซ เชเชชเชฎเซเชณเซ เชฆเซเชฐ เชฅเช เชเชถเซ.
เช เชจเซเชฏ เชธเชพเชฎเชฏเชฟเช เชเชพเชฐเซเชฏ เช เชเซ เชเซ เชฐเชฎเชค เชฎเซเชกเชจเซ เชฐเชพเชคเชฅเซ เชฆเชฟเชตเชธ เชธเซเชงเซ เช เชจเซ เชชเชพเชเชณเชจเซ เชฐเชฎเชคเซ เชฎเชพเชเซ เชซเชฐเชเชฟเชฏเชพเชค เชธเซเชตเชฟเช เชเชฐเชตเซเช เชเซ เชเซเชจเชพ เชฎเชพเชเซ เชตเชณเชพเชเช เชฆเชฐเชฎเชฟเชฏเชพเชจ เชเชตเซเช เชจ เชฅเชฏเซเช (เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเช เชเซเชฒเชพเชกเซ เชเซ เชเซเชจเซ เชฐเชฎเชค เชเชตเซเชจเซเช เชชเชฐ เชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชนเซเชฏ เชคเซเชฃเซ เชเซเช เชเชพเชฐเชฃเชธเชฐ เชคเซเชจเซเช เชธเซเชฒเซเชฏเซเชถเชจ เชฎเซเชเชฒเซเชฏเซเช เชจ เชนเชคเซเช. ).
เชเซเชทเชฃเชพ
เชชเชฐเชฟเชเชฏ - เชตเชฟเชเชพเชธเชจเซเช เชตเชพเชคเชพเชตเชฐเชฃ เชธเซเชฏเซเชเชฟเชค เชเชฐเชตเซเช, เชเชพเชฐเซเชฏเชจเซ เชเชพเชฐเซเชฏเซเชฎเชพเช เชตเชฟเชญเชพเชเซเชค เชเชฐเชตเซเช
- เชฌเซเชเชเชจเซเชก เชเชพเชฎ
- เชเชเชณเชจเซเช เชเชพเชฎ
- CICD เชจเซ เชธเซเชฅเชพเชชเชจเชพ เชเชฐเชตเซ, เชชเชฐเซเชเซเชทเชฃเชจเซเช เชเชฏเซเชเชจ เชเชฐเชตเซเช
- เชเซเชฐเชพเชฏเชฒ เชเซเชฎ เชธเชคเซเชฐ เชถเชฐเซ เชเชฐเซ
- เชชเชฐเชฟเชฃเชพเชฎเซ
เชธเซเชฐเซเชธ: www.habr.com