Munus instruere in GKE sine plugins, SMS vel adnotatione creamus. Sumamus peek sub Jenkins iaccam

Omnia incepit cum turmae plumbeae unius iunctionis evolutionis nostrae postulaverunt nos ut novam applicationem eorum probaremus, quae pridie continenti fuerat. Posui. Post circiter XX minuta, postulatio recepta est ut applicationis renovaretur, quod res valde necessaria adiecta est. renovavi. Post alias duas horas... bene, suspicari potes quid proxime futurum sit.

Fateor, satis piger sum (nonne hoc prius fateor? non?), et quod turma ducit accessum ad Jenkins, in quo omnes CI/CD putavi: explicant ut quantum vult ! Recordatus sum ioci: da homini piscem et edet diem; vocaverit hominem Pavit, et pascetur tota vita sua. Et perrexit ludere dolis officiumquae exponere posset continens applicationem cuiusvis versionis in Kuber feliciter aedificatae et bona aliqua ad eam transferre. INV (avus meus, philologus Anglicus olim magister, digitum ad templum suum nunc voraret et me perquam expresse post hanc sententiam legeret videbat).

Sic in hoc notula referam quomodo didicerim;

  1. Dynamically renovare operas in Jenkins ab ipso opere vel ex aliis negotiis;
  2. Connectunt ad nubes consolatorium (Cloud putamen) e nodo cum Jenkins agente inaugurato;
  3. Explicare quod inposuit Google Kubernetes Engine.


Nam ego quidem ignobilis. Ponitur te habere saltem partem infrastructuram in nube Google, et ideo eius usor es et, utique, rationem GCP habes. Sed haec nota non est.

Hic est proximus fraudulentus schedae meae. Tantum vellem eiusmodi notas scribere in uno casu: Adversus quaestionem eram, initio eam solvere nesciebam, solutio non googled parata facta erat, sic in partibus googled eam egi et tandem problema solvi. Itaque ut in posterum, cum oblitus fuero quomodo id fecerim, omnia google per partes iterum compilare non debeam, plagulas tam fraudulentas me scribo.

disclaimer: 1. Nota scripta "pro me", pro munere optimus exercitia Sed hoc non est. Libet legere "melius fuisset hoc modo facere" optiones in ineo.
2. Si pars apposita notae pro sale consideretur, haec solutio salis infirma est, sicut omnes superiores notae.

Dynamically adaequationis officium occasus in Jenkins

Praevideo quod quaeris: quid ad rem pertinet dynamicum officium adaequationis? Intra valorem chordae parametri manualis et abis abis!

Respondeo: Vere piger sum, non placet cum queruntur: Misha, instruere fragosus, omnia perierunt! Incipis quaerere, et est typo in valore alicuius operis parametri launchendi. Malo igitur omnia facere quam efficacissime. Si fieri potest, ne usor ne in notitia directe ingrediatur dando pro indice valorum eligendorum, electionem instituo.

Consilium hoc est: officium in Jenkins creamus, in quo antequam deducendo versionem e indice eligere potuimus, valores specificare parametri ad modum continentis transierunt. INVtum continens colligit et in Registrium continens impellit. Inde continens in cubicam quod inposuit de quibus ad officium parametri.

Processum creandi et constituendi officium in Jenkins non considerabimus, hoc est topicum. Ponemus id negotium paratum. Ad album renovatum cum versionibus deducendum, duabus rebus opus est: principium exsistens cum indice numerorum versionis validarum priori et quasi variabili. Electio parametri in cqui. In exemplo nostro nominetur variabilis BUILD_VERSIONnon in speciali morabimur. Sed propius inspiciamus fontem indicem.

Multa bene non sunt. Duo statim in mentem venerunt;

  • Utere accessu remoto API quod Jenkins offert suis utentibus;
  • Peto contenta folder repositorii remoti (in nostro casu hoc est JFrog Artifactorius, quod non est magni momenti).

Jenkins Longinquus aditus API

Secundum Institutam egregiam traditionem, prolixas explicationes mallem evitare.
Licebit me solum libera translatione particulae primae paragraphi primam paginam API documentis:

Jenkins API praebet aditum ad functionem suam promptam machinae remotam. <…> Accessus longinquus praebetur in stilo resti similis. Hoc significat nullum esse punctum ad omnes lineamenta, sed potius domicilium sicut ".../api/", Ubi "..."Significat objectum cui applicantur facultates API.

Aliis verbis, si negotium instruere de quo nunc loquimur, praesto est http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_buildergo API sibilant ad hoc opus in promptu sunt http://jenkins.mybuild.er/view/AweSomeApp/job/AweSomeApp_build/api/

Deinde electionem habemus in qua forma ad output recipiendum. Dolor situs in XML, quia API solum hoc casu eliquare permittit.

Iustus tendo ut indicem omnium officium currit. In conventu nomen tantum interest (displayName) et effectus eius (exitum):

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

Factum est?

