{"id":38,"date":"2024-10-11T22:35:54","date_gmt":"2024-10-11T20:35:54","guid":{"rendered":"https:\/\/typo3demosite.com\/?p=38"},"modified":"2025-02-13T00:28:25","modified_gmt":"2025-02-12T22:28:25","slug":"setting-up-self-hosted-bitbucket-ci-cd-pipeline-runner-in-rocky-linux-9","status":"publish","type":"post","link":"https:\/\/typo3demosite.com\/?p=38","title":{"rendered":"Setting up self-hosted Bitbucket CI\/CD pipeline runner in Rocky Linux 9"},"content":{"rendered":"\n<p>Recently, we automated the CI\/CD deployment for TYPO3 and Symfony projects using Bitbucket Runners. While this works well in many cases, it can be tricky if your destination machine is behind a firewall with strict SSH access rules. Sometimes, it feels like you need to open your server to half the internet just to get Bitbucket Runners working!<\/p>\n\n\n\n<p>Thankfully, Bitbucket provides a solution: self-hosted runners within your own infrastructure. Not only do they solve connectivity issues, but they can also help you save on subscription costs by using your own infrastructure.<\/p>\n\n\n\n<p>Let\u2019s walk through how to set them up.<\/p>\n\n\n\n<p>Bitbucket offers three ways to install a runner:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Linux in a Docker container<\/li>\n\n\n\n<li>Native Linux<\/li>\n\n\n\n<li>Native Windows<\/li>\n<\/ol>\n\n\n\n<p>While native installations (options 2 and 3) might be necessary for specific use cases, they come with some notable limitations. In our case, the Docker container option is the most suitable choice.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Requirements<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A <strong>64-Bit Linux instance<\/strong> with at least <strong>8GB of RAM<\/strong> as a host for the runner. But more is better. \ud83d\ude09 <br>We&#8217;ll set up 16GB and 4 virtual CPU cores VM<\/li>\n\n\n\n<li>Docker v19.03 and above<\/li>\n\n\n\n<li>At least minimum 512MB memory allocation for the runner container.<\/li>\n<\/ul>\n\n\n\n<p>Bitbucket recommends not using swap for runners. So, you&#8217;ll either need to disable swap on your system or set up a virtual machine without swap enabled.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setup Docker<\/h2>\n\n\n\n<p>At this stage, we already have Rocky Linux 9 installed and set up. Now, let\u2019s briefly cover the installation of Docker.<\/p>\n\n\n\n<p>The Docker package available in the official Rocky Linux 9 repository is not the latest version. To ensure you get the most up-to-date version, it&#8217;s best to install Docker from the official Docker repository. Here\u2019s how to do it.<\/p>\n\n\n\n<p>First, update the package database and add the official Docker repository. While Docker doesn&#8217;t provide a Rocky Linux-specific repository, Rocky Linux is based on CentOS, so you can use the CentOS repository for installation:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"dnf check-update; dnf config-manager --add-repo https:\/\/download.docker.com\/linux\/centos\/docker-ce.repo\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">dnf check-update; dnf config-manager --add-repo https:\/\/download.docker.com\/linux\/centos\/docker-ce.repo<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>With the repository added, install Docker:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"dnf install docker-ce docker-ce-cli containerd.io\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">dnf install docker-ce docker-ce-cli containerd.io<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>After the installation is complete, start the Docker daemon and enable it to run at system startup with the following command:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"systemctl enable --now docker\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">systemctl enable --now docker<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Installing the Runner Container<\/h2>\n\n\n\n<p>You can install runners that are either specific to a repository or available to all projects across a workspace.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>For <strong>Workspace Runners<\/strong>, go to:<br>Workspace settings &gt; <a href=\"https:\/\/bitbucket.org\/wisetiger\/workspace\/settings\/pipelines\/account-runners\" data-type=\"link\" data-id=\"https:\/\/bitbucket.org\/wisetiger\/workspace\/settings\/pipelines\/account-runners\">Workspace runners<\/a><\/li>\n\n\n\n<li>For <strong>Repository Runners<\/strong>, go to:<br>Repository settings &gt; Runners<\/li>\n<\/ul>\n\n\n\n<p>In the <strong>Runner installation<\/strong> dialog, under <strong>System and architecture<\/strong>, choose either <strong>Linux Docker (x86_64)<\/strong> or <strong>Linux Docker (arm64)<\/strong>, depending on your setup<\/p>\n\n\n\n<p>Use the pre-configured Docker command provided in the <strong>Run<\/strong> step of the Runner installation dialog to start the runner. Paste it into the shell but before running slightly modify it:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"docker container run -it <strong&gt;-d --restart unless-stopped<\/strong&gt; -v \/tmp:\/tmp -v \/var\/run\/docker.sock:\/var\/run\/docker.sock -v \/var\/lib\/docker\/containers:\/var\/lib\/docker\/containers:ro -e ACCOUNT_UUID={XXXX-XXXX-XXXX-XXXXX-XXXXX} -e REPOSITORY_UUID={XXXX-XXXX-XXXX-XXXXX-XXXXX} -e RUNNER_UUID={XXXX-XXXX-XXXX-XXXXX-XXXXX} -e RUNTIME_PREREQUISITES_ENABLED=true -e OAUTH_CLIENT_ID=XXXXX -e OAUTH_CLIENT_SECRET=XXXXX -e WORKING_DIRECTORY=\/tmp --name runner-XXXXX docker-public.packages.atlassian.com\/sox\/atlassian\/bitbucket-pipelines-runner\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">docker container run -it &lt;strong&gt;-d --restart unless-stopped&lt;\/strong&gt; -v \/tmp:\/tmp -v \/var\/run\/docker.sock:\/var\/run\/docker.sock -v \/var\/lib\/docker\/containers:\/var\/lib\/docker\/containers:ro -e ACCOUNT_UUID={XXXX-XXXX-XXXX-XXXXX-XXXXX} -e REPOSITORY_UUID={XXXX-XXXX-XXXX-XXXXX-XXXXX} -e RUNNER_UUID={XXXX-XXXX-XXXX-XXXXX-XXXXX} -e RUNTIME_PREREQUISITES_ENABLED=true -e OAUTH_CLIENT_ID=XXXXX -e OAUTH_CLIENT_SECRET=XXXXX -e WORKING_DIRECTORY=\/tmp --name runner-XXXXX docker-public.packages.atlassian.com\/sox\/atlassian\/bitbucket-pipelines-runner<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Options <strong>-d &#8211;restart unless-stopped<\/strong> will instruct Docker to auto start the container. <\/p>\n\n\n\n<p>If everything was set up correctly, you should see something like this on the <strong>Runners<\/strong> page in your Bitbucket settings:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"249\" src=\"https:\/\/typo3demosite.com\/wp-content\/uploads\/2024\/10\/image-1024x249.png\" alt=\"\" class=\"wp-image-44\" srcset=\"https:\/\/typo3demosite.com\/wp-content\/uploads\/2024\/10\/image-1024x249.png 1024w, https:\/\/typo3demosite.com\/wp-content\/uploads\/2024\/10\/image-300x73.png 300w, https:\/\/typo3demosite.com\/wp-content\/uploads\/2024\/10\/image-768x187.png 768w, https:\/\/typo3demosite.com\/wp-content\/uploads\/2024\/10\/image-1536x373.png 1536w, https:\/\/typo3demosite.com\/wp-content\/uploads\/2024\/10\/image.png 1884w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Update Pipeline to use our runner<\/h2>\n\n\n\n<p>The last remaining step is to setup your new runner in your bibelins. Just add the following line in your steps:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-blur-enabled\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);--cbp-line-highlight-color:rgba(201, 218, 248, 0.2);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"....\n  default:\n    - step:\n        name: Run Tests\n        runs-on: self.hosted\n        caches:\n          - composer\n....\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">...<\/span><span style=\"color: #B48EAD\">.<\/span><\/span>\n<span class=\"line cbp-no-blur\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #8FBCBB\">default<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line cbp-no-blur\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">step<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line cbp-no-blur\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #8FBCBB\">name<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">Run Tests<\/span><\/span>\n<span class=\"line cbp-line-highlight cbp-no-blur\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #8FBCBB\">runs-on<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">self.hosted<\/span><\/span>\n<span class=\"line cbp-no-blur\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #8FBCBB\">caches<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line cbp-no-blur\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #ECEFF4\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #A3BE8C\">composer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">...<\/span><span style=\"color: #B48EAD\">.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recently, we automated the CI\/CD deployment for TYPO3 and Symfony projects using Bitbucket Runners. While [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":37,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,10],"tags":[17,16,15,6],"class_list":["post-38","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","category-linux","tag-bitbucket","tag-ci-cd","tag-docker","tag-integration"],"_links":{"self":[{"href":"https:\/\/typo3demosite.com\/index.php?rest_route=\/wp\/v2\/posts\/38","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/typo3demosite.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/typo3demosite.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/typo3demosite.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/typo3demosite.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=38"}],"version-history":[{"count":7,"href":"https:\/\/typo3demosite.com\/index.php?rest_route=\/wp\/v2\/posts\/38\/revisions"}],"predecessor-version":[{"id":65,"href":"https:\/\/typo3demosite.com\/index.php?rest_route=\/wp\/v2\/posts\/38\/revisions\/65"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/typo3demosite.com\/index.php?rest_route=\/wp\/v2\/media\/37"}],"wp:attachment":[{"href":"https:\/\/typo3demosite.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=38"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/typo3demosite.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=38"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/typo3demosite.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=38"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}