Jsonnet рдкрд░ 100 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ 100 gitlab рдиреМрдХрд░реА рдХрд╛ рд╡рд░реНрдгрди рдХреИрд╕реЗ рдХрд░реЗрдВ

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рддреИрдирд╛рддреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ .gitlab-ci.yml рдореЗрдВ рдиреМрдХрд░реА рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Jsonnet рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



Dano


рдПрдХ рдореЛрдиреЛрд░рдкрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ:


  • 10 рдбреЙрдХрдлрд╛рдЗрд▓реНрд╕
  • 30 рд╡рд░реНрдгрд┐рдд рддреИрдирд╛рддреА
  • 3 рд╡рд╛рддрд╛рд╡рд░рдг: devel , рдордВрдЪрди рдФрд░ рдЙрддреНрдкрд╛рджрди

рдХрд╛рд░реНрдп


рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:


  • рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЬреАрдЖрдИрдЯреА рдЯреИрдЧ рдЬреЛрдбрд╝рдХрд░ рдбреЙрдХрд░реЛрдВ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдСрдкрд░реЗрд╢рди рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╢рд╛рдЦрд╛ рдореЗрдВ рдзрдХреЗрд▓рддреЗ рд╕рдордп рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрджрд▓рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдЕрдкрдирд╛ рдПрдХ рдЕрд▓рдЧ рдЯреИрдЧ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рддреИрдирд╛рддреА рдХрд░рддрд╛ рд╣реИред
  • рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдореЗрдВ рдЕрдкрд╡рд╛рдж рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдХреБрдЫ рдкрд░рд┐рдирд┐рдпреЛрдЬрди git GIT_SUBMODULE_STRATEGY=normal рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реЗрдЯ рдЪрд░ GIT_SUBMODULE_STRATEGY=normal рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рдпрд╣ рд╕рдм рдмрддрд╛рддреЗ рд╣реБрдП рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд░рдХ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдирд┐рд░рд╛рд╢рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ Jsonnet рдХреЗ рд╕рд╛рде рд╕рд╢рд╕реНрддреНрд░ рд╣рдо рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХрд░реЗрдВрдЧреЗред


рдирд┐рд░реНрдгрдп


gitlab-ci.yml рдореЗрдВ рдмрд╛рд░-рдмрд╛рд░ рдиреМрдХрд░рд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХреНрд╕рдЯреЗрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реНрдг-рд╡рд┐рдХрд╕рд┐рдд templating рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рд╕рдмрд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдХреБрд╢рд▓ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред


рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ jsonnet рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ, рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп рдХреЛрдб рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


Jsonnet рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рдЖрдкрдХреЗ рд╕рдВрдкрд╛рджрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдо-рдЬреЛрдВрд╕рдиреЗрдЯ рдкреНрд▓рдЧрдЗрди рд╣реИ рдЬреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ рдЗрд╕реЗ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рдХреЗ рд╕рдордп рдЬреЛрдВрд╕рдиреЗрдЯ fmt рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЗрд╕рдХреЗ рд▓рд┐рдП jsonnet рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ)ред

рдЖрдЗрдП рд╣рдорд╛рд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦреЗрдВ:


 . тФЬтФАтФА deploy тФВ  тФЬтФАтФА analyse тФВ  тФЬтФАтФА basin тФВ  тФЬтФАтФА brush тФВ  тФЬтФАтФА copper тФВ  тФЬтФАтФА dinner тФВ  тФЬтФАтФА dirty тФВ  тФЬтФАтФА drab тФВ  тФЬтФАтФА drunk тФВ  тФЬтФАтФА education тФВ  тФЬтФАтФА fanatical тФВ  тФЬтФАтФА faulty тФВ  тФЬтФАтФА guarantee тФВ  тФЬтФАтФА guitar тФВ  тФЬтФАтФА hall тФВ  тФЬтФАтФА harmonious тФВ  тФЬтФАтФА history тФВ  тФЬтФАтФА iron тФВ  тФЬтФАтФА maniacal тФВ  тФЬтФАтФА mist тФВ  тФЬтФАтФА nine тФВ  тФЬтФАтФА pleasant тФВ  тФЬтФАтФА polish тФВ  тФЬтФАтФА receipt тФВ  тФЬтФАтФА shop тФВ  тФЬтФАтФА smelly тФВ  тФЬтФАтФА solid тФВ  тФЬтФАтФА stroke тФВ  тФЬтФАтФА thunder тФВ  тФЬтФАтФА ultra тФВ  тФФтФАтФА yarn тФФтФАтФА dockerfiles тФЬтФАтФА dinner тФЬтФАтФА drunk тФЬтФАтФА fanatical тФЬтФАтФА guarantee тФЬтФАтФА guitar тФЬтФАтФА harmonious тФЬтФАтФА shop тФЬтФАтФА smelly тФЬтФАтФА thunder тФФтФАтФА yarn 

