แแก แงแแแแแคแแ แ แแแจแแ แแแแฌแงแ, แ แแแแกแแช แฉแแแแ แแแแแแแแ แแแแก แแ แ-แแ แแ แแฃแแแแก แฎแแแแซแฆแแแแแแแ แแแแฎแแแ แแแแแแขแแกแขแ แแแแ แแฎแแแ แแแแแแแชแแ, แ แแแแแแช แฌแแแ แแฆแแก แแแแขแแแแแ แจแ แแงแ แแแแแแกแแแฃแแ. แแ แแแแแแแฅแแแงแแ. แแแแฎแแแแแแ 20 แฌแฃแแแก แจแแแแแ แแแแฆแแก แแแแฎแแแแ แแแแแชแฎแแแแก แแแแแฎแแแแแก แจแแกแแฎแแ, แ แแแแแ แแฅ แแแแแขแแแฃแแ แแงแ แซแแแแแ แกแแญแแ แ แ แแ. แแแแแแแฎแแ. แแแแแ แแ แแแแ แกแแแแแก แจแแแแแ... แแแ แแแ, แจแแแแซแแแแ แแแแแแชแแแ แ แ แแแฎแแ แจแแแแแ...
แฃแแแ แแแฆแแแ แ, แ แแ แกแแแแแแ แแแ แแแชแ แแแ (แแก แแแ แ แแ แแแฆแแแ แ? แแ แ?) แแ แแแแก แแแแแแแแกแฌแแแแแแ, แ แแ แแฃแแแแก แแแแแ แแแก แแฅแแ แฌแแแแแ แฏแแแแแแกแแ, แ แแแแแจแแช แฉแแแ แแแแฅแแก แงแแแแ CI/CD, แแแแแคแแฅแ แ: แแแ, แแแแแแแแแก แ แแแแ แช แ แแแแแแแช แแแก แกแฃแ แก! แแ แแ แฎแฃแแ แแแ แแแแแฎแกแแแแ: แแแชแก แแแแแ แแแแชแ แแ แแ แแ แแฆแ แจแแญแแแก; แฃแฌแแแแ แแแแแแแแก Fed แแ แแก แแฅแแแแ แงแแแจแ แแแแแ แชแฎแแแ แแแ. แแ แฌแแแแแ แแแแแแจแ แฎแ แแแแแ แกแแแฃแจแแแแ, แ แแแแแแช แจแแซแแแแก Kuber-แจแ แแแแแแแแกแแก แแแแขแแแแแ แ, แ แแแแแแช แจแแแชแแแก แแแแแกแแแแ แ แฌแแ แแแขแแแแ แฉแแจแแแแแฃแแ แแแ แกแแแก แแแแแแแชแแแก แแ แแแแแแขแแแแก แแแกแจแ แแแแแกแแแแ แ แแแแจแแแแแแแ แแแ (แแแแฃแแฉแแแ, แคแแแแแแแ, แฌแแ แกแฃแแจแ แแแแแแกแฃแ แ แแแแก แแแกแฌแแแแแแแแ, แแฎแแ แแแแก แแขแ แแแแแแแ แขแแซแแ แจแ แแ แแ แฌแแแแแแแแแแก แฌแแแแแฎแแแก แจแแแแแ แซแแแแแ แแฅแกแแ แแกแแฃแแแ แแแงแฃแ แแแแ).
แแกแ แ แแ, แแ แฉแแแแฌแแ แจแ แแแขแงแแแ, แ แแแแ แแแกแฌแแแแ:
- Jenkins-แจแ แกแแแฃแจแแแแแแก แแแแแแแฃแ แแ แแแแแฎแแแแ แแแแแ แกแแแฃแจแแแแแ แแ แกแฎแแ แกแแแฃแจแแแแแแแแ;
- แแแแแแจแแ แแแ แฆแ แฃแแแแก แแแแกแแแแแ (Cloud shell) แแแแแซแแแแ แแแแแกแขแแแแ แแแฃแแ แฏแแแแแแกแแก แแแแแขแแ;
- แแแแแแแแกแแ แแแขแแแ แแแ Google Kubernetes Engine-แแ.
แกแแแแแแแแแแจแ, แแ, แ แ แแฅแแ แฃแแแ, แแแ แแแแฃแแฌแแแแ แแ แแแแแแแกแแแแแกแแแ แ แแแ . แแแ แแฃแแแแแ, แ แแ แแฅแแแ แแแฅแแ แแแคแ แแกแขแ แฃแฅแขแฃแ แแก แแแแแแฃแ แแแฌแแแ Google แฆแ แฃแแแแจแ แแ, แจแแกแแแแแแกแแ, แแฅแแแ แฎแแ แ แแแกแ แแแแฎแแแ แแแแแ แแ, แ แ แแฅแแ แฃแแแ, แแแฅแแ GCP แแแแแ แแจแ. แแแแ แแ แแก แแ แแ แแก แแก, แ แแกแแช แแก แจแแแแจแแแ แแฎแแแ.
แแก แแ แแก แฉแแแ แจแแแแแแ แแแขแงแฃแแแแก แคแฃแ แชแแแ. แแกแแแ แจแแแแจแแแแแแก แแแฌแแ แ แแแแแ แแฎแแแแ แแ แ แจแแแแฎแแแแแจแ: แแ แแแแแแแก แฌแแแแจแ แแแแแแฅแ, แแแแแแแ แแ แแแชแแแ แแแกแ แแแแแญแ แ, แแแแแกแแแแแ แแแ แแ แแงแ แแแแฃแแแแแฃแแ, แแแแขแแ แแแฌแแ-แแแฌแแ แแแแแฃแแแ แแ แกแแแแแแแ แแแแแแแแ แ แแ แแแแแแ. แแ แแกแ, แ แแ แแแแแแแแจแ, แ แแชแ แแแแแแแฌแงแแแแ, แ แแแแ แแแแแแแแ แแก, แแ แแแแแฌแแแก แแกแแ แแแแฃแแแแแก แงแแแแแคแแ แ แชแแ-แชแแแแ แแ แจแแแแแแแแ, แแ แแแแแแ แแฌแแ แแกแแ แแแฆแแแแฃแ แคแฃแ แชแแแแก.
แแแกแฃแฎแแกแแแแแแแแแก แจแแแฆแฃแแแแก แแแแแชแฎแแแ: 1. แจแแแแจแแแ แแฌแแ แ โแฉแแแแแแกโ, แ แแแแกแแแแก แกแแฃแแแแแกแ แแ แแฅแขแแแ แแ แแ แชแแแแแแ. แแแฎแแ แฃแแ แแแ , แ แแ แฌแแแแแแแฎแ แแแแแแขแแ แแแจแ "แฃแแฏแแแแกแ แแฅแแแแแแ แแกแ แแแแแแแแแแแแ".
2. แแฃ แแแขแแก แแแแแงแแแแแฃแแ แแแฌแแแ แแแแแแแ แแแ แแแแ, แแแจแแ, แ แแแแ แช แงแแแแ แฉแแแ แฌแแแ แจแแแแจแแแ, แแก แแ แแก แกแฃแกแขแ แแแ แแแแก แฎแกแแแ แ.
Jenkins-แจแ แกแแแฃแจแแ แแแ แแแแขแ แแแแก แแแแแแแฃแ แแ แแแแแฎแแแแ
แแ แแแแแแแ แแฅแแแแก แจแแแแแฎแแแก: แ แ แจแฃแแจแแ แกแแแฃแจแแแก แแแแแแแฃแ แ แแแแแฎแแแแ? แฎแแแแ แจแแแงแแแแแ แกแแแแแแแแ แแแ แแแแขแ แแก แแแแจแแแแแแแ แแ แฌแแแแ!
แแแแกแฃแฎแแ: แแแ แแแ แแแ แแแชแ แแแ , แแ แแแงแแแ แก, แ แแชแ แฌแฃแฌแฃแแแแแ: แแแจแ, แแแแแแแแแ แแจแแแแ, แงแแแแแคแแ แ แฌแแแแแ! แแฅแแแ แแฌแงแแแ แงแฃแ แแแแก แแ แแ แแก แจแแชแแแแ แแแ แแแแฃแแ แแแแแแแแแก แแแจแแแแแก แแแ แแแแขแ แแก แแแแจแแแแแแแแจแ. แแแแขแแ แแแ แฉแแแแแ แงแแแแแคแแ แ แแแแแแแแ แ แแช แจแแแซแแแแ แแคแแฅแขแฃแ แแ. แแฃ แจแแกแแซแแแแแแแ แแแแฎแแแ แแแแแก แแแแ แแแแแชแแแแแแก แแแ แแแแแ แจแแงแแแแแก แแแแแแแ แแชแแแแแ แแแแจแแแแแแแแแแก แกแแแก แแแชแแแแ, แ แแแแแแแแแช แฃแแแ แแแ แฉแแแ, แแแจแแ แแ แแแฌแงแแ แจแแ แฉแแแแก.
แแแแแ แแกแแแแ: แฉแแแ แแฅแแแแ แกแแแฃแจแแแก แฏแแแแแแกแจแ, แ แแแแแจแแช แแแจแแแแแแแ แจแแแแแซแแ แแแแ แฉแแแ แแแ แกแแ แกแแแแแ, แแแฃแแแแแ แแแแขแแแแแ แจแ แแแแแชแแแฃแแ แแแ แแแแขแ แแแแก แแแแจแแแแแแแแแ. แแแ, แจแแแแแ แแก แแแ แแแแแก แแแแขแแแแแ แก แแ แฃแแแซแแแแก แแแก แแแแขแแแแแ แแแแก แ แแแกแขแ แจแ. แจแแแแแ แแฅแแแแ แแแแขแแแแแ แ แแแจแแแแฃแแแ แแฃแแแ แจแ แ แแแแ แช แแแขแแแ แแแ แกแแแฃแจแแแจแ แแแแแแแแฃแแ แแแ แแแแขแ แแแแ.
แฉแแแ แแ แแแแแแฎแแแแแ แฏแแแแแแกแจแ แกแแแฃแจแแแก แจแแฅแแแแกแ แแ แแแงแแแแแแก แแ แแชแแกแก, แแก แแแแแก แแ แแฎแแแ. แฉแแแ แแแแแ แแฃแแแแ, แ แแ แแแแแแแแ แแแแ แแ แแก. แแแ แกแแแแแ แแแแแฎแแแแฃแแ แกแแแก แแแแกแแฎแแ แชแแแแแแแแ, แฉแแแ แแแญแแ แแแแ แแ แ แ แแ: แแ แกแแแฃแแ แฌแงแแ แแแแแก แกแแ แแแ แแแ แ แแแฅแแแแ แแแ แกแแแแแก แแแแ แแแแ แแ แชแแแแแ, แ แแแแ แแชแแ แแ แฉแแแแแแก แแแ แแแแขแ แ แแแแแแแแแจแ. แฉแแแแก แแแแแแแแจแ, แแแแแ, แชแแแแแ แแงแแก แแแกแแฎแแแแแฃแแ BUILD_VERSION, แแแแแ แแแฌแแ แแแแแแ แแ แจแแแฉแแ แแแแแ. แแแแ แแ แแแแแ แฃแคแ แ แแฎแแแก แแแแฎแแแแ แฌแงแแ แแแแแก แกแแแก.
แแแแแแ แแแ แแแแขแ แแ แแ แแก. แแ แ แ แแ แแแจแแแแ แแแแแฎแกแแแแ:
- แแแแแแงแแแแ แแแกแขแแแชแแฃแ แ แฌแแแแแแก API, แ แแแแแกแแช แฏแแแแแแกแ แกแแแแแแแแก แแแแฎแแแ แแแแแแก;
- แแแแแฎแแแแ แแแกแขแแแชแแฃแ แ แกแแชแแแแก แกแแฅแแฆแแแแแก แจแแแแแ แกแ (แฉแแแแก แจแแแแฎแแแแแจแ แแก แแ แแก JFrog Artifactory, แ แแช แแ แแ แแก แแแแจแแแแแแแแแ).
Jenkins Remote Access API
แแแแแแแแ แแแฃแแ แจแแกแแแแจแแแแ แขแ แแแแชแแแก แแแฎแแแแแ, แแแ แฉแแแแแ, แแแแ แแแแ แแแ แฎแแแแ แซแแแ แแแแแแ แขแแแแแก.
แแแแก แฃแคแแแแแก แแแแชแแ แแฎแแแแ แแแ แแแแ แแแแแชแแก แแแฌแแแแก แแแแแกแฃแคแแ แแแ แแแแแก
แฏแแแแแแกแ แฃแแ แฃแแแแแงแแคแก API-แก แแแกแขแแแชแแฃแ แ แแแแฅแแแแ แฌแแแแแฎแแแแ แฌแแแแแแกแแแแก แแแก แคแฃแแฅแชแแแแแ แแแแแ. <โฆ> แแแกแขแแแชแแฃแ แ แฌแแแแแ แจแแแแแแแแแแแฃแแแ REST-แแก แแกแแแแกแ แกแขแแแแ. แแก แแแจแแแแก, แ แแ แแ แแ แแก แแ แแ แจแแกแแแแก แฌแแ แขแแแ แงแแแแ แแแฎแแกแแแแแแแจแ, แแ แแแแ URL, แ แแแแ แแชแแ ".../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']
แฌแแ แแแขแแแฃแแแ แกแแแก แกแแ แแแจแแขแ
แแกแ, แฃแแ แแแแ แแแกแแ แแแแแ, แแแแแ แแแแ แฌแแฃแแแแ, แ แแ แคแแแขแ แแ แแ แแแแแแขแงแฃแ (แคแแแขแ แแแ แแ แแกแแแแก แแขแงแฃแแแแแ!) แแ แแแแแแแฉแแแแ "แฌแแ แฃแแแขแแแแแแแก" แกแแ:
http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/xml?tree=allBuilds[displayName,result]&exclude=freeStyleProject/allBuild[result='SUCCESS']
แฌแแ แฃแแแขแแแแแแ แกแแแก แกแแ แแแจแแขแ
แแแ แกแแแแแก แกแแ แแแกแขแแแชแแฃแ แ แกแแ แแแ แแก แกแแฅแแฆแแแแแแแ
แแ แกแแแแแก แแแแ แ แแแ แแแ แกแแแแแก แกแแแก แแแกแแฆแแแแ. แแ แฃแคแ แ แแแแฌแแแก, แแแแ แ แฏแแแแแแกแแก API-แแ แฌแแแแแ. แแแ แแแ, แ แแแแแ แแฃ แแแแแแแชแแ แฌแแ แแแขแแแแ แแจแแแแ, แแก แแแจแแแแก, แ แแ แแก แจแแคแฃแแฃแแแ แแ แแแแแแแกแแแฃแแแ แกแแชแแแจแ แจแแกแแแแแแก แกแแฅแแฆแแแแแจแ. แแแแแแแแแ, แกแแชแแแ แแ แแก แแแแแแแชแแแแแก แกแแแฃแจแแ แแแ แกแแแแแก แแแแฃแแแกแฎแแแแ แกแแชแแแ. แแแกแฌแแแก. แแแ แแ, แแแแแ แแแแแฎแแ แแแก, แ แ แแแ แกแแแแแ แจแแกแแแแฎแแ. แแแกแขแแแชแแฃแ แกแแฅแแฆแแแแแก แแแแแฎแแแแ, แฉแแแญแแแแแ แแ แแแคแจแแแแ. แแฃ แแแแแแก แแแแขแแ แแกแแแก แแแแแแแแ แ, แแแจแแ แแก แกแแแแแแ แแก แฅแแแจแแ.
แแ แแ แฎแแแแก แแ แซแแแแแ
แแแฎแแแ แแแแแแแแแกแฌแแแแ แแ แ แ แแ: แแ แแแแแแชแแ แแแแจแแ แแก แแแขแแแแแก แกแแแแฃแ แจแ แแ แแ แแญแแ แแแแ แงแแแแ แแแ แกแแ แกแแฅแแฆแแแแแแแ แแ แแแ แฉแแ แแฎแแแแ แแแ, แ แแแแแแแช แจแแแฅแแแ แแ แแ แแแแก แแแแแแแแแแแจแ. แจแแชแแแแแ แแ แซแแแแแ แแฅแแแแ แ แแแแแแแกแ แแ แกแแญแแ แแแแแแแก แจแแกแแแแแแกแแ:
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[^/]+' )
แกแแแฃแจแแแแแแก แแ แกแแแฃแจแแแก แแแแคแแแฃแ แแชแแแก แคแแแแแก แแแงแแแแแ แฏแแแแแแกแจแ
แฉแแแ แแแแแ แแแแแ แแแ แกแแแแแก แกแแแก แฌแงแแ แ. แแแแแ แแฎแแ แแแแแแแขแแ แแแฆแแแฃแแ แกแแ แแแแแแแแแจแ. แฉแแแแแแก แแจแแแ แ แแแแแกแแแแแ แแงแ แแแแแแแชแแแก แจแแฅแแแแก แแแแชแแแแจแ แแแแแฏแแก แแแแแขแแแ. แแแแแฏแ, แ แแแแแแช แจแแกแ แฃแแแแแแแ, แแฃ แจแแแแแ แแงแ "แฌแแ แแแขแแแ".
แแแฎแกแแแแ แแกแแแแแแแก แแแแแแแแแก แแแ แแแแขแ แแแ แแ แแแแแแฎแแแแ แแแแแจแ. แแแแญแแ แแ แฆแแแแแแแก: แแแแแแขแ แแจแแแแแแแแแก แแขแแแ -> แแแ แแแแแ แแแแแฏแ (แแ แแฏแแ แแแ). แแแแแฏแแก แแแ แแแแขแ แแแจแ แแแ แฉแแแ แแแแแแแ แแแแ แแแแแแแแแแแ แแจแแแแแแก แกแขแแขแฃแกแแแแแงแแแแ แแแแจแแแแแแแ แฌแแ แแแขแแแ, แฅแแแแแแ, แ แแแแแแช แฃแแแ แจแแกแ แฃแแแแก แฌแแ แแแขแแแแก แจแแแแฎแแแแแจแ แแแฃแจแแแ shell แแ แซแแแแแ.
แแฎแแ แแ แกแแฎแแแแกแ แแแฌแแแ. แฏแแแแแแกแ แแแแฎแแแก แกแแแฃแจแแแก แแแแคแแแฃแ แแชแแแแก แคแแแแแแจแ. XML แคแแ แแแขแจแ. แแแแ http://ะฟััั-ะดะพ-ะทะฐะดะฐะฝะธั/config.xml
แจแแกแแแแแแกแแ, แจแแแแซแแแแ แฉแแแแขแแแ แแแ แแแแคแแแฃแ แแชแแแก แคแแแแ, แแแแ แแแแฅแขแแ แแ แแก แกแแญแแ แแแแแกแแแแแ แแ แแแแแ แฃแแแ แแฅ, แกแแแแช แแแแฆแแ.
แแแฎแกแแแแแ, แแแแแ แจแแแแแแฎแแแแ, แ แแ แจแแแฅแแแแ แแแ แแแแขแ แก แแแ แกแแแแแก แกแแแกแแแแก BUILD_VERSION?
แแแแแแแฌแแ แแ แแแแคแแแฃแ แแชแแแก แคแแแแ แแ แจแแแฎแแแแ แแแก แจแแแแแ. แแฎแแแแ แแแแกแแแแก, แ แแ แแแ แฌแแฃแแแแ, แ แแ แแแ แแแแขแ แ แแแแแแแแ แแ แกแแกแฃแ แแแแ แขแแแแกแแ.
แกแแ แแแจแแขแ แกแแแแแแ แแก แฅแแแจ.
แแฅแแแแ config.xml แคแ แแแแแแขแ แแ แแแแแ แแ แฃแแแ แแแแแแงแฃแ แแแแแแก. แแแ แแ แแแแกแ, แ แแ แแ แฉแแแแแแก แแแแแแแขแแก แจแแแแแ แกแ แฏแแ แแ แแ แแก แแแแแ แแฃแแ
แฒแแ แฌแแฃแแแแฃแแ แฎแแ ? แแกแ แแแ, แแแแฌแแ แแ แกแแ แแแขแ, แ แแแแแแช แจแแกแ แฃแแแแแ, แแฃ แแแแแแแแ แฌแแ แแแขแแแฃแแ แแฅแแแแ.
แกแแ แแแขแ แแแแฆแแแก แแแ แกแแแแแก แฉแแแแแแแแแแก, แฉแแแแขแแแ แแแแก แแแแคแแแฃแ แแชแแแก แคแแแแก, แฉแแฌแแ แก แแแกแจแ แแแ แกแแแแแก แฉแแแแแแแแแแก แฉแแแแแแแก แกแแญแแ แ แแแแแแแก แแ แจแแแแแ แแแแแ แฃแแแแก. แแแแฎ. แฒกแฌแแ แแ. แฉแแฌแแ แแ แแแ แกแแแแแก แกแแ XML-แจแ แแ แแแแแแแก, แกแแแแช แฃแแแ แแ แแก แแแ แกแแแแแก แกแแ (แแแแแแแแจแ แแฅแแแแ, แกแแ แแแขแแก แแแ แแแแ แแแจแแแแแก แจแแแแแ). แแ แแแชแ, แ แแ แแกแแคแแแแจแ แฏแแ แแแแแ แแ แแแ แ แแแฃแแแ แฃแแ แแแแแแแแฅแแแแแแแก แกแแกแขแแแ แแแงแแแแแกแแชแแแแแแ. แแ แแแ แแ แแแแฃแแแแ. แแแฎแแแ แแแแแแกแขแแแแ แแ
แกแแแแแแ แแก แฅแแแจ แฌแแ แแแแแแแแแ แแแแก, แ แแแแแแช แกแ แฃแแแ แแกแ แฃแแแแก แแแแแ แแแชแแแฃแ แแแแแแแแแแ แแแแก.
แฉแแฌแแ แแ แแแ แกแแแแแก แกแแ แแแกแขแแแชแแฃแ แ แกแแ แแแ แแก แกแแฅแแฆแแแแแแแ แแแแคแแแฃแ แแชแแแแแ
#!/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
แแแแ แแฃแแแ, แแฃ แแฅแแแ แแแแแกแชแแแแ แแแแแ แแแชแแแฃแ แแแแแแแแแแแ แแแฌแแ แแแ แแแแ, แแแจแแ แแแแแแแแแแก แแแแชแแแแจแ แฃแแแ แฃแแแ แแฅแแแแแ แฉแแแแกแแจแแแแ แกแแ แแแ แกแแแแแ. แแก แแ แแก แ แแแแ แช แกแแ แแแจแแขแ แกแแแแแแ แแก แฅแแแจ.
แกแฌแแ แแ แจแแแกแแแฃแแ แแแ แกแแแแแก แกแแ
แแฃ แงแแแแแคแแ แ แแฃแจแแแแแ, แแแจแแ แแแแแแแแ แแ-แฉแแกแแแ แกแแ แแแขแ แแแกแจแ แแแฃแจแแแ shell แแ แซแแแแแ แแ แจแแแแแฎแแ แชแแแแแแแแแ.
แแแแแแจแแ แแแ Cloud shell-แแแ
แฉแแแ แแแงแแแก แแแแแฅแขแแ แแแ แแแแขแแแแแ แแแจแ. แฉแแแ แแแงแแแแแ Ansible-แก, แ แแแแ แช แฉแแแแ แแแแแแแชแแแก แแแฌแแแแแแก แฎแแแกแแฌแงแแก แแ แแแแคแแแฃแ แแชแแแก แแแแแฏแแ แก. แจแแกแแแแแแกแแ, แ แแแแกแแช แกแแฅแแ แแฎแแแ แแแแขแแแแแ แแแแก แแจแแแแแแก, แแฎแแแแแแแแแจแ แแแแฆแแแ แกแแแ แแแ แแแแขแ: แแแแแแกแขแแแแ แแ Docker-แ Docker-แจแ, แแแแแแกแขแแแแ แแ Docker แแแฌแงแแแแแแแแแ, แ แแแแแแช แแฃแจแแแแก Ansible-แแ, แแ แจแแฅแแแแแ แแแแขแแแแแ แแแ แฆแ แฃแแแแแแ แแแแกแแแจแ. แฉแแแ แจแแแแแแฎแแแแ, แ แแ แแแแฉแฃแแแแ แฏแแแแแแกแแก แแแแแแแขแแแแก แจแแกแแฎแแ แแ แกแขแแขแแแจแ. แแแฎแกแแแก?
แแ แแแแแแฌแงแแแขแ: แแแ แแ, แ แแแแแ แแแแขแแแแแ แแแ "แงแฃแแแแแ" แจแแแซแแแแ แจแแแ แแแแแก แฆแ แฃแแแแแแ แแแแกแแแจแ, แแแจแแ แ แแขแแ แฃแแแ แจแแแแฌแฃแฎแแ? แจแแแแแฎแ แกแฃแคแแ, แแ แ? แแ แแแแแ แจแแแแแ แแแ แฏแแแแแแกแแก แแแแขแแแแแ แแแ แฆแ แฃแแแแแแ แแแแกแแแจแ แแ แจแแแแแ แแแแฃแจแแ แแกแแแ แแฃแแแ แจแ แแฅแแแแ. แฃแคแ แ แแแขแแช, Google-แก แแฅแแก แซแแแแแ แแแแแแ แ แแ แฎแแแ แแแก แแแคแ แแกแขแ แฃแฅแขแฃแ แแจแ, แ แแช แกแแกแแ แแแแแ แแแแแแแแก แแแแฎแแแแก แแแแแแแแแแก แกแแฉแฅแแ แแแ.
แฆแ แฃแแแแแแ แแแแกแแแแแ แแแกแแแแแจแแ แแแแแ แกแแญแแ แแ แแ แ แ แแ: gcloud แแ แฌแแแแแแก แฃแคแแแแแแ Google Cloud API VM แแแแแแแแแกแแแแแก, แ แแแแแแแแแช แแแแแ แแแแจแแ แ แแแแฎแแ แชแแแแแแแ.
แแแแแแแก, แแแแช แแแแแแแก แแแแแแจแแ แแแแก แแ แ Google แฆแ แฃแแแแแแแ
Google แแซแแแแ แจแแกแแซแแแแแแแแก แแแแแ แแแก แแแขแแ แแฅแขแแฃแแ แแแขแแ แแแแชแแ แแแแแก แกแแ แแแกแแแจแ. แแก แกแแจแฃแแแแแแก แแแแชแแแ แแแฃแแแแจแแ แแแ แแแแกแแแก แแฃแแแแช แงแแแแก แแแแ แแขแแแแ, แแฃ แแก แแฃแจแแแแก *nix แแ แแฅแแก แแแแกแแแ.
แแฃ แแ แแก แกแแญแแ แ, แ แแ แแ แจแแแแจแแแแก แคแแ แแแแแจแ แฃแคแ แ แแแขแแแฃแ แแ แแแแแจแฃแฅแ แแก แกแแแแแฎแ, แแแฌแแ แแ แแแแแแขแแ แแแจแ. แแฃ แกแแแแแ แแก แฎแแแแก แแแแแฆแแแ, แแแแฌแแ แแแแแฎแแแแแก แแ แแแแแแ.
แฃแคแแแแแแแก แแแแแญแแแแก แฃแแแ แขแแแแกแ แแแแ แแแ แแแขแแ แคแแแกแ.
- แจแแแฉแแ แ VM แแแกแขแแแชแแ, แกแแแแแแแช แจแแแแแแแจแ แแแฃแแแแจแแ แแแแแ แฆแ แฃแแแแแแ แแแแกแแแก.
- แแแฎแกแแแแ แแแกแขแแแชแแแก แแแขแแแแแ แแ แแแแฌแแแแฃแแแ แจแแชแแแแแก.
- แแแแ แแแก แแแแแจแ แแแ แฉแแแ แแแกแขแแแชแแแก แฌแแแแแแก แคแแ แแแแแ แกแ แฃแแ แฌแแแแแ Cloud API-แแ.
Screenshot
- แจแแแแแฎแแ แชแแแแแแแแแ แแ แแแฃแจแแแ แแแแแแแแแ แ.
แแแก แจแแแแแ, แ แแช VM แแแแกแ แฃแแแแก แฉแแขแแแ แแแแก, แแแฃแแแแจแแ แแแ แแแก SSH-แแก แกแแจแฃแแแแแแ แแ แแแ แฌแแฃแแแแ, แ แแ แแแแจแแ แ แฎแแแแ แจแแชแแแแแก แแแ แแจแ. แแแแแแงแแแแ แแ แซแแแแแ:
gcloud alpha cloud-shell ssh
แฌแแ แแแขแแแฃแแ แแแแจแแ แ แแกแ แแแแแแงแฃแ แแแ
แแแแแแแแแ GKE-แแ
แแแแแแแแ แฉแแแ แงแแแแแแแแ แแ แแชแแแแแแ แแแแแแแแ แแแแแแแแแ IaC-แแ (แแแคแ แแกแขแ แฃแฅแขแฃแ แ แ แแแแ แช แแแแ), แฉแแแแ แแแแแ แแก แคแแแแแแ แแแแฎแแแ Git-แจแ. แแก แแ แแก แแ แแ แแฎแ แแ. แแ แแฃแแแ แแแขแแแจแ แแแแแแแแแ แแฆแฌแแ แแแแ yaml แคแแแแแ, แ แแแแแกแแช แแฎแแแแ แแก แแแแชแแแ แแงแแแแแก, แ แแแแแแช แแแแแกแแแแแ แแกแแแ แแแแแก แแกแแแแกแแ. แแก แแแแ แ แแฎแ แแแแ. แแแแแแแ, แแแฃแแแกแฎแแแ, แแแแแ แแกแแแแ:
- แฉแแแ แแแฆแแแ แชแแแแแแแแก แแแแจแแแแแแแแแก BUILD_VERSION แแ แกแฃแ แแแแแกแแแแแ , แชแแแแแแแแก แแแแจแแแแแแแแแ, แ แแแแแแแแช แแแแแแชแแแ แแแ.
- แฉแแแแขแแแ แแแ dockerfile Git-แแแ.
- แจแแฅแแแแแ yaml แแแแแแแแแแกแแแแก.
- แฉแแแ แแขแแแ แแแแ แแ แแแ แคแแแแก scp-แแก แกแแจแฃแแแแแแ แฆแ แฃแแแแแแ แแแแกแแแจแ.
- แฉแแแ แแฅ แแแจแแแแแ แแแแขแแแแแ แก แแ แแแงแแแแแ แแแแขแแแแแ แแแแก แ แแแกแขแ แจแ
- แฉแแแ แแแงแแแแแ แแแขแแแ แแแแก แแแแแแแแแแก แคแแแแก แแฃแแแ แแ.
แแแแแ แฃแคแ แ แแแแแ แแขแฃแแแ แแแงแแ. แแ แแฎแแ แแแแแฌแงแแ แกแแฃแแแ แ แแแ, แแแจแแ แแแแฃแจแแแ, แ แแ แฃแแแ แแแแแแชแแ แแ แ แแแ แแแแขแ แแก แแแแจแแแแแแแแแ: PARAM1 ะธ PARAM2. แฉแแแ แแแแแขแแแ แแแ แแแแแแแแแก แแแแแแแแแแกแแแแก, แขแแแ - แกแแแแแแแแ แแแ แแแแขแ แ.
Screenshot
แฉแแแ แจแแแฅแแแแ yaml-แก แแแ แขแแแ แแแแแแแกแแแแ แแแแแ echo แจแแแขแแแแก. แ แ แแฅแแ แฃแแแ, แแแ แแฃแแแแแ, แ แแ แแฅแแแ แแแฅแแ แแฅแแแแก dockerfile 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"
แแแแแแแกแแ แแฎแแแ แแแแแแฌแแ แแแ dockerfile แฆแ แฃแแแแแแแ แแแแกแแแแก แแแแแแ แกแแฅแแฆแแแแแจแ 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"
แฉแแแ แแแแแ แแแแแแแแ แแแแแแแแแแก แคแแแแก. แแแฎแแแ แแแแแแแแแกแฌแแแแ, แ แแ แฅแแแแแ แแแชแแแฃแแ แแ แซแแแแแแแ แแงแแแแแก แแแแกแขแแ แแก แคแแฅแขแแฃแ แกแแฎแแแแแก, แกแแแแช แฎแแแแ แแแแแแแแแ (แแแกแ-แแแแกแขแแ แ) แแ แแ แแแฅแขแแก แกแแฎแแแ (แแแกแแแชแแ แ แแ แแแฅแขแ), แกแแแแช แแแแกแขแแ แ แแแแแแ แแแแก.
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"
แฉแแแ แแแกแ แฃแแแแ แแแแแแแแแก, แแฎแกแแแ แแแแกแแแแก แแแแแแแแแแก แแ แแแแแแแแแแแ, แ แแ แแแแฎแแแ แแแแขแแแแแ แแก แฌแแ แแแขแแแฃแ แแฌแงแแแแก.
Screenshot
แจแแแแแ แแ แแฌแงแแแแแ แแแแขแแแแแ แแก แฌแแ แแแขแแแฃแแ แแแแแแแแแ
Screenshot
แแ แแแแแ แแฎ แแแแแแแแแ แ แแแ แแแแขแ แ Ingress. แแ แแ แแแ แขแแแ แแแแแแแก แแแแ: แแ แแฎแแ แแแงแแแแแแก แจแแแแแ แแแขแแแ แแแ แแแชแแแฃแแ แกแแฎแแแแ, แแก แแแ แฉแแแ แแแฅแแแแ, แแ แแฅแแก แแแแจแแแแแแแ แ แแแแแ แแแแแแแแแแก แจแแแกแ แฃแแแแ แแ แกแแฎแแแแ. แแแแแแแ, แแก แชแแขแ แกแชแแแแแแ แแกแขแแ แแแก แคแแ แแแแแก.
แแแกแแแแแแแก แแแชแแแแ
แงแแแแ แแแแแแฆแแแจแแฃแแ แแแแแฏแ, แแแแแ, แแแ แแแฎแแ แฎแแ, แแแแ แแ แฃแแ แแแแ แแแแแกแขแแแแ แแ แ แแแแแแแแ แแแแแแแขแ แฏแแแแแแกแแกแแแแก, แแแแ แแฃแฃแแแแแแกแแแแก. แแแแ แแ แ แแขแแแฆแแช แแ แแแแฌแแแก แแแแแแแขแแแ. แแกแ, แฃแคแ แ แแฃแกแขแแ, แแแ แแฎแแแแ แกแแกแแฌแแ แแแแแแแแแแก แแแแ แแแแแแ แแแ.
แแ แแ แฃแแ แแแแ แแแแฌแแแก แแฎแแแ แแแแแก แแฎแกแแ แฉแแแแแแก. แแแแแ แแแงแแแแแแ แขแแฅแกแขแ แแกแแแ แแ แแก แแแ, แ แแแ แแแแแแแแ แแ แแก แแแกแแแแแแ, แ แแแแแแแช แแ แแแแแฆแ แแแแแแแแแ แแฆแฌแแ แแแ แแ แแแแแแแก แแแแแญแ แแกแแก. แแแฃแแแแ แ แแแ, แแแแช แแแก แแกแแแแกแแ แกแฃแแแช แแ แแ แแก แกแแจแแแแแ แแแแแ แแแแแแจแ. แแฃ แฉแแแ แแฆแแแฉแแแแแ แแแแแแก แแแแแช แแแแฎแแแ แแแ, แแแแแแแ แ แแแฅแแแแ.
แฌแงแแ แ: www.habr.com