ืื ื• ื™ื•ืฆืจื™ื ืžืฉื™ืžืช ืคืจื™ืกื” ื‘-GKE ืœืœื ืชื•ืกืคื™ื, SMS ืื• ืจื™ืฉื•ื. ื‘ื•ื ื ืฆื™ืฅ ืžืชื—ืช ืœื–'ืงื˜ ืฉืœ ื’'ื ืงื™ื ืก

ื”ื›ืœ ื”ืชื—ื™ืœ ื›ืืฉืจ ืจืืฉ ื”ืฆื•ื•ืช ืฉืœ ืื—ื“ ืžืฆื•ื•ืชื™ ื”ืคื™ืชื•ื— ืฉืœื ื• ื‘ื™ืงืฉ ืžืื™ืชื ื• ืœื‘ื“ื•ืง ืืช ื”ืืคืœื™ืงืฆื™ื” ื”ื—ื“ืฉื” ืฉืœื”ื, ืฉื”ื•ื›ื ืกื” ืœืžื›ื•ืœื•ืช ื™ื•ื ืงื•ื“ื ืœื›ืŸ. ืคืจืกืžืชื™ ืืช ื–ื”. ืœืื—ืจ ื›-20 ื“ืงื•ืช ื”ืชืงื‘ืœื” ื‘ืงืฉื” ืœืขื“ื›ื•ืŸ ื”ืืคืœื™ืงืฆื™ื”, ื›ื™ ื”ืชื•ื•ืกืฃ ืฉื ื“ื‘ืจ ืžืื•ื“ ื ื—ื•ืฅ. ื—ื™ื“ืฉืชื™. ืื—ืจื™ ืขื•ื“ ื›ืžื” ืฉืขื•ืช... ื•ื‘ื›ืŸ, ืืชื ื™ื›ื•ืœื™ื ืœื ื—ืฉ ืžื” ื”ืชื—ื™ืœ ืœืงืจื•ืช ืื—ืจ ื›ืš...

ืื ื™ ื—ื™ื™ื‘ ืœื”ื•ื“ื•ืช, ืื ื™ ื“ื™ ืขืฆืœืŸ (ืœื ื”ื•ื“ื™ืชื™ ื‘ื–ื” ืงื•ื“ื? ืœื?), ื•ื‘ื”ืชื—ืฉื‘ ื‘ืขื•ื‘ื“ื” ืฉืœืจืืฉื™ ืฆื•ื•ืช ื™ืฉ ื’ื™ืฉื” ืœื’'ื ืงื™ื ืก, ืฉื‘ื• ื™ืฉ ืœื›ื•ืœื ื• CI/CD, ื—ืฉื‘ืชื™: ืชืŸ ืœื• ืœืคืจื•ืก ื‘ืชื•ืจ ื›ืžื” ืฉื”ื•ื ืจื•ืฆื”! ื ื–ื›ืจืชื™ ื‘ื‘ื“ื™ื—ื”: ืชืŸ ืœืื“ื ื“ื’ ื•ื”ื•ื ื™ืื›ืœ ืœื™ื•ื; ืชืงืจืื• ืœืื“ื Fed ื•ื”ื•ื ื™ื”ื™ื” ืžืื›ื™ืœ ื›ืœ ื—ื™ื™ื•. ื•ื”ืœืš ืœืฉื—ืง ื˜ืจื™ืงื™ื ื‘ืขื‘ื•ื“ื”, ืืฉืจ ื™ื•ื›ืœ ืœืคืจื•ืก ืงื•ื ื˜ื™ื™ื ืจ ื”ืžื›ื™ืœ ืืช ื”ื™ื™ืฉื•ื ืฉืœ ื›ืœ ื’ืจืกื” ืฉื ื‘ื ืชื” ื‘ื”ืฆืœื—ื” ืœืชื•ืš Kuber ื•ืœื”ืขื‘ื™ืจ ืืœื™ื• ื›ืœ ืขืจื›ื™ื ENV (ืกื‘ื™, ืคื™ืœื•ืœื•ื’, ืžื•ืจื” ืœืื ื’ืœื™ืช ื‘ืขื‘ืจ, ื”ื™ื” ืžืกื•ื‘ื‘ ืขื›ืฉื™ื• ืืช ืืฆื‘ืขื• ืืœ ืจืงืชื• ื•ืžื‘ื™ื˜ ื‘ื™ ื‘ืฆื•ืจื” ืžืื•ื“ ืืงืกืคืจืกื™ื‘ื™ืช ืœืื—ืจ ืงืจื™ืืช ื”ืžืฉืคื˜ ื”ื–ื”).

ืื–, ื‘ื”ืขืจื” ื–ื• ืืกืคืจ ืœืš ื›ื™ืฆื“ ืœืžื“ืชื™:

  1. ืขื“ื›ืŸ ื‘ืื•ืคืŸ ื“ื™ื ืžื™ ืžืฉืจื•ืช ื‘ื’'ื ืงื™ื ืก ืžื”ืขื‘ื•ื“ื” ืขืฆืžื” ืื• ืžืขื‘ื•ื“ื•ืช ืื—ืจื•ืช;
  2. ื”ืชื—ื‘ืจ ืœืงื•ื ืกื•ืœืช ื”ืขื ืŸ (Coud shell) ืžืฆื•ืžืช ืขื ืกื•ื›ืŸ Jenkins ืžื•ืชืงืŸ;
  3. ืคืจื•ืก ืขื•ืžืก ืขื‘ื•ื“ื” ื‘ืžื ื•ืข Google Kubernetes.


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

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

ื›ืชื‘ ื•ื™ืชื•ืจ: 1. ื”ืคืชืง ื ื›ืชื‘ "ืœืขืฆืžื™", ืœืชืคืงื™ื“ ื”ืชืจื’ื•ืœ ื”ื˜ื•ื‘ ื‘ื™ื•ืชืจ ืื™ื ื• ื—ืœ. ืื ื™ ืฉืžื— ืœืงืจื•ื ืืช ืืคืฉืจื•ื™ื•ืช "ืขื“ื™ืฃ ื”ื™ื” ืœืขืฉื•ืช ืืช ื–ื” ื›ื›ื”" ื‘ืชื’ื•ื‘ื•ืช.
2. ืื ื”ื—ืœืง ื”ืžื™ื•ืฉื ืฉืœ ื”ืชื• ื ื—ืฉื‘ ืœืžืœื—, ืื–, ื›ืžื• ื›ืœ ื”ื”ืขืจื•ืช ื”ืงื•ื“ืžื•ืช ืฉืœื™, ื–ื” ื”ื•ื ืชืžื™ืกืช ืžืœื— ื—ืœืฉื”.

