β€žΠΠΎΠ²ΠΈ Π΅ΠΏΠΎΡΠΈβ€œ. ИзяТдамС слона Π½Π° части

β€žΠΠΎΠ²ΠΈ Π΅ΠΏΠΎΡΠΈβ€œ. ИзяТдамС слона Π½Π° части

Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ създам Ρ€Π°Π±ΠΎΡ‚Π½Π° срСда Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅ Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π° "Epics", Π° ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Ρ‰Π΅ раздСля самата ΠΈΠ³Ρ€Π° Π½Π° части, подходящи Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π² OpenFaaS. Π©Π΅ направя всички ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ†ΠΈΠΈ Π½Π° Linux, Ρ‰Π΅ Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ° Kubernetes Π² minikube с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° VirtualBox. Π Π°Π±ΠΎΡ‚Π½Π°Ρ‚Π° ΠΌΠΈ машина ΠΈΠΌΠ° 2 процСсорни ядра ΠΈ 12 GB RAM; ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ SSD ΠΊΠ°Ρ‚ΠΎ систСмСн диск. Π©Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ debian 8 ΠΊΠ°Ρ‚ΠΎ моя основна систСма Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, с инсталирани ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ emacs, sudo, git ΠΈ virtualbox, всичко останало Ρ‰Π΅ сС инсталира Ρ‡Ρ€Π΅Π· изтСглянС ΠΎΡ‚ 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-Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅:

faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cli

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π½Π΅ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° Kubernetes

Π—Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, minikube Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π΅Π½, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ инсталирайтС Π³ΠΎ ΠΈ kubelet Π² /usr/local/bin ΠΈ инсталирайтС helm Π·Π° инсталиранС Π½Π° прилоТСния:

$ 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:

$ 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:

$ 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, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ ΡΠΏΠΈΡΡŠΡ†ΠΈ с ΠΈΠ³Ρ€ΠΈ (ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° ΠΈΠ³Ρ€Π°, Ρ‡Π΅Ρ‚ΠΈΠΌΠΎ Π·Π° Ρ‡ΠΎΠ²Π΅ΠΊΠ° ΠΈΠΌΠ΅ ΠΈ Ρ‚.Π½.).

БъздаванС Π½Π° ΠΈΠ³Ρ€Π°

Ѐункцията Ρ€Π°Π±ΠΎΡ‚ΠΈ само с ΠΎΡ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ; Π½Π° Π²Ρ…ΠΎΠ΄Π° сС ΠΏΡ€ΠΈΠ΅ΠΌΠ° максималСн Π±Ρ€ΠΎΠΉ ΠΈΠ³Ρ€Π°Ρ‡ΠΈ, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠΈ Π³Π΅Ρ€ΠΎΠΈ Π΄Π° сС Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Ρ‚ Π² Ρ‚Π°Π·ΠΈ ΠΈΠ³Ρ€Π°, максималСн Π±Ρ€ΠΎΠΉ ΠΈΠ³Ρ€Π°Ρ‡ΠΈ ΠΈ Ρ‚.Π½.). ΠžΡ‚Π΄Π΅Π»Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π° Π΅ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΠ°Ρ€ΠΎΠ»Π° Π·Π° ΠΏΡ€ΠΈΡΡŠΠ΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅, която Π²ΠΈ позволява Π΄Π° ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ Π½Π΅ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΈ ΠΈΠ³Ρ€ΠΈ. По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ сС създава ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Π° ΠΈΠ³Ρ€Π°. Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ функцията Π΅ JSON, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΏΠΎΠ»Π΅ Π·Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ създаванС, ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ.

ΠŸΡ€ΠΈΡΡŠΠ΅Π΄ΠΈΠ½ΡΠ²Π°Π½Π΅ към ΠΈΠ³Ρ€Π°

