{"id":9010,"date":"2024-09-27T03:16:10","date_gmt":"2024-09-26T21:46:10","guid":{"rendered":"https:\/\/www.satup.xyz\/index.php\/2024\/09\/27\/introducing-new-github-actions-for-app-platform\/"},"modified":"2024-09-27T03:16:10","modified_gmt":"2024-09-26T21:46:10","slug":"introducing-new-github-actions-for-app-platform","status":"publish","type":"post","link":"https:\/\/www.satup.xyz\/index.php\/2024\/09\/27\/introducing-new-github-actions-for-app-platform\/","title":{"rendered":"Introducing new GitHub Actions for App Platform"},"content":{"rendered":"<p><br \/>\n<\/p>\n<div>\n<p>GitHub Actions is the CI\/CD platform our customers use the most for building and deploying their code. In the past, we\u2019ve provided a supported action, called app_action, that could be used to update an App that already exists via a GitHub Action.<\/p>\n<p>Today, we\u2019re excited to introduce completely overhauled GitHub Actions for App Platform with improved pluggability to cater to all of the deployment needs you might think of.<\/p>\n<p>The new <strong>deploy<\/strong> action is the heart of our GitHub Actions ecosystem. Like the old one, it allows you to update an app that already exists. However, it also does much more than that: It also allows you to completely make the respective GitHub repository the source of truth in a GitOps-style fashion. Now, you can commit an AppSpec to your GitHub repository and handle the entire deployment process via GitHub Actions. It is no longer necessary to interact with DigitalOcean directly at all (apart from generating the token for the action to use).<\/p>\n<p>The in-repository AppSpec can also contain environment variable placeholders that will be replaced before deploying the new spec. This can be used to update image references on the fly or to manage your secrets via Github\u2019s secret mechanism.<\/p>\n<p>We\u2019ve also used the opportunity to provide more integration into the GitHub Actions ecosystem. The deploy action outputs the resulting app metadata and the build and deployment logs from the deployment that took place. Optionally, those logs are also logged in the action\u2019s output itself. That metadata can be used to create rich integrations with App Platform, tailored to your specific needs.<\/p>\n<h3 id=\"deploy-an-app-from-github\"><a href=\"#deploy-an-app-from-github\" onclick=\"navigator.clipboard.writeText(this.href);\">Deploy an app from GitHub<\/a><a class=\"hash-anchor\" href=\"#deploy-an-app-from-github\" aria-hidden=\"true\" onclick=\"navigator.clipboard.writeText(this.href);\"\/><\/h3>\n<p>To deploy an app purely from GitHub without needing to create it out of band first is as simple as committing the respective App Spec to the repository (the action defaults to <code>.do\/app.yaml<\/code>) and setup an action like below. This will cause the app to redeploy whenever a new commit is pushed to main (note that <code>deploy_on_push<\/code> should be turned off in the App Spec for that matter). Any changes to the App Spec itself would also be applied.<\/p>\n<pre class=\"language-yaml\"><code><span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Update App\n\n<span class=\"token key atrule\">on<\/span><span class=\"token punctuation\">:<\/span>\n  <span class=\"token key atrule\">push<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token key atrule\">branches<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span>main<span class=\"token punctuation\">]<\/span>\n    \n<span class=\"token key atrule\">permissions<\/span><span class=\"token punctuation\">:<\/span>\n  <span class=\"token key atrule\">contents<\/span><span class=\"token punctuation\">:<\/span> read\n\n<span class=\"token key atrule\">jobs<\/span><span class=\"token punctuation\">:<\/span>\n  <span class=\"token key atrule\">deploy-app<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token key atrule\">runs-on<\/span><span class=\"token punctuation\">:<\/span> ubuntu<span class=\"token punctuation\">-<\/span>latest\n    <span class=\"token key atrule\">steps<\/span><span class=\"token punctuation\">:<\/span>\n      <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Checkout repository\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> actions\/checkout@v4\n      <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Deploy the app\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> digitalocean\/app_action\/deploy@v2\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span>\n          <span class=\"token key atrule\">token<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> secrets.DIGITALOCEAN_ACCESS_TOKEN <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<h3 id=\"deploy-an-app-from-an-image-built-in-the-github-action\"><a href=\"#deploy-an-app-from-an-image-built-in-the-github-action\" onclick=\"navigator.clipboard.writeText(this.href);\">Deploy an app from an image built in the GitHub Action<\/a><a class=\"hash-anchor\" href=\"#deploy-an-app-from-an-image-built-in-the-github-action\" aria-hidden=\"true\" onclick=\"navigator.clipboard.writeText(this.href);\"\/><\/h3>\n<p>As a slightly more involved use-case, the below action builds an app from a Dockerfile in the repository inside the GitHub Action, not as part of the App Platform build. That image is then deployed <strong>by digest<\/strong> to ensure that <strong>this exact<\/strong> image is what\u2019s being deployed as part of the app.<\/p>\n<p>Note that the image digest is provided as the <code>SAMPLE_DIGEST<\/code> environment variable here. That\u2019ll have to be referenced in the App Spec with the <code>${SAMPLE_DIGEST}<\/code> notation.<\/p>\n<pre class=\"language-yaml\"><code><span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Build<span class=\"token punctuation\">,<\/span> Push and Deploy a Docker Image\n\n<span class=\"token key atrule\">on<\/span><span class=\"token punctuation\">:<\/span>\n  <span class=\"token key atrule\">push<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token key atrule\">branches<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span>main<span class=\"token punctuation\">]<\/span>\n\n<span class=\"token key atrule\">permissions<\/span><span class=\"token punctuation\">:<\/span>\n  <span class=\"token key atrule\">contents<\/span><span class=\"token punctuation\">:<\/span> read\n  <span class=\"token key atrule\">packages<\/span><span class=\"token punctuation\">:<\/span> write\n\n<span class=\"token key atrule\">jobs<\/span><span class=\"token punctuation\">:<\/span>\n  <span class=\"token key atrule\">build-push-deploy-image<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token key atrule\">runs-on<\/span><span class=\"token punctuation\">:<\/span> ubuntu<span class=\"token punctuation\">-<\/span>latest\n    <span class=\"token key atrule\">steps<\/span><span class=\"token punctuation\">:<\/span>\n      <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Checkout repository\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> actions\/checkout@v4\n      <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Log in to the Container registry\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> docker\/login<span class=\"token punctuation\">-<\/span>action@v3.3.0\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span>\n          <span class=\"token key atrule\">registry<\/span><span class=\"token punctuation\">:<\/span> ghcr.io\n          <span class=\"token key atrule\">username<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> github.actor <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span>\n          <span class=\"token key atrule\">password<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> secrets.GITHUB_TOKEN <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span>\n      <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Build and push Docker image\n        <span class=\"token key atrule\">id<\/span><span class=\"token punctuation\">:<\/span> push\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> docker\/build<span class=\"token punctuation\">-<\/span>push<span class=\"token punctuation\">-<\/span>action@v6.5.0\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span>\n          <span class=\"token key atrule\">context<\/span><span class=\"token punctuation\">:<\/span> .\n          <span class=\"token key atrule\">push<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token boolean important\">true<\/span>\n          <span class=\"token key atrule\">tags<\/span><span class=\"token punctuation\">:<\/span> ghcr.io\/$<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> github.repository <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">:<\/span>latest\n      <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Deploy the app\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> digitalocean\/app_action\/deploy@v2\n        <span class=\"token key atrule\">env<\/span><span class=\"token punctuation\">:<\/span>\n          <span class=\"token key atrule\">SAMPLE_DIGEST<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> steps.push.outputs.digest <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span>\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span>\n          <span class=\"token key atrule\">token<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> secrets.DIGITALOCEAN_ACCESS_TOKEN <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<p>Note that the image digest is provided as the <code>SAMPLE_DIGEST<\/code> environment variable here. That\u2019ll have to be referenced in the App Spec with the <code>${SAMPLE_DIGEST}<\/code> notation like so.<\/p>\n<pre class=\"language-yaml\"><code><span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> sample\n\n<span class=\"token key atrule\">services<\/span><span class=\"token punctuation\">:<\/span>\n<span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> sample\n <span class=\"token key atrule\">image<\/span><span class=\"token punctuation\">:<\/span>\n   <span class=\"token key atrule\">registry_type<\/span><span class=\"token punctuation\">:<\/span> GHCR\n   <span class=\"token key atrule\">registry<\/span><span class=\"token punctuation\">:<\/span> YOUR_ORG\n   <span class=\"token key atrule\">repository<\/span><span class=\"token punctuation\">:<\/span> YOUR_REPO\n   <span class=\"token key atrule\">digest<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span>SAMPLE_DIGEST<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<h3 id=\"pull-request-previews\"><a href=\"#pull-request-previews\" onclick=\"navigator.clipboard.writeText(this.href);\">Pull request previews<\/a><a class=\"hash-anchor\" href=\"#pull-request-previews\" aria-hidden=\"true\" onclick=\"navigator.clipboard.writeText(this.href);\"\/><\/h3>\n<p>And lastly, pull request previews is a great example of the power of orchestratability. This feature allows you to deploy a new app for every pull request and surface the respective live URL [1] and the respective build [2] and deployment [3] logs to the pull request author, avoiding merging code that breaks the app in production.<\/p>\n<p>With the new deploy action, creating such an integration in your repository becomes trivial. It comes with a specialized \u201cPR-preview-mode\u201d, which generates a unique app name for each pull request, sanitizes the app spec of potentially conflicting resources (for example, it drops domains and alerts), and updates all potential GitHub references to point to the respective PR\u2019s branch.<\/p>\n<p>Conversely, there\u2019s also a new delete action, that allows you to delete apps again. Usually, this is done when a pull request is closed or merged to clean up resources.<\/p>\n<p>Equipped with that, you can imagine an action like the below, which will deploy an app per pull request and upon successful deployment, will post a comment to the pull request with a link to the app. On failure, it will post a link to the action\u2019s logs and collapsible sections for build and deploy logs respectively for quick debugging. The second action will make sure that the respective app is deleted when the pull request closes or is merged.<\/p>\n<pre class=\"language-yaml\"><code><span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> App Platform Preview\n\n<span class=\"token key atrule\">on<\/span><span class=\"token punctuation\">:<\/span>\n  <span class=\"token key atrule\">pull_request<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token key atrule\">branches<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span>main<span class=\"token punctuation\">]<\/span>\n\n<span class=\"token key atrule\">permissions<\/span><span class=\"token punctuation\">:<\/span>\n  <span class=\"token key atrule\">contents<\/span><span class=\"token punctuation\">:<\/span> read\n  <span class=\"token key atrule\">pull-requests<\/span><span class=\"token punctuation\">:<\/span> write\n\n<span class=\"token key atrule\">jobs<\/span><span class=\"token punctuation\">:<\/span>\n  <span class=\"token key atrule\">test<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> preview\n    <span class=\"token key atrule\">runs-on<\/span><span class=\"token punctuation\">:<\/span> ubuntu<span class=\"token punctuation\">-<\/span>latest\n    <span class=\"token key atrule\">steps<\/span><span class=\"token punctuation\">:<\/span>\n      <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Checkout repository\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> actions\/checkout@v4\n      <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Deploy the app\n        <span class=\"token key atrule\">id<\/span><span class=\"token punctuation\">:<\/span> deploy\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> digitalocean\/app_action\/deploy@v2\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span>\n          <span class=\"token key atrule\">deploy_pr_preview<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"true\"<\/span>\n          <span class=\"token key atrule\">token<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> secrets.DIGITALOCEAN_ACCESS_TOKEN <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span>\n      <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> actions\/github<span class=\"token punctuation\">-<\/span>script@v7\n        <span class=\"token key atrule\">env<\/span><span class=\"token punctuation\">:<\/span>\n          <span class=\"token key atrule\">BUILD_LOGS<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> steps.deploy.outputs.build_logs <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span>\n          <span class=\"token key atrule\">DEPLOY_LOGS<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> steps.deploy.outputs.deploy_logs <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span>\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span>\n          <span class=\"token key atrule\">script<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">|<\/span><span class=\"token scalar string\">\n            const { BUILD_LOGS, DEPLOY_LOGS } = process.env\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: `:rocket: :rocket: :rocket: The app was successfully deployed at ${{ fromJson(steps.deploy.outputs.app).live_url }}.`\n            })<\/span>\n      <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> actions\/github<span class=\"token punctuation\">-<\/span>script@v7\n        <span class=\"token key atrule\">if<\/span><span class=\"token punctuation\">:<\/span> failure()\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span>\n          <span class=\"token key atrule\">script<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">|<\/span><span class=\"token scalar string\">\n            github.rest.issues.createComment({\n              issue_number: context.issue.number,\n              owner: context.repo.owner,\n              repo: context.repo.repo,\n              body: `The app failed to be deployed. Logs can be found [here](https:\/\/github.com\/${{ github.repository }}\/actions\/runs\/${{ github.run_id }}).<\/span>\n\n              <span class=\"token comment\">## Logs<\/span>\n              <details class=\"token punctuation\">&gt;\n              <summary class=\"token punctuation\">&gt;Build logs<\/summary>&gt;\n              \n              \\`\\`\\`\n              $<span class=\"token punctuation\">{<\/span>BUILD_LOGS<span class=\"token punctuation\">}<\/span>\n              \\`\\`\\`\n              <\/details>&gt;\n              \n              <details class=\"token punctuation\">&gt;\n              <summary class=\"token punctuation\">&gt;Deploy logs<\/summary>&gt;\n\n              \\`\\`\\`\n              $<span class=\"token punctuation\">{<\/span>DEPLOY_LOGS<span class=\"token punctuation\">}<\/span>\n              \\`\\`\\`\n              <\/details>&gt;`\n            <span class=\"token punctuation\">}<\/span>)\n<\/code><\/pre>\n<pre class=\"language-yaml\"><code><span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> Delete Preview\n\n<span class=\"token key atrule\">on<\/span><span class=\"token punctuation\">:<\/span>\n  <span class=\"token key atrule\">pull_request<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token key atrule\">types<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span> closed <span class=\"token punctuation\">]<\/span>\n\n<span class=\"token key atrule\">jobs<\/span><span class=\"token punctuation\">:<\/span>\n  <span class=\"token key atrule\">closed<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token key atrule\">runs-on<\/span><span class=\"token punctuation\">:<\/span> ubuntu<span class=\"token punctuation\">-<\/span>latest\n    <span class=\"token key atrule\">steps<\/span><span class=\"token punctuation\">:<\/span>\n      <span class=\"token punctuation\">-<\/span> <span class=\"token key atrule\">name<\/span><span class=\"token punctuation\">:<\/span> delete preview app\n        <span class=\"token key atrule\">uses<\/span><span class=\"token punctuation\">:<\/span> digitalocean\/app_action\/delete@v2\n        <span class=\"token key atrule\">with<\/span><span class=\"token punctuation\">:<\/span>\n          <span class=\"token key atrule\">from_pr_preview<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"true\"<\/span>\n          <span class=\"token key atrule\">ignore_not_found<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"true\"<\/span>\n          <span class=\"token key atrule\">token<\/span><span class=\"token punctuation\">:<\/span> $<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">{<\/span> secrets.DIGITALOCEAN_ACCESS_TOKEN <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<p>You can find the code and documentation at <a href=\"https:\/\/github.com\/digitalocean\/app_action\" rel=\"ugc nofollow noopener\" target=\"_blank\">the app_action GitHub repository<\/a>. We\u2019re excited to see what kind of an integration you can come up with! Give the new actions a try and bring your app platform deployments to the next level.<\/p>\n<\/div>\n<p><br \/>\n<br \/><a href=\"https:\/\/www.digitalocean.com\/blog\/github-actions-for-app-platform\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>GitHub Actions is the CI\/CD platform our customers use the most for building and deploying their code. In the past, we\u2019ve provided a supported action, called app_action, that could be used to update an App that already exists via a GitHub Action. Today, we\u2019re excited to introduce completely overhauled GitHub Actions for App Platform with [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":9011,"comment_status":"","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[16],"tags":[],"class_list":["post-9010","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-app-developer"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.satup.xyz\/index.php\/wp-json\/wp\/v2\/posts\/9010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.satup.xyz\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.satup.xyz\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.satup.xyz\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.satup.xyz\/index.php\/wp-json\/wp\/v2\/comments?post=9010"}],"version-history":[{"count":0,"href":"https:\/\/www.satup.xyz\/index.php\/wp-json\/wp\/v2\/posts\/9010\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.satup.xyz\/index.php\/wp-json\/wp\/v2\/media\/9011"}],"wp:attachment":[{"href":"https:\/\/www.satup.xyz\/index.php\/wp-json\/wp\/v2\/media?parent=9010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.satup.xyz\/index.php\/wp-json\/wp\/v2\/categories?post=9010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.satup.xyz\/index.php\/wp-json\/wp\/v2\/tags?post=9010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}