ืขื“ื›ื•ืŸ ื“ื™ื ืžื™ ืฉืœ ื”ื’ื“ืจื•ืช ืขื‘ื•ื“ื” ื‘ื’'ื ืงื™ื ืก

ืื ื™ ืฆื•ืคื” ืืช ื”ืฉืืœื” ืฉืœืš: ืžื” ื”ืงืฉืจ ืœืขื“ื›ื•ืŸ ืขื‘ื•ื“ื” ื“ื™ื ืžื™? ื”ื–ืŸ ืืช ื”ืขืจืš ืฉืœ ืคืจืžื˜ืจ ื”ืžื—ืจื•ื–ืช ื‘ืื•ืคืŸ ื™ื“ื ื™ ื•ื”ืœื›ืชื™!

ืื ื™ ืขื•ื ื”: ืื ื™ ืžืžืฉ ืขืฆืœืŸ, ืื ื™ ืœื ืื•ื”ื‘ ืืช ื–ื” ื›ืฉื”ื ืžืชืœื•ื ื ื™ื: ืžื™ืฉื”, ื”ืคืจื™ืกื” ืงื•ืจืกืช, ื”ื›ืœ ื ืขืœื! ืืชื” ืžืชื—ื™ืœ ืœื—ืคืฉ, ื•ื™ืฉ ืฉื’ื™ืืช ื”ืงืœื“ื” ื‘ืขืจืš ืฉืœ ืคืจืžื˜ืจ ื”ืคืขืœืช ืžืฉื™ืžื” ื›ืœืฉื”ื•. ืœื›ืŸ, ืื ื™ ืžืขื“ื™ืฃ ืœืขืฉื•ืช ื”ื›ืœ ื‘ืฆื•ืจื” ื”ื›ื™ ื™ืขื™ืœื” ืฉืืคืฉืจ. ืื ืืคืฉืจ ืœืžื ื•ืข ืžื”ืžืฉืชืžืฉ ืœื”ื–ื™ืŸ ื ืชื•ื ื™ื ื™ืฉื™ืจื•ืช ืขืœ ื™ื“ื™ ืžืชืŸ ื‘ืžืงื•ื ืจืฉื™ืžื” ืฉืœ ืขืจื›ื™ื ืœื‘ื—ื™ืจื”, ืื– ืื ื™ ืžืืจื’ืŸ ืืช ื”ื‘ื—ื™ืจื”.

ื”ืชื•ื›ื ื™ืช ื”ื™ื ื›ื–ื•: ืื ื• ื™ื•ืฆืจื™ื ืขื‘ื•ื“ื” ื‘ื’'ื ืงื™ื ืก, ืฉื‘ื”, ืœืคื ื™ ื”ื”ืฉืงื”, ื ื•ื›ืœ ืœื‘ื—ื•ืจ ื’ืจืกื” ืžื”ืจืฉื™ืžื”, ืœืฆื™ื™ืŸ ืขืจื›ื™ื ืœืคืจืžื˜ืจื™ื ืฉื”ื•ืขื‘ืจื• ืœืงื•ื ื˜ื™ื™ื ืจ ื‘ืืžืฆืขื•ืช ENV, ื•ืื– ื”ื•ื ืื•ืกืฃ ืืช ื”ืžื™ื›ืœ ื•ื“ื•ื—ืฃ ืื•ืชื• ืœ-Container Registry. ื•ืื– ืžืฉื ื”ืžื™ื›ืœ ืžื•ืฉืง ื‘-cuber as ืขื•ืžืก ืขื‘ื•ื“ื” ืขื ื”ืคืจืžื˜ืจื™ื ืฉืฆื•ื™ื ื• ื‘ืชืคืงื™ื“.

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

ืื™ืŸ ื›ืœ ื›ืš ื”ืจื‘ื” ืืคืฉืจื•ื™ื•ืช. ืฉื ื™ ื“ื‘ืจื™ื ืขืœื• ืžื™ื“ ื‘ืจืืฉ:

  • ื”ืฉืชืžืฉ ื‘-API ืฉืœ ื’ื™ืฉื” ืžืจื—ื•ืง ืฉื’'ื ืงื™ื ืก ืžืฆื™ืข ืœืžืฉืชืžืฉื™ื ืฉืœื•;
  • ื‘ืงืฉ ืืช ื”ืชื•ื›ืŸ ืฉืœ ืชื™ืงื™ื™ืช ื”ืžืื’ืจ ื”ืžืจื•ื—ืง (ื‘ืžืงืจื” ืฉืœื ื• ื–ื” JFrog Artifactory, ื•ื–ื” ืœื ื—ืฉื•ื‘).

Jenkins Remote Access API

ืœืคื™ ื”ืžืกื•ืจืช ื”ืžืฆื•ื™ื ืช ืฉื ืงื‘ืขื”, ืืขื“ื™ืฃ ืœื”ื™ืžื ืข ืžื”ืกื‘ืจื™ื ืืจื•ื›ื™ื.
ืืจืฉื” ืœืขืฆืžื™ ืจืง ืชืจื’ื•ื ื—ื•ืคืฉื™ ืฉืœ ื—ืœืง ืžื”ืคืกืงื” ื”ืจืืฉื•ื ื” ืขืžื•ื“ ืจืืฉื•ืŸ ืฉืœ ืชื™ืขื•ื“ API:

Jenkins ืžืกืคืงืช ืžืžืฉืง API ืœื’ื™ืฉื” ืงืจื™ืืช ืžื—ืฉื‘ ืžืจื—ื•ืง ืœืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืฉืœื•. <โ€ฆ> ื’ื™ืฉื” ืžืจื—ื•ืง ืžื•ืฆืขืช ื‘ืกื’ื ื•ืŸ ื“ืžื•ื™ REST. ื”ืžืฉืžืขื•ืช ื”ื™ื ืฉืื™ืŸ ื ืงื•ื“ืช ื›ื ื™ืกื” ืื—ืช ืœื›ืœ ื”ืชื›ื•ื ื•ืช, ืืœื ื›ืชื•ื‘ืช ืืชืจ ื›ืžื• ".../api/", ืื™ืคื” "..." ืคื™ืจื•ืฉื• ื”ืื•ื‘ื™ื™ืงื˜ ืฉืขืœื™ื• ืžื•ื—ืœื•ืช ื™ื›ื•ืœื•ืช ื”-API.

ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ืื ืžืฉื™ืžืช ื”ืคืจื™ืกื” ืขืœื™ื” ืื ื• ืžื“ื‘ืจื™ื ื›ืขืช ื–ืžื™ื ื” ื‘ http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build, ืื– ืฉืจื™ืงื•ืช ื”-API ืœืžืฉื™ืžื” ื–ื• ื–ืžื™ื ื•ืช ื‘ื›ืชื•ื‘ืช http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