Nunc colum tantum eae currit qui cum effectu finiunt BONUS EXITUS. Argumentum utamur &excludere et ut modulus transeamus eam viam ad valorem non aequalem BONUS EXITUS. Etiam Etiam. Duplex negativa est oratio. Excludimus omnia quae nihil interest;

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

Screenshot of the list of felix
Munus instruere in GKE sine plugins, SMS vel adnotatione creamus. Let's take a peek under Jenkins' iaccam

Bene, solum pro fun, faciamus fac nos colum non decipere (filtra nunquam mentita!) et album "infelicis" ostendunt:

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

Screenshot de album de non-felicis eius
Munus instruere in GKE sine plugins, SMS vel adnotatione creamus. Let's take a peek under Jenkins' iaccam

Index versionum a folder in a remotis server

Secundus modus est ut indicem versionum accipias. Mihi placet etiam plus quam Jenkins API accessu. Bene, quia si applicatio bene aedificata est, significat eam sarcinam esse et in reposito in congruo folder. Sicut repositio est defectus repositionis versionum applicationum operandi. Similis. Bene, quaerant quae versiones in reposita sunt. Nos Crispum, grep et stimulum remotum folder. Si quis, cuius interest, tunc praedo.

Una linea imperium
Duo notas: nexus in capite omitto et omnibus versionibus a folder non egeo, et eas tantum lego quae intra mensem creata sunt. Mandatum edite ut res tuas ac necessitates conveniat;

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[^/]+' )

Constituens jobs et officium configuration file in Jenkins

Fontem indicem versionum figuravimus. Nunc incorporamus in album inde negotium. Mihi, solutio prompta erat, gradum addere in applicatione aedificandi operis. Quod passum futurum sit, si eventus "successus" esset.

Aperi conventui munus obitus et librum usque ad imum. Bullae deprime: Adde gradum aedificare -> conditionalis gradus (singulus). In gradum occasus, condicionem eligere Current status constructum, Ad valorem BONUS EXITUSActio fi felix Currere mandatum testa.

Et nunc fun part. Jenkins officium configurationum in lima reponit. in forma pron. In via http://путь-до-задания/config.xml Proinde, limam configurationem detrahis, eam ut necessariam emendes et restitue ubi acceperis.

Memento, supra pacti sumus nos parametrum creare pro indicem versionum BUILD_VERSION?

Fasciculi configurationem demus et intra inspice. Modo fac modulum in loco ac speciei desiderati.

Screenshot sub vastatorem.

Tuum config.xml fragmentum idem spectare debet. Nisi quod contenta electionum elementi desunt adhuc
Munus instruere in GKE sine plugins, SMS vel adnotatione creamus. Let's take a peek under Jenkins' iaccam

Es certus? Id est, scriptorum scribamus, quod futurum est, si aedificatio succedit.
Scriptum indicem versionum accipiet, lima configurationem depone, indicem versionum in eo scribe in loco quo opus est ac deinde restitue. Ita. SIC. Indicem versionum in XML scribe in eo loco ubi iam erit indicem versionum (in posterum erit post primam scripturam launch). Scio adhuc acerbum fans regularium locutionum in mundo. Non convenit illis. Quaeso install xmlstarler ad machinam ubi config edantur. Magnum pretium esse non puto ad solvendum ne XML cum sed emendo.

Sub praedo, codicem exhibeo, qui sequentiam integram praestat.

Scribere indicem versionum a folder in servo remoto ad aboutconfig

#!/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

Si mavis facultates versiones ex Jenkinso comparandi et tam piger es quam me, tum sub praedo idem est codice, sed index a Jenkins:

Scribere indicem versionum ab Jenkins ad config
Hoc modo prae oculis habe: conventus nomen meum constat ex numero seriei et numero versionis, a colonia separata. Itaque pars superfluam awk amputat. Tute hunc versum ad usus tuos muta.

#!/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

In theoria, si codicem scriptum exemplis supra exemplis probaveris, tum in munere instruere debes iam album demittere cum versionibus. Est in tortor sub praedo.

Recte perficitur album of versions
Munus instruere in GKE sine plugins, SMS vel adnotatione creamus. Let's take a peek under Jenkins' iaccam

Si omnia operata sunt, tunc effingo crustulum scriptum in Currere mandatum testa et nisi mutationes.

Connectens ut Cloud testa

Habemus collectores in vasis. Ansible utimur ut nostra applicatione instrumenti traditionis et configurationis procuratoris. Itaque, cum ad aedificationem vasorum venit, tria bene in mentem veniunt: Docker in Docker install, Docker install in machina currens Ansible, vel vascula aedificare in nube consolandi. Constat nos de plugins Jenkins in hoc articulo silere. Memento?

Placui: bene, cum vasa "de arca" colligi possunt in nube consolantur, quid ergo molestus? Purum serva, vox? Vasa Jenkins in nube consolari volo colligere, et inde in cuber immitte. Praeterea Google venas uberrimas intra suam infrastructuram habet, quae commoditatem in celeritate instruere habebit.

