{"id":2100,"date":"2022-02-11T17:58:31","date_gmt":"2022-02-11T17:58:31","guid":{"rendered":"https:\/\/blog.samarthya.me\/wps\/?p=2100"},"modified":"2022-02-23T08:57:31","modified_gmt":"2022-02-23T08:57:31","slug":"kaniko-jenkins-pipeline","status":"publish","type":"post","link":"https:\/\/blog.samarthya.me\/wps\/2022\/02\/11\/kaniko-jenkins-pipeline\/","title":{"rendered":"Kaniko: Jenkins Pipeline"},"content":{"rendered":"\n<p>So there are many things I have been simultaneously trying to learn &amp; one of those is to learn how you can configure a pipeline<\/p>\n\n\n\n<figure class=\"wp-block-pullquote has-white-color has-black-background-color has-text-color has-background\"><blockquote><p>Read more about Pipeline as  Code (PaC)<\/p><\/blockquote><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"objectives\">Objectives<\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>Learn Jenkins deployment on Kubernetes<\/li><li>Learn Jenkins Kubernetes Plugin<\/li><li>Learn Jenkins Pipeline (<code>Declarative<\/code>)<\/li><li>How to build and deploy images in Kubernetes cluster<\/li><\/ol>\n\n\n\n<p>All right, with so many monkeys on my back I had to do things the way I know it works for me.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"k8s-cluster-setup\">k8s cluster setup<\/h2>\n\n\n\n<p>I have a local cluster v1.23.1<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"361\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.21.11-PM-1024x361.png\" alt=\"\" class=\"wp-image-2101\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.21.11-PM-1024x361.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.21.11-PM-300x106.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.21.11-PM.png 1136w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.21.11-PM-300x106@2x.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"jenkins-setup\">Jenkins Setup<\/h2>\n\n\n\n<p>I have already covered steps to deploy a <code>Jenkins<\/code> instance <a rel=\"noreferrer noopener\" href=\"https:\/\/blog.samarthya.me\/wps\/2022\/02\/02\/jenkins-k8s\/\" target=\"_blank\">here<\/a>. A detailed list of all entities in the namespace <code>jenkins<\/code> are below<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@master&gt;k get pods,services,pv,pvc,sa,serviceaccount,rolebinding -n jenkins\nNAME              READY   STATUS    RESTARTS      AGE\npod\/myjenkins-0   2\/2     Running   18 (8h ago)   9d\n\nNAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE\nservice\/myjenkins         ClusterIP   10.103.226.229   &lt;none&gt;        8080\/TCP    9d\nservice\/myjenkins-agent   ClusterIP   10.105.132.66    &lt;none&gt;        50000\/TCP   9d\n\nNAME                                              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                                     STORAGECLASS   REASON   AGE\npersistentvolume\/dx-restmon-restmon--default-pv   1Gi        RWO            Retain           Bound      default\/dx-restmon-restmon--default-pvc                           71d\npersistentvolume\/jenkins-pv                       8Gi        RWO            Retain           Bound      jenkins\/myjenkins                                                 9d\npersistentvolume\/kafka-pv                         8Gi        RWO            Retain           Bound      default\/data-my-release-zookeeper-0                               3h36m\npersistentvolume\/prometheus-alertmanager          2Gi        RWO            Retain           Released   default\/prometheus-alertmanager                                   88d\npersistentvolume\/prometheus-server                8Gi        RWO            Retain           Released   default\/prometheus-server                                         88d\npersistentvolume\/zookeper-pv                      8Gi        RWO            Retain           Bound      default\/data-my-release-kafka-0                                   3h34m\n\nNAME                              STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   AGE\npersistentvolumeclaim\/myjenkins   Bound    jenkins-pv   8Gi        RWO                           9d\n\nNAME                       SECRETS   AGE\nserviceaccount\/default     1         9d\nserviceaccount\/myjenkins   1         9d\n\nNAME                                                               ROLE                             AGE\nrolebinding.rbac.authorization.k8s.io\/jenkins-admin-binding        ClusterRole\/admin                2d\nrolebinding.rbac.authorization.k8s.io\/myjenkins-schedule-agents    Role\/myjenkins-schedule-agents   9d\nrolebinding.rbac.authorization.k8s.io\/myjenkins-watch-configmaps   Role\/myjenkins-casc-reload       9d<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-pullquote has-white-color has-black-background-color has-text-color has-background\"><blockquote><p><a href=\"https:\/\/www.jenkins.io\/doc\/book\/installing\/kubernetes\/\">Official documentation is very detailed<\/a><\/p><cite>https:\/\/www.jenkins.io\/doc\/book\/installing\/kubernetes\/<\/cite><\/blockquote><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"plugin-kubernetes\">Plugin Kubernetes<\/h2>\n\n\n\n<p>Configuring Kubernetes plugin was easier than I thought in Jenkins.<\/p>\n\n\n\n<figure class=\"wp-block-pullquote has-white-color has-black-background-color has-text-color has-background\"><blockquote><p><a href=\"https:\/\/plugins.jenkins.io\/kubernetes\/\">Kubernetes Plugin<\/a><\/p><cite>https:\/\/plugins.jenkins.io\/kubernetes\/<\/cite><\/blockquote><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full is-style-default\"><img decoding=\"async\" width=\"1010\" height=\"142\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.34.25-PM.png\" alt=\"\" class=\"wp-image-2102\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.34.25-PM.png 1010w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.34.25-PM-300x42.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.34.25-PM-300x42@2x.png 600w\" sizes=\"(max-width: 1010px) 100vw, 1010px\" \/><figcaption>Plugin Kubernetes<\/figcaption><\/figure>\n\n\n\n<p>Once plugin is installed time to configure the plugin &amp; nodes<\/p>\n\n\n\n<div class=\"wp-block-image is-style-default\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" width=\"680\" height=\"456\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.35.44-PM.png\" alt=\"\" class=\"wp-image-2103\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.35.44-PM.png 680w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.35.44-PM-300x201.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.35.44-PM-300x201@2x.png 600w\" sizes=\"(max-width: 680px) 100vw, 680px\" \/><\/figure><\/div>\n\n\n\n<p>Click the configure clouds<\/p>\n\n\n\n<div class=\"wp-block-image is-style-default\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"478\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.08-PM-1024x478.png\" alt=\"\" class=\"wp-image-2104\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.08-PM-1024x478.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.08-PM-300x140.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.08-PM-1536x717.png 1536w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.08-PM-2048x956.png 2048w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.08-PM-300x140@2x.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"server-url\">Server URL<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>root@master&gt;kubectl config view --minify | grep server\n    server: https:\/\/10.80.241.78:6443<\/code><\/pre>\n\n\n\n<p>Supply the values of the cluster information set-up the credentials (I named them <code>jenkins<\/code>) and click test connection<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"156\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.16-PM-1024x156.png\" alt=\"\" class=\"wp-image-2105\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.16-PM-1024x156.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.16-PM-300x46.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.16-PM-1536x234.png 1536w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.16-PM-2048x312.png 2048w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-4.37.16-PM-300x46@2x.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In Jenkins create a&nbsp;<em>Secret Text<\/em>&nbsp;credentials and paste the&nbsp;<strong>decoded<\/strong>&nbsp;value of the ServiceAccount token.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get secret $(kubectl get sa myjenkins -n jenkins -o jsonpath={.secrets&#91;0].name}) -n jenkins -o jsonpath={.data.token} | base64 --decode<\/code><\/pre>\n\n\n\n<p>You can also retrieve server cert by using the command below<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kubectl get secret $(kubectl get sa myjenkins -n jenkins -o jsonpath={.secrets&#91;0].name}) -n jenkins -o jsonpath={.data.'ca\\.crt'} | base64 --decode<\/code><\/pre>\n\n\n\n<p>My source code is posted <a href=\"https:\/\/github.com\/samarthya\/spinnaker-hello\">here (Git HUB)<\/a><\/p>\n\n\n\n<p>Two out of 4 objectives are done, time to create a pipeline.<\/p>\n\n\n\n<figure class=\"wp-block-pullquote has-white-color has-black-background-color has-text-color has-background\"><blockquote><p><a rel=\"noreferrer noopener\" href=\"https:\/\/plugins.jenkins.io\/kubernetes\/#plugin-content-usage\" target=\"_blank\">Please refer to the usage section of the plugin<\/a>.<\/p><\/blockquote><\/figure>\n\n\n\n<figure class=\"wp-block-pullquote has-border-color has-pale-pink-border-color has-black-color has-pale-pink-background-color has-text-color has-background\"><blockquote><p>The Kubernetes plugin allocates Jenkins agents in Kubernetes pods. <\/p><cite>Plugin Kubernetes<\/cite><\/blockquote><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"points-to-remember\">Points to remember<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Within these pods allocated there is always one special container <code>jnlp<\/code> that is running the Jenkins agent. Other containers can run arbitrary processes of your choosing, and it is possible to run commands dynamically in any container in the agent pod.<\/li><li>We define pod templates to use the kubernetes based pipelines.<\/li><li>Pod templates defined using the user interface declare a label. (Look for <a href=\"https:\/\/github.com\/jenkinsci\/kubernetes-plugin\/tree\/master\/examples\">examples here<\/a>)<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>podTemplate {\n    node(POD_LABEL) {\n       \/\/ Steps...\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"blocks-of-pipeline-declarative\">Blocks of Pipeline (Declarative)<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>agent<\/li><li>environment<\/li><li>stages<\/li><li>steps<\/li><li>post<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"agent\">AGENT<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>The <code>agent<\/code> section defines the worker or machine where the pipeline will be executed. <\/li><li>Can be defined at the top level inside the pipeline block or overridden at the stage level. <\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"environment\">ENVIRONMENT<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>The <code>environment<\/code> section defines a set of environment variables needed in the pipeline steps. <\/li><li>The variables can be defined as sequences of key-value pairs.<\/li><li>Reference credential variables can also be defined by using method <code>credentials()<\/code>, which takes as a parameter the ID of the target credential (defined in <code>jenkins<\/code>)<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"stages\">STAGES<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>This section defines actions a high level. <\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"steps\">STEPS<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>The <code>steps<\/code> section contains a series of steps to be executed in a given stage directive.<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"post\">POST<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>Depending on the location it is defined the post section will run upon the completion of a pipeline or stage run.<\/li><li>It contains commands or scripts <\/li><\/ul>\n\n\n\n<p>The above idiom creates a pod template with a generated unique label (available as <code>POD_LABEL<\/code>) and runs commands inside it.<\/p>\n\n\n\n<figure class=\"wp-block-pullquote has-white-color has-black-background-color has-text-color has-background\"><blockquote><p>Pod templates are used to create agents. They can be either configured via the user interface, or in a pipeline, using the <code>podTemplate<\/code> step.<\/p><cite>Official documentation<\/cite><\/blockquote><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"example\">Example<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>podTemplate(yaml: '''\n    apiVersion: v1\n    kind: Pod\n    spec:\n      volumes:\n      - name: kaniko-secret\n        secret:\n          secretName: regcred\n          items:\n          - key: .dockerconfigjson\n            path: config.json\n      containers:\n      - name: golang\n        image: golang:latest\n        command:\n        - cat\n        tty: true\n      - name: kaniko\n        image: gcr.io\/kaniko-project\/executor:debug\n        command:\n        - cat\n        tty: true\n        volumeMounts:\n          - name: kaniko-secret\n            mountPath: \/kaniko\/.docker\n        \n        \n''')<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-pullquote has-white-color has-black-background-color has-text-color has-background\"><blockquote><p>You can read more about pipelines <a rel=\"noreferrer noopener\" href=\"https:\/\/www.jenkins.io\/doc\/book\/pipeline\/\" target=\"_blank\">here<\/a>.<\/p><\/blockquote><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"run-the-pipeline\">Run the pipeline<\/h2>\n\n\n\n<p>I am using VS Code for my code management and <code>Jenkins Runner<\/code> plugin, so it is just matter of executing the pipeline on the default job configured.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"446\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.13-PM-1024x446.png\" alt=\"\" class=\"wp-image-2108\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.13-PM-1024x446.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.13-PM-300x131.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.13-PM-1536x668.png 1536w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.13-PM-2048x891.png 2048w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.13-PM-300x131@2x.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Run the pipeline on default<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"665\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.28-PM-1024x665.png\" alt=\"\" class=\"wp-image-2109\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.28-PM-1024x665.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.28-PM-300x195.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.28-PM.png 1170w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.28-PM-300x195@2x.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>&amp; in Jenkins<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"338\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.47-PM-1024x338.png\" alt=\"\" class=\"wp-image-2110\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.47-PM-1024x338.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.47-PM-300x99.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.47-PM-1536x507.png 1536w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.47-PM-2048x676.png 2048w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.23.47-PM-300x99@2x.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In the docker hub<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"376\" src=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.25.39-PM-1024x376.png\" alt=\"\" class=\"wp-image-2111\" srcset=\"https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.25.39-PM-1024x376.png 1024w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.25.39-PM-300x110.png 300w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.25.39-PM-1536x564.png 1536w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.25.39-PM-2048x751.png 2048w, https:\/\/blog.samarthya.me\/wps\/wp-content\/uploads\/2022\/02\/Screenshot-2022-02-11-at-11.25.39-PM-300x110@2x.png 600w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>If you are curious why not docker in docker? It is a bad option but is well explained <a rel=\"noreferrer noopener\" href=\"https:\/\/jpetazzo.github.io\/2015\/09\/03\/do-not-use-docker-in-docker-for-ci\/\" target=\"_blank\">here<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"others\">Others<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" href=\"https:\/\/plugins.jenkins.io\/blueocean\/\" target=\"_blank\">Blue Ocean <\/a>Plugin<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>So there are many things I have been simultaneously trying to learn &amp; one of those is to learn how you can configure a pipeline Read more about Pipeline as Code (PaC) Objectives Learn Jenkins deployment on Kubernetes Learn Jenkins Kubernetes Plugin Learn Jenkins Pipeline (Declarative) How to build and deploy images in Kubernetes cluster [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2108,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"image","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[86,137,195,34],"tags":[240,82,229,241],"class_list":["post-2100","post","type-post","status-publish","format-image","has-post-thumbnail","hentry","category-docker","category-golang","category-kubernetes","category-technical","tag-build","tag-docker","tag-jenkins","tag-kaniko","post_format-post-format-image"],"_links":{"self":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/2100","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/comments?post=2100"}],"version-history":[{"count":0,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/2100\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media\/2108"}],"wp:attachment":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media?parent=2100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/categories?post=2100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/tags?post=2100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}