ืœืื—ืจ ืžื›ืŸ, ื™ืฉ ืœื ื• ื‘ื—ื™ืจื” ื‘ืื™ื–ื• ืฆื•ืจื” ืœืงื‘ืœ ืืช ื”ืคืœื˜. ื‘ื•ืื• ื ืชืžืงื“ ื‘-XML, ืฉื›ืŸ ื”-API ืžืืคืฉืจ ืกื™ื ื•ืŸ ืจืง ื‘ืžืงืจื” ื–ื”.

ื‘ื•ื ื ื ืกื” ืœืงื‘ืœ ืจืฉื™ืžื” ืฉืœ ื›ืœ ื”ืขื‘ื•ื“ื•ืช. ืื ื—ื ื• ืžืขื•ื ื™ื™ื ื™ื ืจืง ื‘ืฉื ื”ื”ืจื›ื‘ื” (ื”ืฆื’ ืฉื) ื•ื”ืชื•ืฆืื” ืฉืœื• (ืชื•ืฆืื”):

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]

ื”ืชื‘ืจืจ?

ืขื›ืฉื™ื• ื‘ื•ืื• ื ืกื ืŸ ืจืง ืืช ื”ืจื™ืฆื•ืช ืฉื”ืกืชื™ื™ืžื• ื‘ืชื•ืฆืื” ื”ึทืฆืœึธื—ึธื”. ื‘ื•ืื• ื ืฉืชืžืฉ ื‘ื˜ื™ืขื•ืŸ &ืœื ืœื›ืœื•ืœ ื•ื›ืคืจืžื˜ืจ ื ืขื‘ื™ืจ ืœื• ืืช ื”ื ืชื™ื‘ ืœืขืจืš ืœื ืฉื•ื•ื” ื”ึทืฆืœึธื—ึธื”. ื›ืŸ ื›ืŸ. ืฉืœื™ืœื™ืช ื›ืคื•ืœื” ื”ื™ื ืืžื™ืจื”. ืื ื• ืœื ื›ื•ืœืœื™ื ืืช ื›ืœ ืžื” ืฉืœื ืžืขื ื™ื™ืŸ ืื•ืชื ื•:

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!='SUCCESS']

ืฆื™ืœื•ื ืžืกืš ืฉืœ ืจืฉื™ืžืช ื”ืžืฆืœื™ื—ื™ื
ืื ื• ื™ื•ืฆืจื™ื ืžืฉื™ืžืช ืคืจื™ืกื” ื‘-GKE ืœืœื ืชื•ืกืคื™ื, SMS ืื• ืจื™ืฉื•ื. ื‘ื•ื ื ืฆื™ืฅ ืžืชื—ืช ืœื–'ืงื˜ ืฉืœ ื’'ื ืงื™ื ืก

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

http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result='SUCCESS']

ืฆื™ืœื•ื ืžืกืš ืฉืœ ืจืฉื™ืžืช ื”ืœื ืžื•ืฆืœื—ื™ื
ืื ื• ื™ื•ืฆืจื™ื ืžืฉื™ืžืช ืคืจื™ืกื” ื‘-GKE ืœืœื ืชื•ืกืคื™ื, SMS ืื• ืจื™ืฉื•ื. ื‘ื•ื ื ืฆื™ืฅ ืžืชื—ืช ืœื–'ืงื˜ ืฉืœ ื’'ื ืงื™ื ืก

ืจืฉื™ืžืช ื’ืจืกืื•ืช ืžืชื™ืงื™ื” ื‘ืฉืจืช ืžืจื•ื—ืง

ื™ืฉ ื“ืจืš ืฉื ื™ื™ื” ืœืงื‘ืœ ืจืฉื™ืžื” ืฉืœ ื’ืจืกืื•ืช. ืื ื™ ืื•ื”ื‘ ืืช ื–ื” ืืคื™ืœื• ื™ื•ืชืจ ืžื’ื™ืฉื” ืœ-API ืฉืœ Jenkins. ื•ื‘ื›ืŸ, ื›ื™ ืื ื”ืืคืœื™ืงืฆื™ื” ื ื‘ื ืชื” ื‘ื”ืฆืœื—ื”, ื–ื” ืื•ืžืจ ืฉื”ื™ื ื ืืจื–ื” ื•ื”ื•ืฆื‘ื” ื‘ืžืื’ืจ ื‘ืชื™ืงื™ื™ื” ื”ืžืชืื™ืžื”. ื›ืžื•, ืžืื’ืจ ื”ื•ื ืื—ืกื•ืŸ ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ืฉืœ ื’ืจืกืื•ืช ืขื•ื‘ื“ื•ืช ืฉืœ ื™ื™ืฉื•ืžื™ื. ื›ืžื•. ื•ื‘ื›ืŸ, ื‘ื•ื ื ืฉืืœ ืื•ืชื• ืื™ืœื• ื’ืจืกืื•ืช ื ืžืฆืื•ืช ื‘ืื—ืกื•ืŸ. ื ืกืœืกืœ, ื ื’ื™ืฃ ื•ื ืขื™ืฃ ืืช ื”ืชื™ืงื™ื” ื”ืžืจื•ื—ืงืช. ืื ืžื™ืฉื”ื• ืžืขื•ื ื™ื™ืŸ ื‘-oneliner, ืื– ื–ื” ืžืชื—ืช ืœืกืคื•ื™ืœืจ.

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

curl -H "X-JFrog-Art-Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )

ื”ื’ื“ืจืช ืขื‘ื•ื“ื•ืช ื•ืงื•ื‘ืฅ ืชืฆื•ืจืช ืขื‘ื•ื“ื” ื‘ื’'ื ืงื™ื ืก