Ѐункцията Ρ€Π°Π±ΠΎΡ‚ΠΈ само с ΠΎΡ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ, Π²Ρ…ΠΎΠ΄ΡŠΡ‚ Π΅ ID Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π° ΠΈ Π½Π΅ΠΉΠ½Π°Ρ‚Π° ΠΏΠ°Ρ€ΠΎΠ»Π°, Π°ΠΊΠΎ Ρ‚ΠΎΠ²Π° Π΅ Π½Π΅ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Π° ΠΈΠ³Ρ€Π°, ΠΈΠ·Ρ…ΠΎΠ΄ΡŠΡ‚ Π΅ JSON с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π°. Π£ΠΏΡŠΠ»Π½ΠΎΠΌΠΎΡ‰Π΅Π½ΠΈΡΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ» сС Π² ΠΈΠ³Ρ€Π°Ρ‚Π°, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΡΡŠΠ·Π΄Π°Ρ‚Π΅Π»ΡΡ‚ Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π°, сС Π½Π°Ρ€ΠΈΡ‡Π°Ρ‚ ​​по-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ участници Π² ΠΈΠ³Ρ€Π°Ρ‚Π°.

ΠŸΡ€Π΅Π³Π»Π΅Π΄ Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΡ Π² ΠΈΠ³Ρ€Π°Ρ‚Π°

ВсСки Π½Π΅ΠΎΡ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€Π°Π½ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» ΠΌΠΎΠΆΠ΅ Π΄Π° поиска списък със ΡΡŠΠ±ΠΈΡ‚ΠΈΡ Π·Π° Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ ΠΈΠ³Ρ€ΠΈ, Π° ΡƒΠΏΡŠΠ»Π½ΠΎΠΌΠΎΡ‰Π΅Π½ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈ списък със ΡΡŠΠ±ΠΈΡ‚ΠΈΡ Π·Π° всяка Π°ΠΊΡ‚ΠΈΠ²Π½Π° ΠΈΠ³Ρ€Π°. Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ към функцията ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅Ρ‚ΠΎ, ΠΊΠΎΠΉΡ‚ΠΎ потрСбитСлят Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ°. Π’ Ρ‚ΠΎΠ·ΠΈ случай само ΠΎΠ½Π΅Π·ΠΈ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, ΠΊΠΎΠΈΡ‚ΠΎ са Π½Π°ΡΡ‚ΡŠΠΏΠΈΠ»ΠΈ ΠΏΠΎ-късно, Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π²ΡŠΡ€Π½Π°Ρ‚ΠΈ Π² списъка. Π§Ρ€Π΅Π· ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎΡ‚ΠΎ стартиранС Π½Π° Ρ‚Π°Π·ΠΈ функция, ΠΎΡ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€Π°Π½ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» наблюдава ΠΊΠ°ΠΊΠ²ΠΎ сС случва Π² ΠΈΠ³Ρ€Π°Ρ‚Π°. Π’Π°Π·ΠΈ функция ΡΡŠΡ‰ΠΎ Π²Ρ€ΡŠΡ‰Π° исканС Π·Π° дСйствиС, Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ потрСбитСлят ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ функцията Π·Π° ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΡ Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π°.

Π˜Π·ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅ Π·Π° ΠΈΠ³Ρ€Π°