рдХрд╛рдЗрдХреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдбреЙрдХрд░реА рдЪрд┐рддреНрд░ рдмрдирд╛рдП рдЬрд╛рдПрдВрдЧреЗ


рдХреНрдпреВрдмреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рд╡реЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:


 qbec apply <environment> --root deploy/<app> --yes 

рдЬрд╣рд╛рдВ:


  • <app> - рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рдирд╛рдо
  • <environment> рд╣рдорд╛рд░реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ: рдбреЗрд╡реЗрд▓ , рд╕реНрдЯреЗрдЬ, рдпрд╛ рдареЗрд╕ ред

рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реА рдиреМрдХрд░рд┐рдпреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:


рд╡рд┐рдзрд╛рдирд╕рднрд╛:


 build:{{ image }}: stage: build tags: - build image: name: gcr.io/kaniko-project/executor:debug entrypoint: [""] script: - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/dockerfiles/{{ image }}/Dockerfile --destination $CI_REGISTRY_IMAGE/{{ image }}:$CI_COMMIT_TAG only: refs: - tags 

рдЬрд╣рд╛рдВ {{ image }} рдмрдЬрд╛рдп, dockerfiles рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╛рдо рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛


рдирд┐рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ:


 deploy:{{ environment }}:{{ app }}: stage: deploy tags: - {{ environment }} script: - qbec apply {{ environment }} --root deploy/{{ app }} --force:k8s-context __incluster__ --wait --yes only: changes: - deploy/{{ app }}/**/* refs: - {{ environment }} 

рдЬрд╣рд╛рдВ {{ app }} рдмрдЬрд╛рдп, рддреИрдирд╛рддреА рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╛рдо рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛,
рдФрд░ {{ environment }} рдмрдЬрд╛рдп - рдЙрд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдирд╛рдо рдЬрд┐рд╕рдореЗрдВ рдЖрдк рддреИрдирд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред


рдЖрдЗрдП рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рд╡рд╛рдж / jobs.jsonnet рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реА рдиреМрдХрд░рд┐рдпреЛрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ


 { //    docker- dockerImage(name):: { tags: ['build'], stage: 'build', image: { name: 'gcr.io/kaniko-project/executor:debug-v0.15.0', entrypoint: [''], }, script: [ 'echo "{\\"auths\\":{\\"$CI_REGISTRY\\":{\\"username\\":\\"$CI_REGISTRY_USER\\",\\"password\\":\\"$CI_REGISTRY_PASSWORD\\"}}}" > /kaniko/.docker/config.json', '/kaniko/executor --cache --context $CI_PROJECT_DIR/dockerfiles/' + name + ' --dockerfile $CI_PROJECT_DIR/dockerfiles/' + name + '/Dockerfile --destination $CI_REGISTRY_IMAGE/' + name + ':$CI_COMMIT_TAG --build-arg VERSION=$CI_COMMIT_TAG', ], }, //    qbec- qbecApp(name): { stage: 'deploy', script: [ 'qbec apply $CI_COMMIT_REF_NAME --root deploy/' + name + ' --force:k8s-context __incluster__ --wait --yes', ], only: { changes: [ 'deploy/' + name + '/**/*', ], }, }, } 

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдлреНрд╕ рдФрд░ tags рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдкрдХреЛ jsonnet рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрд╛рдж рдореЗрдВ рдореБрдЦреНрдп рдлрд╛рдЗрд▓ рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗред


рдЕрдм рд╣рдо рдЕрдкрдиреЗ .itlab-ci.jsonnet рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ:


 //    local jobs = import 'lib/jobs.libsonnet'; //    local ref(x) = { only+: { refs: [x] } }; local tag(x) = { tags: [x] }; local submodule(x) = { variables+: { GIT_SUBMODULE_STRATEGY: x } }; { // C docker- ['build:' + x]: jobs.dockerImage(x) + tag('build') + ref('tags') for x in [ 'dinner', 'drunk', 'fanatical', 'guarantee', 'guitar', 'harmonious', 'shop', 'smelly', 'thunder', 'yarn', ] } + { //         'prod' ['deploy:prod:' + x]: jobs.qbecApp(x) + tag('prod') + ref('prod') for x in [ 'dinner', 'hall', ] } + { //   git-submodule ['deploy:' + env + ':' + app]: jobs.qbecApp(app) + tag(env) + ref(env) + submodule('normal') for env in ['devel', 'stage', 'prod'] for app in [ 'brush', 'fanatical', 'history', 'shop', ] } + { //    ['deploy:' + env + ':' + app]: jobs.qbecApp(app) + tag(env) + ref(env) for env in ['devel', 'stage', 'prod'] for app in [ 'analyse', 'basin', 'copper', 'dirty', 'drab', 'drunk', 'education', 'faulty', 'guarantee', 'guitar', 'harmonious', 'iron', 'maniacal', 'mist', 'nine', 'pleasant', 'polish', 'receipt', 'smelly', 'solid', 'stroke', 'thunder', 'ultra', 'yarn', ] } 

рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд░реЗрдлрд░реА , рдЯреИрдЧ рдФрд░ рд╕рдмрдореЙрдбреНрдпреВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рд╡реЗ рдЖрдкрдХреЛ рдПрдХ рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред


рдереЛрдбрд╝реА рд╕реА рд╡реНрдпрд╛рдЦреНрдпрд╛: рдУрд╡рд░рд░рд╛рдЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП " +: " рдХреЗ рдмрдЬрд╛рдп " +: " рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП " : " рд░реЗрдл рдХреЗ рд▓рд┐рдП :


 local job = { script: ['echo 123'], only: { refs: ['tags'] }, }; local ref(x) = { only+: { refs: [x] } }; job + ref('prod') 

рд▓реМрдЯреЗрдЧрд╛:


 { "only": { "refs": [ "prod" ] }, "script": [ "echo 123" ] } 

рдФрд░ рдпрд╣рд╛рдБ refs рдХреЗ рд▓рд┐рдП " +: " рд╣реИ:


 local job = { script: ['echo 123'], only: { refs: ['tags'] }, }; local ref(x) = { only+: { refs+: [x] } }; job + ref('prod') 

рд▓реМрдЯреЗрдЧрд╛:


 { "only": { "refs": [ "prod", "tags" ] }, "script": [ "echo 123" ] } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, Jsonnet рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЖрдк рдмрд╣реБрдд рд╣реА рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЕрдкрдиреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдФрд░ рд╡рд┐рд▓рдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рддреИрдпрд╛рд░ JSON рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рддреБрд░рдВрдд рд╣рдорд╛рд░реА .itlab-ci.yml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 jsonnet .gitlab-ci.jsonnet > .gitlab-ci.yml 

рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:


 # wc -l .gitlab-ci.jsonnet lib/jobs.libsonnet .gitlab-ci.yml 77 .gitlab-ci.jsonnet 24 lib/jobs.libsonnet 1710 .gitlab-ci.yml 

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ!


рдЖрдк рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рд╕реАрдзреЗ Jsonnet рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: jsonnet.org
рдпрджрд┐ рдЖрдк, рдореЗрд░реА рддрд░рд╣, Jsonnet рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо t.me/jsonnet_ru рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ

Source: https://habr.com/ru/post/hi483626/


All Articles