Ad nubes coniungere consolatorium, duo debes: gcloud et accessum ad ius Google Nubes API pro VM instantia cum quo idem connexio fiet.

Nam qui cogitas ne ex nube Google connectere
Google facultatem concedit inactivare interactivum auctoritatis in suis officiis. Hoc licebit te ad consolatorium etiam ex machina capulus coniungere, si nix currit et ipsum solarium habet.

Si opus est ut accuratius hanc quaestionem intra hanc notae compagem operiam, in commentarios scribe. Si suffragia satis habemus, renovationem in hoc loco scribemus.

Via facillima iura concedendi est per interfaciem interretialem.

  1. Siste exemplum VM a quo postea ad nubem consolandum iunges.
  2. Patefacio Details and click " recipere disciplinam.
  3. In ipso fundo paginae, exempli gratia accessum ambitum elige Plenus accessus ad omnia Nubes APIs.

    screenshot
    Munus instruere in GKE sine plugins, SMS vel adnotatione creamus. Let's take a peek under Jenkins' iaccam

  4. Mutationes tuas servate et exempli gratia deducite.

Postquam VM loading complevit, illi per SSH coniunge et fac nexum sine errore fieri. Utere imperio;

gcloud alpha cloud-shell ssh

A felix nexum spectat aliquid simile hoc
Munus instruere in GKE sine plugins, SMS vel adnotatione creamus. Let's take a peek under Jenkins' iaccam

Explicare ad GKE

Cum omni modo nitimur ut penitus ad IaC (infrastuturam codicis) conemur), fasciculi nostri in Git repositae sunt. Haec ex una parte. Et instruere in kubernetes per fasciculum yaml describitur, quod hoc munere tantum adhibetur, qui etiam ipse codice similis est. Haec ex altera parte. Fere, inquam, consilium hoc est;

  1. Valores variabilium accipimus BUILD_VERSION et, ad libitum, valores variabilium quae transibuntur INV.
  2. Download dockerfile from Git.
  3. Generate yaml instruere.
  4. Ambas harum imaginum fasciculos per scp ad nubem consolamur.
  5. Vas ibi construimus et in subcriptio continens urna
  6. Adhibemus fasciculum oneris instruere ad cuber.

Eamus subtilius. Cum enim coepi de INVintelligamus ergo valores duorum parametri transeundi; PARAM1 и PARAM2. Negotium suum addimus ad instruere, type - Parameter filum.

screenshot
Munus instruere in GKE sine plugins, SMS vel adnotatione creamus. Let's take a peek under Jenkins' iaccam

Nos generabimus yaml simplici Amicus Echo ad limam. Ponitur utique, quod habes in dockerfile PARAM1 и PARAM2quod onus nomen erit awesomeappet vas collectum cum applicatione versionis determinatae inest Continens registro per viam gcr.io/awesomeapp/awesomeapp-$BUILD_VERSIONquibus $BUILD_VERSION iustus e gutta-down album.

Team listing

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

Jenkins agente post connectens utens gcloud alpha nubes-crusta ssh modus interactive praesto non est, itaque mandatum ad nubes consolandum parametri mittimus --mandatum.

Domum folder in nube consolamur ab antiquo dockerfile mundamus:

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

Pone recenter receptaculum dockerfile in domo folder nubis consolatorium utens scp:

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

Colligimus, tag et ventilamus continens ad continens subcriptio:

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"

Idem facimus cum lima instruere. Nota quod praecepta infra nomina ficticia botri utebantur ubi instruere incidit (awsm-botrus) Et nomen project (terribilis-project) ubi botrus sita est.

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"

Negotium currimus, consolatorium aperite, et speramus videre felicem synagogam continentis.

screenshot
Munus instruere in GKE sine plugins, SMS vel adnotatione creamus. Let's take a peek under Jenkins' iaccam

Et tunc bene instruere continentis collecti

screenshot
Munus instruere in GKE sine plugins, SMS vel adnotatione creamus. Let's take a peek under Jenkins' iaccam

Neglecta industria occasum Ingress. Pro una simplici causa: semel eam posuisti quod inposuit dato nomine, remanebit operationalis, quamvis plures instituti hoc nomine fungantur. Bene, in universum, haec paulo supra historiae ambitum habent.

pro conclusiones

Omnes superiores gradus probabiliter fieri non potuerunt, sed simpliciter nonnulla plugin pro Jenkins, eorum muuulion, constituerunt. Sed aliqua de causa non placet plugins. Accuratius ad eos tantum desperationis confugio.

Et tantum placet mihi novum aliquod thema colligere. Textus superius etiam modus est communicandi inventiones quas feci solvendo quaestionem in ipso initio descriptam. Commune cum iis qui ut eum, minime dirum lupum devops. Si saltem aliquem inventis meis adiuveris, gaudebo.

Source: www.habr.com

Add a comment