{"id":1176,"date":"2022-01-04T16:50:40","date_gmt":"2022-01-04T23:50:40","guid":{"rendered":"https:\/\/bullyrooks.com\/?p=1176"},"modified":"2022-01-04T19:57:10","modified_gmt":"2022-01-05T02:57:10","slug":"cloud-kube-helm-initialization-and-chart-publishing","status":"publish","type":"post","link":"https:\/\/bullyrooks.com\/index.php\/2022\/01\/04\/cloud-kube-helm-initialization-and-chart-publishing\/","title":{"rendered":"Cloud Kube | Helm Initialization and Chart Publishing"},"content":{"rendered":"\n<p>Now that we&#8217;re producing versioned docker images into our registry lets get helm setup and publish versioned charts.  This will allow us to deploy fully configured services into kubernetes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Helm Init<\/h2>\n\n\n\n<p>I&#8217;m assuming that helm is already installed in your development environment, so I&#8217;m not going to cover installing it.  You will need it locally to initialize a helm chart.<\/p>\n\n\n\n<p>Create a new directory in the root of your application called <code>helm<\/code>.  From that directory type the following command<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ helm create cloud-application\nCreating cloud-application\n\n<\/code><\/pre>\n\n\n\n<p>Note, I&#8217;m using a hyphen instead of underscore so that I can have names that match helm conventions..  That should give you a bunch of directories and template yaml files<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"221\" height=\"304\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-23.png?resize=221%2C304&#038;ssl=1\" alt=\"\" class=\"wp-image-1177\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-23.png?w=221&amp;ssl=1 221w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-23.png?resize=218%2C300&amp;ssl=1 218w\" sizes=\"auto, (max-width: 221px) 100vw, 221px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>make the following updates<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>image:\n  repository: cloud.canister.io:5000\/bullyrooks\/cloud_application\n  pullPolicy: Always\n...\nimagePullSecrets:\n  - name: regcred\n...\nserviceAccount:\n  # Specifies whether a service account should be created\n  create: false\n...\nservice:\n  type: NodePort\n  port: 8080\n  targetPort: 8080\n\nport:\n  containerPort: 8080\n\n<\/code><\/pre>\n\n\n\n<p>Here&#8217;s what we&#8217;re doing:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Telling the helm chart where to find our docker image.  Always pull the image.<\/li><li>imagePullSecrets tells helm where to find the credentials to log into the docker registry.  We&#8217;ll create this secret later.<\/li><li>serviceAccount create false means don&#8217;t create a service account.  Where we&#8217;re deploying we&#8217;ll have limited access.<\/li><li>service configuration will be overwritten by our hosting platform using an ingress, so we&#8217;ll leave it as nodeport for now.<\/li><li>we&#8217;re going to need to tell the container which port our app is running on so we define it here<\/li><\/ul>\n\n\n\n<p>In <code>deployment.yaml<\/code> make the following changes.  Essentially, comment out liveness and readiness probes.  Although these are useful, we&#8217;ll come back to them once we have actuator setup.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>          ports:\n            - name: http\n              containerPort: {{ .Values.port.containerPort }}\n              protocol: TCP\n{{\/*          livenessProbe:*\/}}\n{{\/*            httpGet:*\/}}\n{{\/*              path: \/*\/}}\n{{\/*              port: http*\/}}\n{{\/*          readinessProbe:*\/}}\n{{\/*            httpGet:*\/}}\n{{\/*              path: \/*\/}}\n{{\/*              port: http*\/}}<\/code><\/pre>\n\n\n\n<p>create a <code>role.yaml<\/code> in <code>templates <\/code>with this content<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kind: Role\napiVersion: rbac.authorization.k8s.io\/v1\nmetadata:\n  name: {{ include \"cloud-application.fullname\" . }}-reader-role\nrules:\n  - apiGroups: &#91;\"\"]\n    resources: &#91;\"configmaps\", \"pods\", \"services\", \"endpoints\", \"secrets\"]\n    verbs: &#91;\"get\", \"list\", \"watch\"]\n<\/code><\/pre>\n\n\n\n<p>Give access to our service to access all of the components it will need access to.<\/p>\n\n\n\n<p>Create a <code>rolebinding.yaml<\/code> in <code>templates <\/code>with this content<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>kind: RoleBinding\napiVersion: rbac.authorization.k8s.io\/v1\nmetadata:\n  name: {{ include \"cloud-application.fullname\" . }}-reader-role-binding\nsubjects:\n  - kind: ServiceAccount\n    name: {{ include \"cloud-application.serviceAccountName\" . }}\n    apiGroup: \"\"\nroleRef:\n  kind: Role\n  name: {{ include \"cloud-application.fullname\" . }}-reader-role\n  apiGroup: \"\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Setup Chart Repo in Github<\/h2>\n\n\n\n<p>We&#8217;re going to mostly <a href=\"https:\/\/harness.io\/blog\/helm-chart-repo\/\">follow the directions here<\/a>.  However, <a href=\"https:\/\/tech.paulcz.net\/blog\/creating-a-helm-chart-monorepo-part-1\/\">this one<\/a> has a bit more detail.<\/p>\n\n\n\n<p>Create a new github repo: <code>helm-charts<\/code><\/p>\n\n\n\n<p>Create a new branch called <code>gh-charts<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"273\" height=\"234\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-24.png?resize=273%2C234&#038;ssl=1\" alt=\"\" class=\"wp-image-1178\" data-recalc-dims=\"1\"\/><\/figure>\n\n\n\n<p>Go to <code>Settings\/Pages<\/code> change the branch to <code>gh-charts<\/code> and hit save<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"741\" height=\"651\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-25.png?resize=741%2C651&#038;ssl=1\" alt=\"\" class=\"wp-image-1179\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-25.png?w=741&amp;ssl=1 741w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-25.png?resize=300%2C264&amp;ssl=1 300w\" sizes=\"auto, (max-width: 741px) 100vw, 741px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Configure Helm Publish Plugin<\/h2>\n\n\n\n<p>I use a different <a href=\"https:\/\/github.com\/stefanprodan\/helm-gh-pages\">github action plugin<\/a> though because I want to publish app and chart versions that I&#8217;m generating.  His medium article <a href=\"https:\/\/medium.com\/@stefanprodan\/automate-helm-chart-repository-publishing-with-github-actions-and-pages-8a374ce24cf4\">is here<\/a>.<\/p>\n\n\n\n<p>But essentially, we&#8217;re going to add this code to the end of the main.yaml github action workflow.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      - name: Publish Helm chart\n        uses: stefanprodan\/helm-gh-pages@master\n        with:\n          token: ${{ secrets.CHART_TOKEN }}\n          charts_dir: helm\n          charts_url: https:\/\/opportunitygopher.github.io\/og-charts\/\n          repository: og-charts\n          branch: gh-pages\n          app_version: ${{ env.VERSION }}\n          chart_version: ${{ env.VERSION }}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Setup Access Token<\/h2>\n\n\n\n<p>You&#8217;ll need to create an api key (<code>CHART_TOKEN<\/code>) which will allow github actions to act on your behalf.  Go into your <em>user<\/em> settings<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"184\" height=\"445\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-26.png?resize=184%2C445&#038;ssl=1\" alt=\"\" class=\"wp-image-1180\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-26.png?w=184&amp;ssl=1 184w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-26.png?resize=124%2C300&amp;ssl=1 124w\" sizes=\"auto, (max-width: 184px) 100vw, 184px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Then <code>Developer Setting<\/code>s, then <code>Personal access tokens<\/code>.  Click <code>Generate new token<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"693\" height=\"64\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-27.png?resize=693%2C64&#038;ssl=1\" alt=\"\" class=\"wp-image-1181\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-27.png?w=693&amp;ssl=1 693w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-27.png?resize=300%2C28&amp;ssl=1 300w\" sizes=\"auto, (max-width: 693px) 100vw, 693px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>I change to no expiration and full repo access.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"683\" height=\"556\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-28.png?resize=683%2C556&#038;ssl=1\" alt=\"\" class=\"wp-image-1182\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-28.png?w=683&amp;ssl=1 683w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-28.png?resize=300%2C244&amp;ssl=1 300w\" sizes=\"auto, (max-width: 683px) 100vw, 683px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>When you hit generate, copy the token that is displayed.  Save it somewhere.<\/p>\n\n\n\n<p>Go to your <code>cloud_application<\/code> settings\/secrets page.  Create a New repository secret called <code>CHART_TOKEN<\/code> with the value of your token<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"566\" height=\"185\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-29.png?resize=566%2C185&#038;ssl=1\" alt=\"\" class=\"wp-image-1183\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-29.png?w=566&amp;ssl=1 566w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-29.png?resize=300%2C98&amp;ssl=1 300w\" sizes=\"auto, (max-width: 566px) 100vw, 566px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Publish the Chart Repo<\/h2>\n\n\n\n<p>All we have to do now is push these changes up into <code>main<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ git add . \n\n$ git commit -m \"helm chart\"\n&#91;main b20f32e] helm chart\n 14 files changed, 437 insertions(+), 1 deletion(-)\n create mode 100644 helm\/cloud-application\/.helmignore\n create mode 100644 helm\/cloud-application\/Chart.yaml\n create mode 100644 helm\/cloud-application\/templates\/NOTES.txt\n create mode 100644 helm\/cloud-application\/templates\/_helpers.tpl\n create mode 100644 helm\/cloud-application\/templates\/deployment.yaml\n create mode 100644 helm\/cloud-application\/templates\/hpa.yaml\n create mode 100644 helm\/cloud-application\/templates\/ingress.yaml\n create mode 100644 helm\/cloud-application\/templates\/role.yaml\n create mode 100644 helm\/cloud-application\/templates\/rolebinding.yaml\n create mode 100644 helm\/cloud-application\/templates\/service.yaml\n create mode 100644 helm\/cloud-application\/templates\/serviceaccount.yaml\n create mode 100644 helm\/cloud-application\/templates\/tests\/test-connection.yaml\n create mode 100644 helm\/cloud-application\/values.yaml\n\n$ git push\nEnumerating objects: 26, done.\nCounting objects: 100% (26\/26), done.\nDelta compression using up to 4 threads\nCompressing objects: 100% (19\/19), done.\nWriting objects: 100% (22\/22), 6.49 KiB | 1.62 MiB\/s, done.\nTotal 22 (delta 2), reused 0 (delta 0), pack-reused 0\nremote: Resolving deltas: 100% (2\/2), completed with 2 local objects.\nTo github.com-bullyrook:bullyrooks\/cloud_application.git\n   a060e27..b20f32e  main -&gt; main\n<\/code><\/pre>\n\n\n\n<p>We should see our new task getting executed from the github actions screen<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Found chart directory helm\/cloud-application\n==&gt; Linting helm\/cloud-application\n&#91;INFO] Chart.yaml: icon is recommended\n\n1 chart(s) linted, 0 chart(s) failed\nSuccessfully packaged chart and saved it to: \/tmp\/tmp.Mnhdph\/cloud-application-1.0.3.tgz\nCloning into 'helm-charts'...\nBranch 'gh-charts' set up to track remote branch 'gh-charts' from 'origin'.\nSwitched to a new branch 'gh-charts'\nNo index found, generating a new one\n&#91;gh-charts cfeabb6] Publish cloud-application-1.0.3.tgz\n 2 files changed, 14 insertions(+)\n create mode 100644 cloud-application-1.0.3.tgz\n create mode 100644 index.yaml\nTo https:\/\/github.com\/***\/helm-charts\n   e267136..cfeabb6  gh-charts -&gt; gh-charts<\/code><\/pre>\n\n\n\n<p>and we should see the tarball and index updated in the chart github repo<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"858\" height=\"391\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-30.png?resize=858%2C391&#038;ssl=1\" alt=\"\" class=\"wp-image-1185\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-30.png?w=858&amp;ssl=1 858w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-30.png?resize=300%2C137&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-30.png?resize=768%2C350&amp;ssl=1 768w\" sizes=\"auto, (max-width: 858px) 100vw, 858px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Most importantly, the service chart version will match the image tag version and both will be available in our helm chart.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"entry-summary\">\nNow that we&#8217;re producing versioned docker images into our registry lets get&hellip;\n<\/div>\n<div class=\"link-more\"><a href=\"https:\/\/bullyrooks.com\/index.php\/2022\/01\/04\/cloud-kube-helm-initialization-and-chart-publishing\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &ldquo;Cloud Kube | Helm Initialization and Chart Publishing&rdquo;<\/span>&hellip;<\/a><\/div>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[152,79,81,55],"course":[149],"class_list":["post-1176","post","type-post","status-publish","format-standard","hentry","category-software-development","tag-chart-repository","tag-helm","tag-helm-chart","tag-microservice","course-kubernetes-application-hosted-in-the-cloud","entry"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":823,"url":"https:\/\/bullyrooks.com\/index.php\/2020\/03\/30\/simple-spring-boot-service-to-kubernetes-application-step-21-6986a29db37a\/","url_meta":{"origin":1176,"position":0},"title":"Simplify Deployment","author":"Bullyrook","date":"March 30, 2020","format":false,"excerpt":"Now that we have multiple components lets simplify our deployment so that we can deploy our complete application in one step. Create an Umbrella\u00a0Chart Create a new git repository called medium-application. This is the repository that will house the helm umbrella chart. Create a directory called helm and run helm\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1188,"url":"https:\/\/bullyrooks.com\/index.php\/2022\/01\/04\/cloud-kube-setup-cloud-hosting\/","url_meta":{"origin":1176,"position":1},"title":"Cloud Kube | Setup Cloud Hosting","author":"Bullyrook","date":"January 4, 2022","format":false,"excerpt":"We've got a helm chart and associated docker image. Now we're going to setup a cloud kubernetes provider to deploy our application to. Okteto offers a very generous kubernetes hosting platform that's free for small developer projects. Setup Okteto First register on okteto by creating an account via your github\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-31.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-31.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-31.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":818,"url":"https:\/\/bullyrooks.com\/index.php\/2020\/03\/30\/simple-spring-boot-service-to-kubernetes-application-step-19-944a76415384\/","url_meta":{"origin":1176,"position":2},"title":"Put the UI in to Helm","author":"Bullyrook","date":"March 30, 2020","format":false,"excerpt":"Lets take the docker image we just created and wrap it with helm so that we have an easy way to deploy our application. Create Helm Chart Templates We\u2019ve created helm charts before, so lets create a helm directory at the frontend root. Then run helm create in that directory\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":836,"url":"https:\/\/bullyrooks.com\/index.php\/2020\/03\/30\/simple-spring-boot-service-to-kubernetes-application-step-11-636b842a3c0f\/","url_meta":{"origin":1176,"position":3},"title":"Helm for Deployment","author":"Bullyrook","date":"March 30, 2020","format":false,"excerpt":"We\u2019re about ready to deploy into kubernetes. However, deployment is not exactly straightforward. There are a lot of configuration files that we need to create and maintain in order to explain to the container management system how to deploy our application. We can use tools like kubectl to promote these\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":822,"url":"https:\/\/bullyrooks.com\/index.php\/2020\/03\/30\/simple-spring-boot-service-to-kubernetes-application-step-13-c3d437bb7570\/","url_meta":{"origin":1176,"position":4},"title":"Automating Deployment (for CICD)","author":"Bullyrook","date":"March 30, 2020","format":false,"excerpt":"Now that we\u2019ve deployed our application, lets reduce some of the manual steps and make our deployments more reproducible with the intent of eventually making them automated for CI\/CD. Publish our Chart to the Chart Repository Normally, we would need to create a helm chart repository, however, codefresh has given\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1205,"url":"https:\/\/bullyrooks.com\/index.php\/2022\/01\/04\/kube-cloud-automate-kube-deploy\/","url_meta":{"origin":1176,"position":5},"title":"Kube Cloud | Automate Kube Deploy","author":"Bullyrook","date":"January 4, 2022","format":false,"excerpt":"Lets improve our CD pipeline by automating deployment. Update Build Pipeline I only want main to deploy on successful build. So add these lines to the end of the main.yaml github action workflow - name: Deploy uses: WyriHaximus\/github-action-helm3@v2 with: exec: | helm repo add bullyrooks https:\/\/bullyrooks.github.io\/helm-charts\/ helm repo update helm\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-36.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-36.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2022\/01\/image-36.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1176","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/comments?post=1176"}],"version-history":[{"count":5,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1176\/revisions"}],"predecessor-version":[{"id":1197,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1176\/revisions\/1197"}],"wp:attachment":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/media?parent=1176"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/categories?post=1176"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/tags?post=1176"},{"taxonomy":"course","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/course?post=1176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}