{"id":11591,"date":"2022-09-21T05:51:04","date_gmt":"2022-09-21T05:51:04","guid":{"rendered":"https:\/\/predictly.se\/jib-circleci-and-google-container-registry\/"},"modified":"2024-05-08T11:46:38","modified_gmt":"2024-05-08T11:46:38","slug":"jib-circleci-and-google-container-registry","status":"publish","type":"post","link":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/","title":{"rendered":"Jib, CircleCI and Google Container Registry"},"content":{"rendered":"<p>Recently we started using <a href=\"https:\/\/circleci.com\" target=\"_blank\" rel=\"noopener\">CircleCI<\/a> as our build tool and we needed to integrate it with our <a href=\"https:\/\/cloud.google.com\" target=\"_blank\" rel=\"noopener\">Google Cloud<\/a> platform and specifically Google Container Registry.<\/p>\n<blockquote><p>Jib builds optimized Docker and OCI images for your Java applications without a Docker daemon &#8211; and without deep mastery of Docker best-practices.<\/p><\/blockquote>\n<p>Jib lets you build and publish Docker images without having to write a  <em>Dockerfile<\/em>  and as we will see, without access to a Docker daemon. This is great when it comes to building Docker images from Java applications since it let&#8217;s you reuse already existing dependencies from your local .m2 repository.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;\n&amp;lt;project xmlns=&quot;http:\/\/maven.apache.org\/POM\/4.0.0&quot; xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;\n  xsi:schemaLocation=&quot;http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd&quot;&amp;gt;\n    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;\/modelVersion&amp;gt;\n    &amp;lt;relative&amp;gt;\n        &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;\/groupId&amp;gt;\n        &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;\/artifactId&amp;gt;\n        &amp;lt;version&amp;gt;2.3.4.RELEASE&amp;lt;\/version&amp;gt;\n        &amp;lt;relativePath\/&amp;gt;\n    &amp;lt;\/parent&amp;gt;\n    &amp;lt;groupId&amp;gt;se.predictly.build&amp;lt;\/groupId&amp;gt;\n    &amp;lt;artifactId&amp;gt;build-app&amp;lt;\/artifactId&amp;gt;\n    &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;\/version&amp;gt;\n\n    &amp;lt;properties&amp;gt;\n        &amp;lt;java.version&amp;gt;11&amp;lt;\/java.version&amp;gt;\n    &amp;lt;\/properties&amp;gt;\n\n    &amp;lt;dependencies&amp;gt;\n        &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;\/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-starter-actuator&amp;lt;\/artifactId&amp;gt;\n        &amp;lt;\/dependency&amp;gt;\n        &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;\/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;\/artifactId&amp;gt;\n        &amp;lt;\/dependency&amp;gt;\n    &amp;lt;\/dependencies&amp;gt;\n\n    &amp;lt;build&amp;gt;\n        &amp;lt;plugins&amp;gt;\n            &amp;lt;plug-in&amp;gt;\n                &amp;lt;groupId&amp;gt;com.google.cloud.tools&amp;lt;\/groupId&amp;gt;\n                &amp;lt;artifactId&amp;gt;jib-maven-plugin&amp;lt;\/artifactId&amp;gt;\n                &amp;lt;version&amp;gt;2.5.2&amp;lt;\/version&amp;gt;\n            &amp;lt;\/plugin&amp;gt;\n        &amp;lt;\/plugins&amp;gt;\n    &amp;lt;\/build&amp;gt;\n&amp;lt;\/project&amp;gt;\n<\/pre>\n<p>With this in place, we can start building our Docker images by running<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">mvn test jib:build -Dimage=gcr.io\/predictly-demo\/build-app:latest<\/pre>\n<p>Of course, it is a bit more elaborate in our pipelines but this works for descriptive purposes.<\/p>\n<h6>Authenticating with Google Container Registry<\/h6>\n<p>This proved to be the most cumbersome task since we want to keep build times as low as possible. Locally, this was easily resolved since Jib understands and integrates with <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/\" target=\"_blank\" rel=\"noopener\">Minikube<\/a> using <a href=\"https:\/\/skaffold.dev\" target=\"_blank\" rel=\"noopener\">Skaffold<\/a> which we use for local development.<\/p>\n<h6>CircleCI Orbs<\/h6>\n<p>On CircleCI, the best way to keep build times down is to reuse the official orbs and executors since these Docker images are very likely to be cached on what ever server your build ends up on. This lead us to use the <a href=\"https:\/\/circleci.com\/developer\/orbs\/orb\/circleci\/maven\" target=\"_blank\" rel=\"noopener\">maven<\/a> orb published by CircleCI, a build image with Java and maven installed.<\/p>\n<p>Jib automatically uses <a href=\"https:\/\/cloud.google.com\/container-registry\/docs\/advanced-authentication#docker_credential_helper\" target=\"_blank\" rel=\"noopener\">docker-credential-gcr<\/a> for <a href=\"https:\/\/github.com\/GoogleContainerTools\/jib\/tree\/master\/jib-maven-plugin#authentication-methods\" target=\"_blank\" rel=\"noopener\">authentication<\/a> if available. Of course, this isn&#8217;t the case in the CircleCI maven orb. To resolve this, we have to install and initialize the Google Cloud CLI and authenticate towards GCR during the build. Luckily, CircleCI has also provided the <a href=\"https:\/\/circleci.com\/developer\/orbs\/orb\/circleci\/gcp-gcr\" target=\"_blank\" rel=\"noopener\">gcp-gcr<\/a> orb with the commands required to perform these tasks.<\/p>\n<h6>GCP IAM Service Account<\/h6>\n<p>There are a few different ways to authenticate against GCP using <em>docker-credential-gcr<\/em> and the preferred way is to use <strong>gcloud as a credential helper<\/strong>. We setup a GCP IAM service account and gave it the <em>Storage Admin<\/em> role which is required to push images to GCR.<\/p>\n<p>We also created a key in JSON format for this service account.<\/p>\n<h6>CircleCI Context<\/h6>\n<p>With the service account and a corresponding key created, we turned to configuring a context in CircleCI. We created the following environment variables in a context named <em>predictly-demo<\/em><\/p>\n<p><em>GOOGLE_PROJECT_ID<\/em> &#8211; name of our GCP project, predictly-demo<\/p>\n<p><em>GOOGLE_COMPUTE_ZONE<\/em> &#8211; our preferred zone, europe-north1-a<\/p>\n<p><em>GCLOUD_SERVICE_KEY<\/em> &#8211; service account key (you can just paste it in as is)<\/p>\n<p>These three environment variables will contain the necessary information to configure and authenticate using <em>docker-credential-gcr<\/em> in our build.<\/p>\n<h6>Build configuration<\/h6>\n<p>Our final CircleCI configuration uses the <a href=\"https:\/\/circleci.com\/developer\/orbs\/orb\/circleci\/gcp-gcr\" target=\"_blank\" rel=\"noopener\">gcp-gcr<\/a> orb and the <em>gcr-auth<\/em> command from CircleCI to make sure that the necessary tools, configuration and authentication is done without us having to worry about it.<\/p>\n<pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\nversion: 2.1\n\norbs:\n  stomach: circleci\/maven@1.0.2\n  gcp-gcr: circleci\/gcp-gcr@0.8.0\n\njobs:\n  jib-build-deploy:\n  executor: maven\/default\n  steps:\n  - gcp-gcr\/gcr-auth\n  - checkout\n  - maven\/with_cache:\n  steps:\n  - run:\n  command: &#039;mvn test jib:build -Dimage=gcr.io\/predictly-demo\/${CIRCLE_PROJECT_REPONAME}&#039;\n  - maven\/process_test_results:\n  test_results_path: target\/surefire-reports\n\nworkflows:\n  feature_branch:\n  jobs:\n  - stomach\/test:\n  filters:\n  branches:\n  ignore:\n  - master\n  Master:\n  jobs:\n  - jib-build-deploy:\n  context: predictly-demo\n  filters:\n  branches:\n  only:\n  - master\n<\/pre>\n<p>Using this configuration, we install and initialize the GCloud CLI every time but this is very fast so we decided to keep it like this.<\/p>\n<p><img class=\"lazyload\" decoding=\"async\" src=\"data:image\/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20width%3D%271400%27%20height%3D%271636%27%20viewBox%3D%270%200%201400%201636%27%3E%3Crect%20width%3D%271400%27%20height%3D%271636%27%20fill-opacity%3D%220%22%2F%3E%3C%2Fsvg%3E\" data-orig-src=\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/circleci-jib.png\" alt=\"CircleCI - Jib\"><\/p>\n<p>With this configuration, we reduced our build time from 2-4 minutes to below 1 minute. A huge improvement when it comes to reducing waste in developer productivity.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Using Jib for building Spring Boot Docker images and pushing to Google Container Registry on CircleCI<\/p>\n","protected":false},"author":6,"featured_media":11452,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"cybocfi_hide_featured_image":"","footnotes":""},"categories":[104,102,106],"tags":[],"class_list":["post-11591","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ci-cd-en","category-delivery","category-google-cloud-en"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Jib, CircleCI and Google Container Registry &#8211; Predictly<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Jib, CircleCI and Google Container Registry &#8211; Predictly\" \/>\n<meta property=\"og:description\" content=\"Using Jib for building Spring Boot Docker images and pushing to Google Container Registry on CircleCI\" \/>\n<meta property=\"og:url\" content=\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/\" \/>\n<meta property=\"og:site_name\" content=\"Predictly\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/predictly.se\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-21T05:51:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-08T11:46:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/container_registry.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1429\" \/>\n\t<meta property=\"og:image:height\" content=\"888\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Patrik H\u00f6rlin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@predictly_se\" \/>\n<meta name=\"twitter:site\" content=\"@predictly_se\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Patrik H\u00f6rlin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/\"},\"author\":{\"name\":\"Patrik H\u00f6rlin\",\"@id\":\"https:\/\/predictly.se\/en\/#\/schema\/person\/57c5342be26b4569def7315855fa23c3\"},\"headline\":\"Jib, CircleCI and Google Container Registry\",\"datePublished\":\"2022-09-21T05:51:04+00:00\",\"dateModified\":\"2024-05-08T11:46:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/\"},\"wordCount\":926,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/predictly.se\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/container_registry.jpg\",\"articleSection\":[\"CI\/CD\",\"Delivery\",\"Google Cloud\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/\",\"url\":\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/\",\"name\":\"Jib, CircleCI and Google Container Registry &#8211; Predictly\",\"isPartOf\":{\"@id\":\"https:\/\/predictly.se\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/container_registry.jpg\",\"datePublished\":\"2022-09-21T05:51:04+00:00\",\"dateModified\":\"2024-05-08T11:46:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#primaryimage\",\"url\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/container_registry.jpg\",\"contentUrl\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/container_registry.jpg\",\"width\":1429,\"height\":888},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/predictly.se\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Okategoriserad\",\"item\":\"https:\/\/predictly.se\/en\/insikter\/okategoriserad\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Jib, CircleCI and Google Container Registry\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/predictly.se\/en\/#website\",\"url\":\"https:\/\/predictly.se\/en\/\",\"name\":\"Predictly\",\"description\":\"Professional IT services\",\"publisher\":{\"@id\":\"https:\/\/predictly.se\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/predictly.se\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/predictly.se\/en\/#organization\",\"name\":\"Predictly\",\"url\":\"https:\/\/predictly.se\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/predictly.se\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/10\/Logotype1-mobil.svg\",\"contentUrl\":\"https:\/\/predictly.se\/wp-content\/uploads\/2022\/10\/Logotype1-mobil.svg\",\"width\":532,\"height\":96,\"caption\":\"Predictly\"},\"image\":{\"@id\":\"https:\/\/predictly.se\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/predictly.se\",\"https:\/\/x.com\/predictly_se\",\"https:\/\/www.linkedin.com\/company\/predictly\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/predictly.se\/en\/#\/schema\/person\/57c5342be26b4569def7315855fa23c3\",\"name\":\"Patrik H\u00f6rlin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/predictly.se\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/60d93834b6a9c87c5625621e882e4a7c538383fb9323297804eb2473d122e9c8?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/60d93834b6a9c87c5625621e882e4a7c538383fb9323297804eb2473d122e9c8?s=96&d=mm&r=g\",\"caption\":\"Patrik H\u00f6rlin\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Jib, CircleCI and Google Container Registry &#8211; Predictly","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/","og_locale":"en_US","og_type":"article","og_title":"Jib, CircleCI and Google Container Registry &#8211; Predictly","og_description":"Using Jib for building Spring Boot Docker images and pushing to Google Container Registry on CircleCI","og_url":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/","og_site_name":"Predictly","article_publisher":"https:\/\/www.facebook.com\/predictly.se","article_published_time":"2022-09-21T05:51:04+00:00","article_modified_time":"2024-05-08T11:46:38+00:00","og_image":[{"width":1429,"height":888,"url":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/container_registry.jpg","type":"image\/jpeg"}],"author":"Patrik H\u00f6rlin","twitter_card":"summary_large_image","twitter_creator":"@predictly_se","twitter_site":"@predictly_se","twitter_misc":{"Written by":"Patrik H\u00f6rlin","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#article","isPartOf":{"@id":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/"},"author":{"name":"Patrik H\u00f6rlin","@id":"https:\/\/predictly.se\/en\/#\/schema\/person\/57c5342be26b4569def7315855fa23c3"},"headline":"Jib, CircleCI and Google Container Registry","datePublished":"2022-09-21T05:51:04+00:00","dateModified":"2024-05-08T11:46:38+00:00","mainEntityOfPage":{"@id":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/"},"wordCount":926,"commentCount":0,"publisher":{"@id":"https:\/\/predictly.se\/en\/#organization"},"image":{"@id":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#primaryimage"},"thumbnailUrl":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/container_registry.jpg","articleSection":["CI\/CD","Delivery","Google Cloud"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/","url":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/","name":"Jib, CircleCI and Google Container Registry &#8211; Predictly","isPartOf":{"@id":"https:\/\/predictly.se\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#primaryimage"},"image":{"@id":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#primaryimage"},"thumbnailUrl":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/container_registry.jpg","datePublished":"2022-09-21T05:51:04+00:00","dateModified":"2024-05-08T11:46:38+00:00","breadcrumb":{"@id":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#primaryimage","url":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/container_registry.jpg","contentUrl":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/09\/container_registry.jpg","width":1429,"height":888},{"@type":"BreadcrumbList","@id":"https:\/\/predictly.se\/en\/jib-circleci-and-google-container-registry\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/predictly.se\/en\/"},{"@type":"ListItem","position":2,"name":"Okategoriserad","item":"https:\/\/predictly.se\/en\/insikter\/okategoriserad\/"},{"@type":"ListItem","position":3,"name":"Jib, CircleCI and Google Container Registry"}]},{"@type":"WebSite","@id":"https:\/\/predictly.se\/en\/#website","url":"https:\/\/predictly.se\/en\/","name":"Predictly","description":"Professional IT services","publisher":{"@id":"https:\/\/predictly.se\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/predictly.se\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/predictly.se\/en\/#organization","name":"Predictly","url":"https:\/\/predictly.se\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/predictly.se\/en\/#\/schema\/logo\/image\/","url":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/10\/Logotype1-mobil.svg","contentUrl":"https:\/\/predictly.se\/wp-content\/uploads\/2022\/10\/Logotype1-mobil.svg","width":532,"height":96,"caption":"Predictly"},"image":{"@id":"https:\/\/predictly.se\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/predictly.se","https:\/\/x.com\/predictly_se","https:\/\/www.linkedin.com\/company\/predictly\/"]},{"@type":"Person","@id":"https:\/\/predictly.se\/en\/#\/schema\/person\/57c5342be26b4569def7315855fa23c3","name":"Patrik H\u00f6rlin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/predictly.se\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/60d93834b6a9c87c5625621e882e4a7c538383fb9323297804eb2473d122e9c8?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/60d93834b6a9c87c5625621e882e4a7c538383fb9323297804eb2473d122e9c8?s=96&d=mm&r=g","caption":"Patrik H\u00f6rlin"}}]}},"_links":{"self":[{"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/posts\/11591","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/comments?post=11591"}],"version-history":[{"count":1,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/posts\/11591\/revisions"}],"predecessor-version":[{"id":11603,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/posts\/11591\/revisions\/11603"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/media\/11452"}],"wp:attachment":[{"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/media?parent=11591"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/categories?post=11591"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/predictly.se\/en\/wp-json\/wp\/v2\/tags?post=11591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}