ื”ื‘ื ื• ืืช ื”ืžืงื•ืจ ืฉืœ ืจืฉื™ืžืช ื”ื’ืจืกืื•ืช. ื›ืขืช ื ืฉืœื‘ ืืช ื”ืจืฉื™ืžื” ืฉื”ืชืงื‘ืœื” ื‘ืžืฉื™ืžื”. ืขื‘ื•ืจื™, ื”ืคืชืจื•ืŸ ื”ื‘ืจื•ืจ ื”ื™ื” ืœื”ื•ืกื™ืฃ ืฉืœื‘ ื‘ืžืฉื™ืžืช ื‘ื ื™ื™ืช ื”ืืคืœื™ืงืฆื™ื”. ื”ืฆืขื“ ืฉื™ื‘ื•ืฆืข ืื ื”ืชื•ืฆืื” ื”ื™ื™ืชื” "ื”ืฆืœื—ื”".

ืคืชื— ืืช ื”ื’ื“ืจื•ืช ืžืฉื™ืžืช ื”ื”ืจื›ื‘ื” ื•ื’ืœื•ืœ ืขื“ ืœืžื˜ื”. ืœื—ืฅ ืขืœ ื”ื›ืคืชื•ืจื™ื: ื”ื•ืกืฃ ืฉืœื‘ ื‘ื ื™ื™ื” -> ืฉืœื‘ ืžื•ืชื ื” (ื™ื—ื™ื“). ื‘ื”ื’ื“ืจื•ืช ื”ืฉืœื‘, ื‘ื—ืจ ืืช ื”ืชื ืื™ ืžืฆื‘ ื‘ื ื™ื™ื” ื ื•ื›ื—ื™, ื”ื’ื“ืจ ืืช ื”ืขืจืš ื”ึทืฆืœึธื—ึธื”, ื”ืคืขื•ืœื” ืฉื™ืฉ ืœื‘ืฆืข ืื ืชืฆืœื™ื— ื”ืคืขืœ ืคืงื•ื“ืช ืžืขื˜ืคืช.

ื•ืขื›ืฉื™ื• ื”ื—ืœืง ื”ื›ื™ืคื™. ื’'ื ืงื™ื ืก ืžืื—ืกืŸ ืชืฆื•ืจื•ืช ืขื‘ื•ื“ื” ื‘ืงื‘ืฆื™ื. ื‘ืคื•ืจืžื˜ XML. ื‘ื“ืจืš http://ะฟัƒั‚ัŒ-ะดะพ-ะทะฐะดะฐะฝะธั/config.xml ื‘ื”ืชืื ืœื›ืš, ื ื™ืชืŸ ืœื”ื•ืจื™ื“ ืืช ืงื•ื‘ืฅ ื”ืชืฆื•ืจื”, ืœืขืจื•ืš ืื•ืชื• ืœืคื™ ื”ืฆื•ืจืš ื•ืœื”ื—ื–ื™ืจ ืื•ืชื• ืœืžืงื•ื ื‘ื• ืงื™ื‘ืœืช ืื•ืชื•.

ื–ื›ืจื•, ื”ืกื›ืžื ื• ืœืžืขืœื” ืฉื ื™ืฆื•ืจ ืคืจืžื˜ืจ ืœืจืฉื™ืžืช ื”ื’ืจืกืื•ืช BUILD_VERSION?

ื‘ื•ื ื ื•ืจื™ื“ ืืช ืงื•ื‘ืฅ ื”ืชืฆื•ืจื” ื•ื ืกืชื›ืœ ื‘ืชื•ื›ื•. ืจืง ื›ื“ื™ ืœื•ื•ื“ื ืฉื”ืคืจืžื˜ืจ ื‘ืžืงื•ื ื•ืžื”ืกื•ื’ ื”ืจืฆื•ื™.

ืฆื™ืœื•ื ืžืกืš ืชื—ืช ืกืคื•ื™ืœืจ.

ืงื˜ืข ื”-config.xml ืฉืœืš ืืžื•ืจ ืœื”ื™ืจืื•ืช ืื•ืชื• ื”ื“ื‘ืจ. ืืœื ืฉื”ืชื•ื›ืŸ ืฉืœ ืืœืžื ื˜ ื”ื‘ื—ื™ืจื•ืช ืขื“ื™ื™ืŸ ื—ืกืจ
ืื ื• ื™ื•ืฆืจื™ื ืžืฉื™ืžืช ืคืจื™ืกื” ื‘-GKE ืœืœื ืชื•ืกืคื™ื, SMS ืื• ืจื™ืฉื•ื. ื‘ื•ื ื ืฆื™ืฅ ืžืชื—ืช ืœื–'ืงื˜ ืฉืœ ื’'ื ืงื™ื ืก

ื”ืื ืืชื” ื‘ื˜ื•ื—? ื–ื”ื•, ื‘ื•ืื• ื ื›ืชื•ื‘ ืกืงืจื™ืคื˜ ืฉื™ื‘ื•ืฆืข ืื ื”ื‘ื ื™ื™ื” ืชืฆืœื™ื—.
ื”ืกืงืจื™ืคื˜ ื™ืงื‘ืœ ืจืฉื™ืžืช ื’ืจืกืื•ืช, ื™ื•ืจื™ื“ ืืช ืงื•ื‘ืฅ ื”ืชืฆื•ืจื”, ื™ื›ืชื•ื‘ ืœืชื•ื›ื• ืืช ืจืฉื™ืžืช ื”ื’ืจืกืื•ืช ื‘ืžืงื•ื ืฉืื ื• ืฆืจื™ื›ื™ื, ื•ืื– ื™ื—ื–ื™ืจ ืื•ืชื•. ื›ืŸ. ื–ื” ื ื›ื•ืŸ. ื›ืชื•ื‘ ืจืฉื™ืžื” ืฉืœ ื’ืจืกืื•ืช ื‘-XML ื‘ืžืงื•ื ืฉื‘ื• ื›ื‘ืจ ื™ืฉ ืจืฉื™ืžืช ื’ืจืกืื•ืช (ืชื”ื™ื” ื‘ืขืชื™ื“, ืœืื—ืจ ื”ื”ืฉืงื” ื”ืจืืฉื•ื ื” ืฉืœ ื”ืกืงืจื™ืคื˜). ืื ื™ ื™ื•ื“ืข ืฉื™ืฉ ืขื“ื™ื™ืŸ ืžืขืจื™ืฆื™ื ืขื–ื™ื ืฉืœ ื‘ื™ื˜ื•ื™ื™ื ืงื‘ื•ืขื™ื ื‘ืขื•ืœื. ืื ื™ ืœื ืฉื™ื™ืš ืืœื™ื”ื. ื ื ืœื”ืชืงื™ืŸ xmlstarler ืœืžื›ื•ื ื” ืฉื‘ื” ืชืขืจืš ื”ืชืฆื•ืจื”. ื ืจืื” ืœื™ ืฉื–ื” ืœื ืžื—ื™ืจ ื›ืœ ื›ืš ื’ื“ื•ืœ ืœืฉืœื ื›ื“ื™ ืœื”ื™ืžื ืข ืžืขืจื™ื›ืช XML ื‘ืืžืฆืขื•ืช sed.