Ѐункцията Ρ€Π°Π±ΠΎΡ‚ΠΈ само Π·Π° участници Π² ΠΈΠ³Ρ€Π°Ρ‚Π°: възмоТно Π΅ Π΄Π° стартиратС ΠΈΠ³Ρ€Π°Ρ‚Π°, Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ…ΠΎΠ΄, Π΄Π° гласуватС, Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ тСкстово ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ сС ΠΏΠΎΠΊΠ°Π·Π²Π° Π² списъка със ΡΡŠΠ±ΠΈΡ‚ΠΈΡ Π² ΠΈΠ³Ρ€Π°Ρ‚Π° ΠΈ Ρ‚.Π½.
ΠžΡ‚ΠΎΡ€ΠΈΠ·ΠΈΡ€Π°Π½ΠΈΡΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», ΠΊΠΎΠΉΡ‚ΠΎ Π΅ създал ΠΈΠ³Ρ€Π°Ρ‚Π°, Π·Π°ΠΏΠΎΡ‡Π²Π° Π΄Π° разпрСдСля Ρ€ΠΎΠ»ΠΈ Π½Π° всички участници Π² ΠΈΠ³Ρ€Π°Ρ‚Π°, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ сСбС си, Ρ‚Π΅ трябва Π΄Π° ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄ΡΡ‚ ролята си, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΡŠΡ‰Π°Ρ‚Π° функция. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ всички Ρ€ΠΎΠ»ΠΈ са ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄Π΅Π½ΠΈ, ΠΈΠ³Ρ€Π°Ρ‚Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π° Π½Π° Π½ΠΎΡ‰Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ.

Бтатистика Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π°

Ѐункцията Ρ€Π°Π±ΠΎΡ‚ΠΈ само Π·Π° участници Π² ΠΈΠ³Ρ€Π°Ρ‚Π°, ΠΏΠΎΠΊΠ°Π·Π²Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π°, списъка ΠΈ броя Π½Π° ΠΈΠ³Ρ€Π°Ρ‡ΠΈΡ‚Π΅ (Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΠΈ), Ρ€ΠΎΠ»ΠΈΡ‚Π΅ ΠΈ тСхния статус (Π½Π°ΠΏΡ€Π°Π²Π΅Π½ Ρ…ΠΎΠ΄ ΠΈΠ»ΠΈ Π½Π΅), ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³Π° информация. ΠšΠ°ΠΊΡ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° функция, всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ само Π·Π° участницитС Π² ΠΈΠ³Ρ€Π°Ρ‚Π°.

ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ стартирани Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Ако ΠΈΠ³Ρ€Π°Ρ‚Π° Π½Π΅ Π΅ Π±ΠΈΠ»Π° стартирана извСстно Π²Ρ€Π΅ΠΌΠ΅, посочСно ΠΏΡ€ΠΈ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΈΠ³Ρ€Π°Ρ‚Π°, тя Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Ρ‰Π΅ бъдС ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚Π° ΠΎΡ‚ списъка с Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ ΠΈΠ³Ρ€ΠΈ Ρ‡Ρ€Π΅Π· функцията Π·Π° изчистванС.

Π”Ρ€ΡƒΠ³Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½Π° Π·Π°Π΄Π°Ρ‡Π° Π΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»Π½ΠΎΡ‚ΠΎ ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Π½Π° ΠΈΠ³Ρ€Π° ΠΎΡ‚ Π½ΠΎΡ‰Π΅Π½ към Π΄Π½Π΅Π²Π΅Π½ ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π·Π° ΠΈΠ³Ρ€ΠΈ, Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ Ρ‚ΠΎΠ²Π° Π½Π΅ сС Π΅ случило ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ…ΠΎΠ΄Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ³Ρ€Π°Ρ‡, ΠΊΠΎΠΉΡ‚ΠΎ трябва Π΄Π° Ρ€Π΅Π°Π³ΠΈΡ€Π° Π½Π° ΠΈΠ³Ρ€ΠΎΠ²ΠΎ ΡΡŠΠ±ΠΈΡ‚ΠΈΠ΅, Π½Π΅ Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΠ» своСто Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ някаква ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° ).

Π‘ΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅

  • въвСдСниС
  • Настройка Π½Π° срСдата Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Ρ€Π°Π·Π±ΠΈΠ²Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  • Π‘Π΅ΠΊΠ΅Π½Π΄ Ρ€Π°Π±ΠΎΡ‚Π°
  • Frontend Ρ€Π°Π±ΠΎΡ‚Π°
  • Настройка Π½Π° CICD, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° тСстванС
  • Π—Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ±Π½Π° ΠΈΠ³Ρ€ΠΎΠ²Π° сСсия
  • Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ ΠΎΡ‚

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€