{"id":69851,"date":"2023-02-02T10:03:36","date_gmt":"2023-02-02T18:03:36","guid":{"rendered":"https:\/\/github.blog\/?p=69851"},"modified":"2023-02-03T05:53:53","modified_gmt":"2023-02-03T13:53:53","slug":"enabling-branch-deployments-through-issueops-with-github-actions","status":"publish","type":"post","link":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/","title":{"rendered":"Enabling branch deployments through IssueOps with GitHub Actions"},"content":{"rendered":"<p>At GitHub, the branch deploy model is ubiquitous and it is the standard way we ship code to production, and it has been for years. We released details about how we perform branch deployments with ChatOps all the way back in <a href=\"https:\/\/github.blog\/2015-06-02-deploying-branches-to-github-com\/\">2015<\/a>.<\/p>\n<p>We are able to use ChatOps to perform branch deployments for most of our repositories, but there are a few situations where ChatOps simply won&#8217;t work for us. What if developers want to leverage branch deployments but don&#8217;t have a full ChatOps stack integrated with their repositories? We wanted to set out to find a way for all developers to be able to take advantage of branch deployments with ease, right from their GitHub repository, and so the branch-deploy Action was born!<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/github.blog\/wp-content\/uploads\/2023\/02\/usage.gif\" alt=\"Gif demonstrating how to us the branch-deploy Action.\"\/><\/p>\n<h2 id=\"how-does-github-use-this-action\"><a class=\"heading-link\" href=\"#how-does-github-use-this-action\">How Does GitHub use this Action?<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h2>\n<p>GitHub primarily uses ChatOps with <a href=\"https:\/\/hubot.github.com\/\">Hubot<\/a> to facilitate branch deployments where we can. If ChatOps isn&#8217;t an option, we use this branch-deploy Action instead. The majority of our use cases include Infrastructure as Code (IaC) repositories where we use Terraform to deploy infrastructure changes. GitHub uses this Action in many internal repositories and so does <a href=\"https:\/\/www.npmjs.com\/\">npm<\/a>. There are also many other public, open source, and corporate organizations adopting this Action, as well, to help ship their code to production!<\/p>\n<h2 id=\"understanding-the-branch-deploy-model\"><a class=\"heading-link\" href=\"#understanding-the-branch-deploy-model\">Understanding the branch deploy model<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h2>\n<p>Before we dive into the branch-deploy Action, let&#8217;s first understand what the branch deploy model is and why it is so useful.<\/p>\n<p>To really understand the branch deploy model, let&#8217;s first take a look at a traditional <strong>deploy \u2192 merge<\/strong> model. It goes like this:<\/p>\n<ol>\n<li>Create a branch.<\/li>\n<li>Add commits to your branch.<\/li>\n<li>Open a pull request.<\/li>\n<li>Gather feedback plus peer reviews.<\/li>\n<li>Merge your branch.<\/li>\n<li>A deployment starts from the <code>main<\/code> branch.<\/li>\n<\/ol>\n<div class=\"image-frame image-frame-full border rounded-2 overflow-hidden d-flex flex-row flex-justify-center\" style=\"background: #EAEEF2\"><br \/>\n<img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/github.blog\/wp-content\/uploads\/2023\/02\/merge-deploy.jpg?w=720&#038;resize=720%2C237\" alt=\"Diagram outlining the steps of the traditional deploy model, enumerated in the numbered list above.\" width=\"720\" height=\"237\" class=\"aligncenter size-large wp-image-69854 width-fit\" srcset=\"https:\/\/github.blog\/wp-content\/uploads\/2023\/02\/merge-deploy.jpg?w=720 720w, https:\/\/github.blog\/wp-content\/uploads\/2023\/02\/merge-deploy.jpg?w=300 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><br \/><\/div>\n<p>Now, let&#8217;s take a look at the <strong>branch deploy<\/strong> model:<\/p>\n<ol>\n<li>Create a branch.<\/li>\n<li>Add commits to your branch.<\/li>\n<li>Open a pull request.<\/li>\n<li>Gather feedback plus peer reviews.<\/li>\n<li>Deploy your change.<\/li>\n<li>Validate.<\/li>\n<li>Merge your branch to the <code>main<\/code> \/ <code>master<\/code> branch. <\/li>\n<\/ol>\n<div class=\"image-frame image-frame-full border rounded-2 overflow-hidden d-flex flex-row flex-justify-center\" style=\"background: #EAEEF2\"><br \/>\n<img data-recalc-dims=\"1\" decoding=\"async\" loading=\"lazy\" src=\"https:\/\/github.blog\/wp-content\/uploads\/2023\/02\/branch-deploy.jpg?w=720&#038;resize=720%2C244\" alt=\"Diagram outlining the steps of the branch deploy model, enumerated in the list above.\" width=\"720\" height=\"244\" class=\"aligncenter size-large wp-image-69855 width-fit\" srcset=\"https:\/\/github.blog\/wp-content\/uploads\/2023\/02\/branch-deploy.jpg?w=720 720w, https:\/\/github.blog\/wp-content\/uploads\/2023\/02\/branch-deploy.jpg?w=300 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><br \/><\/div>\n<p>The merge deploy model is inherently riskier because the <code>main<\/code> branch is never truly a stable branch. If a deployment fails, or we need to roll back, we follow the entire process again to roll back our changes. However, in the branch deploy model, the <code>main<\/code> branch is always in a &#8220;good&#8221; state and we can deploy it at any time to revert the deployment from a branch deploy. In the branch deploy model, we only merge our changes into <code>main<\/code> once the branch has been successfully deployed and validated.<\/p>\n<p><em>Note: this is sometimes referred to as the <a href=\"https:\/\/docs.github.com\/en\/get-started\/quickstart\/github-flow\">GitHub flow<\/a>.<\/em><\/p>\n<h3 id=\"key-concepts\"><a class=\"heading-link\" href=\"#key-concepts\">Key concepts<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h3>\n<p>Key concepts of the branch deploy model:<\/p>\n<ul>\n<li>The <code>main<\/code> branch is always considered to be a stable and deployable branch.<\/li>\n<li>All changes are deployed to production before they are merged to the <code>main<\/code> branch.<\/li>\n<li>To roll back a branch deployment, you deploy the <code>main<\/code> branch.<\/li>\n<\/ul>\n<p>By now you may be sold on the branch deploy methodology. How do we implement it? Introducing IssueOps with GitHub Actions!<\/p>\n<h2 id=\"issueops\"><a class=\"heading-link\" href=\"#issueops\">IssueOps<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h2>\n<p>The best way to define IssueOps is to compare it to something similar, <strong>ChatOps<\/strong>. You may be familiar with the concept, ChatOps, already; if not, here is a quick definition:<\/p>\n<blockquote><p>\n  ChatOps is the process of interacting with a chat bot to execute commands directly in a chat platform. For example, with ChatOps you might do something like <code>.ping example.org<\/code> to check the status of a website.\n<\/p><\/blockquote>\n<p>IssueOps adopts the same mindset but through a different medium. Rather than using a chat service (Discord, Slack, etc.) to invoke the commands we use comments on a GitHub Issue or pull request. <a href=\"https:\/\/github.com\/features\/actions\">GitHub Actions<\/a> is the runtime that executes our desired logic when an IssueOps command is invoked.<\/p>\n<h2 id=\"github-actions\"><a class=\"heading-link\" href=\"#github-actions\">GitHub Actions<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h2>\n<p>How does it work? This section will go into detail about how this Action works and hopefully inspire you to leverage it in your own projects. The full source code and further documentation can be found on <a href=\"https:\/\/github.com\/github\/branch-deploy\">GitHub<\/a>.<\/p>\n<p>Let&#8217;s walk through the process using the demo configuration of a branch-deploy Action below.<\/p>\n<h4 id=\"1-create-this-file-under-github-workflows-branch-deploy-yml-in-your-github-repository\"><a class=\"heading-link\" href=\"#1-create-this-file-under-github-workflows-branch-deploy-yml-in-your-github-repository\">1. Create this file under <code>.github\/workflows\/branch-deploy.yml<\/code> in your GitHub repository:<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h4>\n<pre><code class=\"language-yaml\">name: \"branch deploy demo\"\n\n# The workflow will execute on new comments on pull requests - example: \".deploy\" as a comment\non:\n  issue_comment:\n    types: [created]\n\njobs:\n  demo:\n    if: ${{ github.event.issue.pull_request }} # only run on pull request comments (no need to run on issue comments)\n    runs-on: ubuntu-latest\n    steps:\n      # Execute IssueOps branch deployment logic, hooray!\n      # This will be used to \"gate\" all future steps below and conditionally trigger steps\/deployments\n      - uses: github\/branch-deploy@vX.X.X # replace X.X.X with the version you want to use\n        id: branch-deploy # it is critical you have an id here so you can reference the outputs of this step\n        with:\n          trigger: \".deploy\" # the trigger phrase to look for in the comment on the pull request\n\n      # Run your deployment logic for your project here - examples seen below\n\n      # Checkout your project repository based on the ref provided by the branch-deploy step\n      - uses: actions\/checkout@3.0.2\n        if: ${{ steps.branch-deploy.outputs.continue == 'true' }} # skips if the trigger phrase is not found\n        with:\n          ref: ${{ steps.branch-deploy.outputs.ref }} # uses the detected branch from the branch-deploy step\n\n      # Do some fake \"noop\" deployment logic here\n      # conditionally run a noop deployment\n      - name: fake noop deploy\n        if: ${{ steps.branch-deploy.outputs.continue == 'true' &amp;&amp; steps.branch-deploy.outputs.noop == 'true' }} # only run if the trigger phrase is found and the branch-deploy step detected a noop deployment\n        run: echo \"I am doing a fake noop deploy\"\n\n      # Do some fake \"regular\" deployment logic here\n      # conditionally run a regular deployment\n      - name: fake regular deploy\n        if: ${{ steps.branch-deploy.outputs.continue == 'true' &amp;&amp; steps.branch-deploy.outputs.noop != 'true' }} # only run if the trigger phrase is found and the branch-deploy step detected a regular deployment\n        run: echo \"I am doing a fake regular deploy\"\n<\/code><\/pre>\n<h4 id=\"2-trigger-a-noop-deploy-by-commenting-deploy-noop-on-a-pull-request\"><a class=\"heading-link\" href=\"#2-trigger-a-noop-deploy-by-commenting-deploy-noop-on-a-pull-request\">2. Trigger a noop deploy by commenting <code>.deploy noop<\/code> on a pull request.<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h4>\n<p>A noop deployment is detected so this action outputs the <code>noop<\/code> variable to <code>true<\/code>. If you have the correct permissions to execute the IssueOps command, the action outputs the <code>continue<\/code> variable to <code>true<\/code> as well. The step named <code>fake noop deploy<\/code> runs, while the <code>fake regular deploy<\/code> step is skipped.<\/p>\n<h4 id=\"3-after-your-noop-deploy-completes-you-would-typically-run-deploy-to-execute-the-actual-deployment-fake-regular-deploy\"><a class=\"heading-link\" href=\"#3-after-your-noop-deploy-completes-you-would-typically-run-deploy-to-execute-the-actual-deployment-fake-regular-deploy\">3. After your noop deploy completes, you would typically run <code>.deploy<\/code> to execute the actual deployment, <code>fake regular deploy<\/code>.<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h4>\n<h2 id=\"features\"><a class=\"heading-link\" href=\"#features\">Features<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h2>\n<p>The best part about the branch-deploy Action is that it is <strong>highly<\/strong> customizable for any deployment targets and use cases. Here are just a few of the features that this Action comes bundled with:<\/p>\n<ul>\n<li>\ud83d\udd0d Detects when IssueOps commands are used on a pull request. <\/li>\n<li>\ud83d\udcdd Configurable: choose your command syntax, environment, noop trigger, base branch, reaction, and more.<\/li>\n<li>\u2705 Respects your branch protection settings configured for the repository.<\/li>\n<li>\ud83d\udcac Comments and reacts to your IssueOps commands.<\/li>\n<li>\ud83d\ude80 Triggers GitHub deployments for you with simple configuration.<\/li>\n<li>\ud83d\udd13 Deploy locks to prevent multiple deployments from clashing.<\/li>\n<li>\ud83c\udf0e Configurable environment targets.<\/li>\n<\/ul>\n<p>The repository also comes with a <a href=\"https:\/\/github.com\/github\/branch-deploy\/blob\/main\/docs\/usage.md\">usage guide<\/a>, which can be referenced by you and your team to quickly get familiar with available IssueOps commands and how they work.<\/p>\n<h2 id=\"examples\"><a class=\"heading-link\" href=\"#examples\">Examples<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h2>\n<p>The branch-deploy Action is customizable and suited for a wide range of projects. Here are a few examples of how you can use the branch-deploy Action to deploy to different services:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/github\/branch-deploy\/blob\/main\/docs\/examples.md#simple-example\">Simple example<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/github\/branch-deploy\/blob\/main\/docs\/examples.md#terraform\">Terraform<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/github\/branch-deploy\/blob\/main\/docs\/examples.md#heroku\">Heroku<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/github\/branch-deploy\/blob\/main\/docs\/examples.md#railway\">Railway<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/github\/branch-deploy\/blob\/main\/docs\/examples.md#ssh\">SSH deployments<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/github\/branch-deploy\/blob\/main\/docs\/examples.md#cloudflare-pages\">Cloudflare Pages<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/github\/branch-deploy\/blob\/main\/docs\/examples.md#cloudflare-workers\">Cloudflare Workers<\/a><\/li>\n<\/ul>\n<h2 id=\"conclusion\"><a class=\"heading-link\" href=\"#conclusion\">Conclusion<span class=\"heading-hash pl-2 text-italic text-bold\" aria-hidden=\"true\"><\/span><\/a><\/h2>\n<p>If you are looking to enhance your DevOps experience, have better reliability in your deployments, or ship changes faster, then branch deployments are for you!<\/p>\n<p>Hopefully, you now have a better understanding of why the branch deploy model is a great option for shipping your code to production.<\/p>\n<p>By using GitHub plus Actions plus IssueOps you can leverage the branch deploy model in any repository!<\/p>\n<p><small>Source code: <a href=\"https:\/\/github.com\/marketplace\/actions\/branch-deploy\">GitHub<\/a><\/small><\/p>\n","protected":false},"excerpt":{"rendered":"<p>What if developers want to leverage branch deployments but don&#8217;t have a full ChatOps stack integrated with their repositories? We wanted to set out to find a way for all developers to be able to take advantage of branch deployments with ease, right from their GitHub repository, and so the branch-deploy Action was born!<\/p>\n","protected":false},"author":2094,"featured_media":66853,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_gh_post_show_toc":"no","_gh_post_is_no_robots":"no","_gh_post_is_featured":"no","_gh_post_is_excluded":"no","_gh_post_is_unlisted":"no","_gh_post_related_link_1":"","_gh_post_related_link_2":"","_gh_post_related_link_3":"","_gh_post_sq_img":"https:\/\/github.blog\/wp-content\/uploads\/2022\/01\/GitHub-Engineering_green-square-icon.png","_gh_post_sq_img_id":"62550","_gh_post_cta_title":"","_gh_post_cta_text":"","_gh_post_cta_link":"","_gh_post_cta_button":"Click Here to Learn More","_gh_post_recirc_hide":"no","_gh_post_recirc_col_1":"gh-auto-select","_gh_post_recirc_col_2":"65301","_gh_post_recirc_col_3":"65308","_gh_post_recirc_col_4":"65316","_featured_video":"","_gh_post_additional_query_params":"","_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"_links_to":"","_links_to_target":""},"categories":[72,3308],"tags":[770,2966,122],"coauthors":[2965],"class_list":["post-69851","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-engineering","category-engineering-principles","tag-automation","tag-deployment","tag-github-actions"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Enabling branch deployments through IssueOps with GitHub Actions - The GitHub Blog<\/title>\n<meta name=\"description\" content=\"What if developers want to leverage branch deployments but don&#039;t have a full ChatOps stack integrated with their repositories? We wanted to set out to find a way for all developers to be able to take advantage of branch deployments with ease, right from their GitHub repository, and so the branch-deploy Action was born!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Enabling branch deployments through IssueOps with GitHub Actions\" \/>\n<meta property=\"og:description\" content=\"What if developers want to leverage branch deployments but don&#039;t have a full ChatOps stack integrated with their repositories? We wanted to set out to find a way for all developers to be able to take advantage of branch deployments with ease, right from their GitHub repository, and so the branch-deploy Action was born!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/\" \/>\n<meta property=\"og:site_name\" content=\"The GitHub Blog\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-02T18:03:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-02-03T13:53:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/github.blog\/wp-content\/uploads\/2022\/09\/Open-Source-Engineering@2x.png?fit=2400%2C1260\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1260\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Grant Birkinbine\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Grant Birkinbine\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/\"},\"author\":{\"name\":\"Grant Birkinbine\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/520ba51f6adcfb417ab92683afb0b277\"},\"headline\":\"Enabling branch deployments through IssueOps with GitHub Actions\",\"datePublished\":\"2023-02-02T18:03:36+00:00\",\"dateModified\":\"2023-02-03T13:53:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/\"},\"wordCount\":975,\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/Open-Source-Engineering@2x.png?fit=2400%2C1260\",\"keywords\":[\"automation\",\"Deployment\",\"GitHub Actions\"],\"articleSection\":[\"Engineering\",\"Engineering principles\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/\",\"url\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/\",\"name\":\"Enabling branch deployments through IssueOps with GitHub Actions - The GitHub Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/Open-Source-Engineering@2x.png?fit=2400%2C1260\",\"datePublished\":\"2023-02-02T18:03:36+00:00\",\"dateModified\":\"2023-02-03T13:53:53+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/520ba51f6adcfb417ab92683afb0b277\"},\"description\":\"What if developers want to leverage branch deployments but don't have a full ChatOps stack integrated with their repositories? We wanted to set out to find a way for all developers to be able to take advantage of branch deployments with ease, right from their GitHub repository, and so the branch-deploy Action was born!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/#primaryimage\",\"url\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/Open-Source-Engineering@2x.png?fit=2400%2C1260\",\"contentUrl\":\"https:\\\/\\\/github.blog\\\/wp-content\\\/uploads\\\/2022\\\/09\\\/Open-Source-Engineering@2x.png?fit=2400%2C1260\",\"width\":2400,\"height\":1260},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/enabling-branch-deployments-through-issueops-with-github-actions\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/github.blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Engineering\",\"item\":\"https:\\\/\\\/github.blog\\\/engineering\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Engineering principles\",\"item\":\"https:\\\/\\\/github.blog\\\/engineering\\\/engineering-principles\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Enabling branch deployments through IssueOps with GitHub Actions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/github.blog\\\/#website\",\"url\":\"https:\\\/\\\/github.blog\\\/\",\"name\":\"The GitHub Blog\",\"description\":\"Updates, ideas, and inspiration from GitHub to help developers build and design software.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/github.blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/github.blog\\\/#\\\/schema\\\/person\\\/520ba51f6adcfb417ab92683afb0b277\",\"name\":\"Grant Birkinbine\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/71ab35f6ae3c01f5ce1f1d92f4d27b60fe38f4748f8dbd0137a57c3e7a2d0b8d?s=96&d=mm&r=g5c6379fe960eea1acefd095f8e923da6\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/71ab35f6ae3c01f5ce1f1d92f4d27b60fe38f4748f8dbd0137a57c3e7a2d0b8d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/71ab35f6ae3c01f5ce1f1d92f4d27b60fe38f4748f8dbd0137a57c3e7a2d0b8d?s=96&d=mm&r=g\",\"caption\":\"Grant Birkinbine\"},\"url\":\"https:\\\/\\\/github.blog\\\/author\\\/grantbirki\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Enabling branch deployments through IssueOps with GitHub Actions - The GitHub Blog","description":"What if developers want to leverage branch deployments but don't have a full ChatOps stack integrated with their repositories? We wanted to set out to find a way for all developers to be able to take advantage of branch deployments with ease, right from their GitHub repository, and so the branch-deploy Action was born!","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:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/","og_locale":"en_US","og_type":"article","og_title":"Enabling branch deployments through IssueOps with GitHub Actions","og_description":"What if developers want to leverage branch deployments but don't have a full ChatOps stack integrated with their repositories? We wanted to set out to find a way for all developers to be able to take advantage of branch deployments with ease, right from their GitHub repository, and so the branch-deploy Action was born!","og_url":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/","og_site_name":"The GitHub Blog","article_published_time":"2023-02-02T18:03:36+00:00","article_modified_time":"2023-02-03T13:53:53+00:00","og_image":[{"width":2400,"height":1260,"url":"https:\/\/github.blog\/wp-content\/uploads\/2022\/09\/Open-Source-Engineering@2x.png?fit=2400%2C1260","type":"image\/png"}],"author":"Grant Birkinbine","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Grant Birkinbine","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/#article","isPartOf":{"@id":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/"},"author":{"name":"Grant Birkinbine","@id":"https:\/\/github.blog\/#\/schema\/person\/520ba51f6adcfb417ab92683afb0b277"},"headline":"Enabling branch deployments through IssueOps with GitHub Actions","datePublished":"2023-02-02T18:03:36+00:00","dateModified":"2023-02-03T13:53:53+00:00","mainEntityOfPage":{"@id":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/"},"wordCount":975,"image":{"@id":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2022\/09\/Open-Source-Engineering@2x.png?fit=2400%2C1260","keywords":["automation","Deployment","GitHub Actions"],"articleSection":["Engineering","Engineering principles"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/","url":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/","name":"Enabling branch deployments through IssueOps with GitHub Actions - The GitHub Blog","isPartOf":{"@id":"https:\/\/github.blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/#primaryimage"},"image":{"@id":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/#primaryimage"},"thumbnailUrl":"https:\/\/github.blog\/wp-content\/uploads\/2022\/09\/Open-Source-Engineering@2x.png?fit=2400%2C1260","datePublished":"2023-02-02T18:03:36+00:00","dateModified":"2023-02-03T13:53:53+00:00","author":{"@id":"https:\/\/github.blog\/#\/schema\/person\/520ba51f6adcfb417ab92683afb0b277"},"description":"What if developers want to leverage branch deployments but don't have a full ChatOps stack integrated with their repositories? We wanted to set out to find a way for all developers to be able to take advantage of branch deployments with ease, right from their GitHub repository, and so the branch-deploy Action was born!","breadcrumb":{"@id":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/#primaryimage","url":"https:\/\/github.blog\/wp-content\/uploads\/2022\/09\/Open-Source-Engineering@2x.png?fit=2400%2C1260","contentUrl":"https:\/\/github.blog\/wp-content\/uploads\/2022\/09\/Open-Source-Engineering@2x.png?fit=2400%2C1260","width":2400,"height":1260},{"@type":"BreadcrumbList","@id":"https:\/\/github.blog\/engineering\/engineering-principles\/enabling-branch-deployments-through-issueops-with-github-actions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/github.blog\/"},{"@type":"ListItem","position":2,"name":"Engineering","item":"https:\/\/github.blog\/engineering\/"},{"@type":"ListItem","position":3,"name":"Engineering principles","item":"https:\/\/github.blog\/engineering\/engineering-principles\/"},{"@type":"ListItem","position":4,"name":"Enabling branch deployments through IssueOps with GitHub Actions"}]},{"@type":"WebSite","@id":"https:\/\/github.blog\/#website","url":"https:\/\/github.blog\/","name":"The GitHub Blog","description":"Updates, ideas, and inspiration from GitHub to help developers build and design software.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/github.blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/github.blog\/#\/schema\/person\/520ba51f6adcfb417ab92683afb0b277","name":"Grant Birkinbine","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/71ab35f6ae3c01f5ce1f1d92f4d27b60fe38f4748f8dbd0137a57c3e7a2d0b8d?s=96&d=mm&r=g5c6379fe960eea1acefd095f8e923da6","url":"https:\/\/secure.gravatar.com\/avatar\/71ab35f6ae3c01f5ce1f1d92f4d27b60fe38f4748f8dbd0137a57c3e7a2d0b8d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/71ab35f6ae3c01f5ce1f1d92f4d27b60fe38f4748f8dbd0137a57c3e7a2d0b8d?s=96&d=mm&r=g","caption":"Grant Birkinbine"},"url":"https:\/\/github.blog\/author\/grantbirki\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/github.blog\/wp-content\/uploads\/2022\/09\/Open-Source-Engineering@2x.png?fit=2400%2C1260","jetpack_shortlink":"https:\/\/wp.me\/pamS32-iaD","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/69851","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/users\/2094"}],"replies":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/comments?post=69851"}],"version-history":[{"count":6,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/69851\/revisions"}],"predecessor-version":[{"id":69951,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/posts\/69851\/revisions\/69951"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media\/66853"}],"wp:attachment":[{"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/media?parent=69851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/categories?post=69851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/tags?post=69851"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/github.blog\/wp-json\/wp\/v2\/coauthors?post=69851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}