ืžืชื—ืช ืœืกืคื•ื™ืœืจ, ืื ื™ ืžืฆื™ื’ ืืช ื”ืงื•ื“ ืฉืžื‘ืฆืข ืืช ื”ืจืฆืฃ ื”ื "ืœ ื‘ืžืœื•ืื•.

ื›ืชื•ื‘ ืจืฉื™ืžื” ืฉืœ ื’ืจืกืื•ืช ืžืชื™ืงื™ื” ื‘ืฉืจืช ื”ืžืจื•ื—ืง ืœืชืฆื•ืจื”

#!/bin/bash
############## ะกะบะฐั‡ะธะฒะฐะตะผ ะบะพะฝั„ะธะณ
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml

############## ะฃะดะฐะปัะตะผ ะธ ะทะฐะฝะพะฒะพ ัะพะทะดะฐะตะผ xml-ัะปะตะผะตะฝั‚ ะดะปั ัะฟะธัะบะฐ ะฒะตั€ัะธะน
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml

xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml

xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml

############## ะงะธั‚ะฐะตะผ ะฒ ะผะฐััะธะฒ ัะฟะธัะพะบ ะฒะตั€ัะธะน ะธะท ั€ะตะฟะพะทะธั‚ะพั€ะธั
readarray -t vers < <( curl -H "X-JFrog-Art-Api:Api:VeryLongAPIKey" -s http://arts.myre.po/artifactory/awesomeapp/ | sed 's/a href=//' | grep "$(date +%b)-$(date +%Y)|$(date +%b --date='-1 month')-$(date +%Y)" | awk '{print $1}' | grep -oP '>K[^/]+' )

############## ะŸะธัˆะตะผ ะผะฐััะธะฒ ัะปะตะผะตะฝั‚ ะทะฐ ัะปะตะผะตะฝั‚ะพะผ ะฒ ะบะพะฝั„ะธะณ
printf '%sn' "${vers[@]}" | sort -r | 
                while IFS= read -r line
                do
                    xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
                done

############## ะšะปะฐะดะตะผ ะบะพะฝั„ะธะณ ะฒะทะฐะด
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml

############## ะŸั€ะธะฒะพะดะธะผ ั€ะฐะฑะพั‡ะตะต ะผะตัั‚ะพ ะฒ ะฟะพั€ัะดะพะบ
rm -f appConfig.xml

ืื ืืชื” ืžืขื“ื™ืฃ ืืช ื”ืืคืฉืจื•ืช ืœืงื‘ืœ ื’ืจืกืื•ืช ืžื’'ื ืงื™ื ืก ื•ืืชื” ืขืฆืœืŸ ื›ืžื•ื ื™, ืื– ืžืชื—ืช ืœืกืคื•ื™ืœืจ ื ืžืฆื ืื•ืชื• ืงื•ื“, ืื‘ืœ ืจืฉื™ืžื” ืžื’'ื ืงื™ื ืก:

ื›ืชื•ื‘ ืจืฉื™ืžื” ืฉืœ ื’ืจืกืื•ืช ืžื’'ื ืงื™ื ืก ืœืชืฆื•ืจื”
ืจืง ื–ื›ื•ืจ ื–ืืช: ืฉื ื”ื”ืจื›ื‘ื” ืฉืœื™ ืžื•ืจื›ื‘ ืžืžืกืคืจ ืจืฆืฃ ื•ืžืกืคืจ ื’ืจืกื”, ืžื•ืคืจื“ื™ื ื‘ืืžืฆืขื•ืช ื ืงื•ื“ืชื™ื™ื. ื‘ื”ืชืื, awk ืžื ืชืงืช ืืช ื”ื—ืœืง ื”ืžื™ื•ืชืจ. ืขื‘ื•ืจ ืขืฆืžืš, ืฉื ื” ืงื• ื–ื” ื›ืš ืฉื™ืชืื™ื ืœืฆืจื›ื™ื ืฉืœืš.

#!/bin/bash
############## ะกะบะฐั‡ะธะฒะฐะตะผ ะบะพะฝั„ะธะณ
curl -X GET -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml -o appConfig.xml

############## ะฃะดะฐะปัะตะผ ะธ ะทะฐะฝะพะฒะพ ัะพะทะดะฐะตะผ xml-ัะปะตะผะตะฝั‚ ะดะปั ัะฟะธัะบะฐ ะฒะตั€ัะธะน
xmlstarlet ed --inplace -d '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' appConfig.xml

xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]' --type elem -n a appConfig.xml

xmlstarlet ed --inplace --insert '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a' --type attr -n class -v string-array appConfig.xml

############## ะŸะธัˆะตะผ ะฒ ั„ะฐะนะป ัะฟะธัะพะบ ะฒะตั€ัะธะน ะธะท Jenkins
curl -g -X GET -u username:apiKey 'http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result!=%22SUCCESS%22]&pretty=true' -o builds.xml

############## ะงะธั‚ะฐะตะผ ะฒ ะผะฐััะธะฒ ัะฟะธัะพะบ ะฒะตั€ัะธะน ะธะท XML
readarray vers < <(xmlstarlet sel -t -v "freeStyleProject/allBuild/displayName" builds.xml | awk -F":" '{print $2}')

############## ะŸะธัˆะตะผ ะผะฐััะธะฒ ัะปะตะผะตะฝั‚ ะทะฐ ัะปะตะผะตะฝั‚ะพะผ ะฒ ะบะพะฝั„ะธะณ
printf '%sn' "${vers[@]}" | sort -r | 
                while IFS= read -r line
                do
                    xmlstarlet ed --inplace --subnode '/project/properties/hudson.model.ParametersDefinitionProperty/parameterDefinitions/hudson.model.ChoiceParameterDefinition[name="BUILD_VERSION"]/choices[@class="java.util.Arrays$ArrayList"]/a[@class="string-array"]' --type elem -n string -v "$line" appConfig.xml
                done

############## ะšะปะฐะดะตะผ ะบะพะฝั„ะธะณ ะฒะทะฐะด
curl -X POST -u username:apiKey http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_k8s/config.xml --data-binary @appConfig.xml

############## ะŸั€ะธะฒะพะดะธะผ ั€ะฐะฑะพั‡ะตะต ะผะตัั‚ะพ ะฒ ะฟะพั€ัะดะพะบ
rm -f appConfig.xml

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

ืจืฉื™ืžืช ื’ืจืกืื•ืช ืฉื”ื•ืฉืœืžื” ื›ื”ืœื›ื”
ืื ื• ื™ื•ืฆืจื™ื ืžืฉื™ืžืช ืคืจื™ืกื” ื‘-GKE ืœืœื ืชื•ืกืคื™ื, SMS ืื• ืจื™ืฉื•ื. ื‘ื•ื ื ืฆื™ืฅ ืžืชื—ืช ืœื–'ืงื˜ ืฉืœ ื’'ื ืงื™ื ืก

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

ืžืชื—ื‘ืจ ืœ-Cloud shell

ื™ืฉ ืœื ื• ืืกืคื ื™ื ื‘ืžื›ื•ืœื•ืช. ืื ื• ืžืฉืชืžืฉื™ื ื‘-Ansible ื›ื›ืœื™ ืืกืคืงืช ื”ืืคืœื™ืงืฆื™ื•ืช ื•ืžื ื”ืœ ื”ืชืฆื•ืจื” ืฉืœื ื•. ื‘ื”ืชืื ืœื›ืš, ื›ืฉืžื“ื•ื‘ืจ ื‘ื‘ื ื™ื™ืช ืงื•ื ื˜ื™ื™ื ืจื™ื, ืขื•ืœื•ืช ื‘ืจืืฉ ืฉืœื•ืฉ ืืคืฉืจื•ื™ื•ืช: ื”ืชืงื ืช Docker ื‘-Docker, ื”ืชืงื ืช Docker ืขืœ ืžื›ื•ื ื” ืฉื‘ื” ืคื•ืขืœืช Ansible, ืื• ื‘ื ื™ื™ืช ืงื•ื ื˜ื™ื™ื ืจื™ื ื‘ืงื•ื ืกื•ืœืช ืขื ืŸ. ื”ืกื›ืžื ื• ืœืฉืชื•ืง ืœื’ื‘ื™ ืชื•ืกืคื™ื ืขื‘ื•ืจ Jenkins ื‘ืžืืžืจ ื–ื”. ื–ื›ื•ืจ?

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

ื›ื“ื™ ืœื”ืชื—ื‘ืจ ืœืžืกื•ืฃ ื”ืขื ืŸ, ืืชื” ืฆืจื™ืš ืฉื ื™ ื“ื‘ืจื™ื: gcloud ื•ื–ื›ื•ื™ื•ืช ื’ื™ืฉื” ืœ Google Cloud API ืขื‘ื•ืจ ืžื•ืคืข ื”-VM ืฉืื™ืชื• ื™ืชื‘ืฆืข ืื•ืชื• ื—ื™ื‘ื•ืจ.

ืœืžื™ ืฉืžืชื›ื ืŸ ืœื”ืชื—ื‘ืจ ื‘ื›ืœืœ ืœื ืžื”ืขื ืŸ ืฉืœ ื’ื•ื’ืœ
ื’ื•ื’ืœ ืžืืคืฉืจืช ืืช ื”ืืคืฉืจื•ืช ืœื‘ื˜ืœ ืืช ื”ื”ืจืฉืื” ื”ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ืช ื‘ืฉื™ืจื•ืชื™ื”. ื–ื” ื™ืืคืฉืจ ืœืš ืœื”ืชื—ื‘ืจ ืœืงื•ื ืกื•ืœื” ืืคื™ืœื• ืžืžื›ื•ื ืช ืงืคื”, ืื ื”ื™ื ืคื•ืขืœืช *nix ื•ื™ืฉ ืœื” ืงื•ื ืกื•ืœื” ืขืฆืžื”.

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

ื”ื“ืจืš ื”ืงืœื” ื‘ื™ื•ืชืจ ืœื”ืขื ื™ืง ื–ื›ื•ื™ื•ืช ื”ื™ื ื“ืจืš ืžืžืฉืง ื”ืื™ื ื˜ืจื ื˜.

  1. ืขืฆื•ืจ ืืช ืžื•ืคืข ื”-VM ืฉืžืžื ื• ืชืชื—ื‘ืจ ืœืื—ืจ ืžื›ืŸ ืœืžืกื•ืฃ ื”ืขื ืŸ.
  2. ืคืชื— ืืช ืคืจื˜ื™ ืžื•ืคืข ื•ืœื—ืฅ ืœืชืงืŸ.
  3. ืžืžืฉ ื‘ืชื—ืชื™ืช ื”ืขืžื•ื“, ื‘ื—ืจ ืืช ื”ื™ืงืฃ ื”ื’ื™ืฉื” ืœืžื•ืคืข ื’ื™ืฉื” ืžืœืื” ืœื›ืœ ืžืžืฉืงื™ ื”-API ืฉืœ ื”ืขื ืŸ.

    ืฆื™ืœื•ื ืžืกืš
    ืื ื• ื™ื•ืฆืจื™ื ืžืฉื™ืžืช ืคืจื™ืกื” ื‘-GKE ืœืœื ืชื•ืกืคื™ื, SMS ืื• ืจื™ืฉื•ื. ื‘ื•ื ื ืฆื™ืฅ ืžืชื—ืช ืœื–'ืงื˜ ืฉืœ ื’'ื ืงื™ื ืก

  4. ืฉืžื•ืจ ืืช ื”ืฉื™ื ื•ื™ื™ื ืฉืœืš ื•ื”ืคืขืœ ืืช ื”ืžื•ืคืข.

ืœืื—ืจ ืฉื”-VM ืกื™ื™ื ืœื˜ืขื•ืŸ, ื”ืชื—ื‘ืจ ืืœื™ื• ื‘ืืžืฆืขื•ืช SSH ื•ื•ื“ื ืฉื”ื—ื™ื‘ื•ืจ ืžืชืจื—ืฉ ืœืœื ืฉื’ื™ืื”. ื”ืฉืชืžืฉ ื‘ืคืงื•ื“ื”:

gcloud alpha cloud-shell ssh

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

ืคืจื•ืก ืœ-GKE

ืžื›ื™ื•ื•ืŸ ืฉืื ื• ืฉื•ืืคื™ื ื‘ื›ืœ ื“ืจืš ืืคืฉืจื™ืช ืœืขื‘ื•ืจ ืœื—ืœื•ื˜ื™ืŸ ืœ-IAC (ืชืฉืชื™ืช ื›ืงื•ื“), ืงื‘ืฆื™ ื”-docker ืฉืœื ื• ืžืื•ื—ืกื ื™ื ื‘-Git. ื–ื” ืžืฆื“ ืื—ื“. ื•ืคืจื™ืกื” ื‘-kubernetes ืžืชื•ืืจืช ืขืœ ื™ื“ื™ ืงื•ื‘ืฅ yaml, ื”ืžืฉืžืฉ ืจืง ืืช ื”ืžืฉื™ืžื” ื”ื–ื•, ืฉื”ื™ื ื’ื ื‘ืขืฆืžื” ื›ืžื• ืงื•ื“. ื–ื” ืžื”ืฆื“ ื”ืฉื ื™. ื‘ืื•ืคืŸ ื›ืœืœื™, ืื ื™ ืžืชื›ื•ื•ืŸ, ื”ืชื•ื›ื ื™ืช ื”ื™ื ื›ื–ื•:

  1. ืื ื—ื ื• ืœื•ืงื—ื™ื ืืช ื”ืขืจื›ื™ื ืฉืœ ื”ืžืฉืชื ื™ื BUILD_VERSION ื•ื‘ืื•ืคืŸ ืื•ืคืฆื™ื•ื ืœื™, ืขืจื›ื™ ื”ืžืฉืชื ื™ื ืฉื™ืขื‘ืจื• ENV.
  2. ื”ื•ืจื“ ืืช ื”ืงื•ื‘ืฅ docker ืž- Git.
  3. ืฆื•ืจ yaml ืœืคืจื™ืกื”.
  4. ืื ื• ืžืขืœื™ื ืืช ืฉื ื™ ื”ืงื‘ืฆื™ื ื”ืœืœื• ื“ืจืš scp ืœืงื•ื ืกื•ืœืช ื”ืขื ืŸ.
  5. ืื ื—ื ื• ื‘ื•ื ื™ื ืฉื ืงื•ื ื˜ื™ื™ื ืจ ื•ื“ื•ื—ืคื™ื ืื•ืชื• ืœ-Container registry
  6. ืื ื• ืžื™ื™ืฉืžื™ื ืืช ืงื•ื‘ืฅ ืคืจื™ืกืช ื”ื˜ืขื™ื ื” ืขืœ ื”-Cuber.

ื‘ื•ืื• ื ื”ื™ื” ื™ื•ืชืจ ืกืคืฆื™ืคื™ื™ื. ืคืขื ื”ืชื—ืœื ื• ืœื“ื‘ืจ ืขืœ ENV, ืื– ื ื ื™ื— ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ืœื”ืขื‘ื™ืจ ืืช ื”ืขืจื›ื™ื ืฉืœ ืฉื ื™ ืคืจืžื˜ืจื™ื: PARAM1 ะธ PARAM2. ืื ื• ืžื•ืกื™ืคื™ื ืืช ื”ืžืฉื™ืžื” ืฉืœื”ื ืœืคืจื™ืกื”, ื”ืงืœื“ - ืคืจืžื˜ืจ ืžื—ืจื•ื–ืช.

ืฆื™ืœื•ื ืžืกืš
ืื ื• ื™ื•ืฆืจื™ื ืžืฉื™ืžืช ืคืจื™ืกื” ื‘-GKE ืœืœื ืชื•ืกืคื™ื, SMS ืื• ืจื™ืฉื•ื. ื‘ื•ื ื ืฆื™ืฅ ืžืชื—ืช ืœื–'ืงื˜ ืฉืœ ื’'ื ืงื™ื ืก

ื ื™ืฆื•ืจ yaml ืขื ื ื™ืชื•ื‘ ืžื—ื“ืฉ ืคืฉื•ื˜ ื”ื“ ืœืชื™ื™ืง. ื”ื”ื ื—ื” ื”ื™ื, ื›ืžื•ื‘ืŸ, ืฉื™ืฉ ืœืš ื‘-docerfile ืฉืœืš PARAM1 ะธ PARAM2ืฉืฉื ื”ื˜ืขื™ื ื” ื™ื”ื™ื” ืืคืœื™ืงืฆื™ื” ืžื“ื”ื™ืžื”, ื•ื”ืžื™ื›ืœ ื”ืžื•ืจื›ื‘ ืขื ื”ื™ื™ืฉื•ื ืฉืœ ื”ื’ืจืกื” ืฉืฆื•ื™ื ื” ื˜ืžื•ืŸ ื‘ ืจื™ืฉื•ื ืžื™ื›ืœ ื‘ื“ืจืš gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONืื™ืคื” $BUILD_VERSION ื–ื” ืขืชื” ื ื‘ื—ืจ ืžื”ืจืฉื™ืžื” ื”ื ืคืชื—ืช.

ืจื™ืฉื•ื ืฆื•ื•ืช

touch deploy.yaml
echo "apiVersion: apps/v1" >> deploy.yaml
echo "kind: Deployment" >> deploy.yaml
echo "metadata:" >> deploy.yaml
echo "  name: awesomeapp" >> deploy.yaml
echo "spec:" >> deploy.yaml
echo "  replicas: 1" >> deploy.yaml
echo "  selector:" >> deploy.yaml
echo "    matchLabels:" >> deploy.yaml
echo "      run: awesomeapp" >> deploy.yaml
echo "  template:" >> deploy.yaml
echo "    metadata:" >> deploy.yaml
echo "      labels:" >> deploy.yaml
echo "        run: awesomeapp" >> deploy.yaml
echo "    spec:" >> deploy.yaml
echo "      containers:" >> deploy.yaml
echo "      - name: awesomeapp" >> deploy.yaml
echo "        image: gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION:latest" >> deploy.yaml
echo "        env:" >> deploy.yaml
echo "        - name: PARAM1" >> deploy.yaml
echo "          value: $PARAM1" >> deploy.yaml
echo "        - name: PARAM2" >> deploy.yaml
echo "          value: $PARAM2" >> deploy.yaml

ืกื•ื›ืŸ ื’'ื ืงื™ื ืก ืœืื—ืจ ื—ื™ื‘ื•ืจ ื‘ืืžืฆืขื•ืช gcloud alpha cloud-shell ssh ืžืฆื‘ ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ ืื™ื ื• ื–ืžื™ืŸ, ืœื›ืŸ ืื ื• ืฉื•ืœื—ื™ื ืคืงื•ื“ื•ืช ืœืžืกื•ืฃ ื”ืขื ืŸ ื‘ืืžืฆืขื•ืช ื”ืคืจืžื˜ืจ --ืคืงื•ื“ื”.

ืื ื• ืžื ืงื™ื ืืช ืชื™ืงื™ื™ืช ื”ื‘ื™ืช ื‘ืงื•ื ืกื•ืœืช ื”ืขื ืŸ ืžื”- dockerfile ื”ื™ืฉืŸ:

gcloud alpha cloud-shell ssh --command="rm -f Dockerfile"

ื”ื ื— ืืช ืงื•ื‘ืฅ ื”-docerfile ืฉื”ื•ืจื“ ืœืื—ืจื•ื ื” ื‘ืชื™ืงื™ื™ืช ื”ื‘ื™ืช ืฉืœ ืžืกื•ืฃ ื”ืขื ืŸ ื‘ืืžืฆืขื•ืช scp:

gcloud alpha cloud-shell scp localhost:./Dockerfile cloudshell:~

ืื ื• ืื•ืกืคื™ื, ืžืชื™ื™ื’ื™ื ื•ื“ื•ื—ืคื™ื ืืช ื”ืžื™ื›ืœ ืœืจื™ืฉื•ื ื”ืžื›ื•ืœื•ืช:

gcloud alpha cloud-shell ssh --command="docker build -t awesomeapp-$BUILD_VERSION ./ --build-arg BUILD_VERSION=$BUILD_VERSION --no-cache"
gcloud alpha cloud-shell ssh --command="docker tag awesomeapp-$BUILD_VERSION gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"
gcloud alpha cloud-shell ssh --command="docker push gcr.io/awesomeapp/awesomeapp-$BUILD_VERSION"

ืื ื—ื ื• ืขื•ืฉื™ื ืืช ืื•ืชื• ื”ื“ื‘ืจ ืขื ืงื•ื‘ืฅ ื”ืคืจื™ืกื”. ืฉื™ื ืœื‘ ืฉื”ืคืงื•ื“ื•ืช ืฉืœื”ืœืŸ ืžืฉืชืžืฉื•ืช ื‘ืฉืžื•ืช ื‘ื“ื•ื™ื™ื ืฉืœ ื”ืืฉื›ื•ืœ ืฉื‘ื• ืžืชืจื—ืฉืช ื”ืคืจื™ืกื” (awsm-cluster) ื•ืฉื ื”ืคืจื•ื™ืงื˜ (ืคืจื•ื™ืงื˜ ืžื“ื”ื™ื), ื”ื™ื›ืŸ ืžืžื•ืงื ื”ืืฉื›ื•ืœ.

gcloud alpha cloud-shell ssh --command="rm -f deploy.yaml"
gcloud alpha cloud-shell scp localhost:./deploy.yaml cloudshell:~
gcloud alpha cloud-shell ssh --command="gcloud container clusters get-credentials awsm-cluster --zone us-central1-c --project awesome-project && 
kubectl apply -f deploy.yaml"

ืื ื• ืžืคืขื™ืœื™ื ืืช ื”ืžืฉื™ืžื”, ืคื•ืชื—ื™ื ืืช ืคืœื˜ ื”ืงื•ื ืกื•ืœื” ื•ืžืงื•ื•ื™ื ืœืจืื•ืช ืืช ื”ื”ืจื›ื‘ื” ื”ืžื•ืฆืœื—ืช ืฉืœ ื”ืงื•ื ื˜ื™ื™ื ืจ.

ืฆื™ืœื•ื ืžืกืš
ืื ื• ื™ื•ืฆืจื™ื ืžืฉื™ืžืช ืคืจื™ืกื” ื‘-GKE ืœืœื ืชื•ืกืคื™ื, SMS ืื• ืจื™ืฉื•ื. ื‘ื•ื ื ืฆื™ืฅ ืžืชื—ืช ืœื–'ืงื˜ ืฉืœ ื’'ื ืงื™ื ืก

ื•ืื– ื”ืคืจื™ืกื” ื”ืžื•ืฆืœื—ืช ืฉืœ ื”ืžื›ื•ืœื” ื”ืžื•ืจื›ื‘ืช

ืฆื™ืœื•ื ืžืกืš
ืื ื• ื™ื•ืฆืจื™ื ืžืฉื™ืžืช ืคืจื™ืกื” ื‘-GKE ืœืœื ืชื•ืกืคื™ื, SMS ืื• ืจื™ืฉื•ื. ื‘ื•ื ื ืฆื™ืฅ ืžืชื—ืช ืœื–'ืงื˜ ืฉืœ ื’'ื ืงื™ื ืก

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

ื‘ืžืงื•ื ืžืกืงื ื•ืช

ื›ื ืจืื” ืฉืœื ื ื™ืชืŸ ื”ื™ื” ืœืขืฉื•ืช ืืช ื›ืœ ื”ืฉืœื‘ื™ื ืฉืœืžืขืœื”, ืืœื ืคืฉื•ื˜ ื”ืชืงื™ื ื• ืชื•ืกืฃ ื›ืœืฉื”ื• ืขื‘ื•ืจ Jenkins, ื”-muuulion ืฉืœื”ื. ืื‘ืœ ืžืฉื•ื ืžื” ืื ื™ ืœื ืื•ื”ื‘ ืชื•ืกืคื™ื. ื•ื‘ื›ืŸ, ืœื™ืชืจ ื“ื™ื•ืง, ืื ื™ ืคื•ื ื” ืืœื™ื”ื ืจืง ืžืชื•ืš ื™ื™ืื•ืฉ.

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

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

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