{"id":60451,"date":"2020-12-10T08:00:37","date_gmt":"2020-12-10T16:00:37","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/devops\/?p=60451"},"modified":"2020-12-08T15:28:41","modified_gmt":"2020-12-08T23:28:41","slug":"i-need-manual-approvers-for-github-actions-and-i-got-them-now","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/devops\/i-need-manual-approvers-for-github-actions-and-i-got-them-now\/","title":{"rendered":"I need manual approvers for GitHub Actions!!!! And I got them now :)"},"content":{"rendered":"<p>I love GitHub Actions, but holy moly, I <strong>really<\/strong> want manual approvers before I deploy into an environment!!!! My typical workflow would send my pull request to a dynamically provisioned PR specific staging environment and then to > test> staging > production. And I totally need manual approvers between environments!<\/p>\n<p>Well, guess what. <strong>THEY&#8217;RE HERE!!!!!<\/strong><\/p>\n<h2>GitHub Announces Deployment Features (Beta)<\/h2>\n<p>Yup, you heard it. GitHub just announced deployment features. You now get:<\/p>\n<ul>\n<li>Pipeline Visualization<\/li>\n<li>Environments \n<ul>\n<li>Required reviewers (manual approvers)<\/li>\n<li>Wait time before deployments start<\/li>\n<li>Environment specific secrets<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/yay.gif?WT.mc_id=devops-11455-abewan\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/yay.gif?WT.mc_id=devops-11455-abewan\" alt=\"Image yay\" width=\"500\" height=\"286\" class=\"alignnone size-full wp-image-60452\" \/><\/a><\/p>\n<h2>How Do I Do This?<\/h2>\n<p>First, make sure you are part of the public beta (starting Dec 15th). Once in, go to your settings, and you&#8217;ll see a new <code>Environments<\/code> tab. Go ahead and click on <code>New environment<\/code>.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/c5f22231f8fa82c969e0ff561e4b1f9a5f66805929d127a6e793aeb0946d8a54.png?WT.mc_id=devops-11455-abewan\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/c5f22231f8fa82c969e0ff561e4b1f9a5f66805929d127a6e793aeb0946d8a54.png?WT.mc_id=devops-11455-abewan\" alt=\"Image c5f22231f8fa82c969e0ff561e4b1f9a5f66805929d127a6e793aeb0946d8a54\" width=\"1920\" height=\"977\" class=\"alignnone size-full wp-image-60460\" srcset=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/c5f22231f8fa82c969e0ff561e4b1f9a5f66805929d127a6e793aeb0946d8a54.png 1920w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/c5f22231f8fa82c969e0ff561e4b1f9a5f66805929d127a6e793aeb0946d8a54-300x153.png 300w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/c5f22231f8fa82c969e0ff561e4b1f9a5f66805929d127a6e793aeb0946d8a54-1024x521.png 1024w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/c5f22231f8fa82c969e0ff561e4b1f9a5f66805929d127a6e793aeb0946d8a54-768x391.png 768w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/c5f22231f8fa82c969e0ff561e4b1f9a5f66805929d127a6e793aeb0946d8a54-1536x782.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<p>For my sample\/demo, I entered in the name of my environment <code>abelNodeDemoAppEnv.prod<\/code> and then clicked <code>Configure environment<\/code><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/f876490e5d619e1aeda400bafc2c29b295da4c4b521efc4df4f99e3945ea756a.png?WT.mc_id=devops-11455-abewan\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/f876490e5d619e1aeda400bafc2c29b295da4c4b521efc4df4f99e3945ea756a.png?WT.mc_id=devops-11455-abewan\" alt=\"Image f876490e5d619e1aeda400bafc2c29b295da4c4b521efc4df4f99e3945ea756a\" width=\"1920\" height=\"977\" class=\"alignnone size-full wp-image-60461\" srcset=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/f876490e5d619e1aeda400bafc2c29b295da4c4b521efc4df4f99e3945ea756a.png 1920w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/f876490e5d619e1aeda400bafc2c29b295da4c4b521efc4df4f99e3945ea756a-300x153.png 300w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/f876490e5d619e1aeda400bafc2c29b295da4c4b521efc4df4f99e3945ea756a-1024x521.png 1024w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/f876490e5d619e1aeda400bafc2c29b295da4c4b521efc4df4f99e3945ea756a-768x391.png 768w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/f876490e5d619e1aeda400bafc2c29b295da4c4b521efc4df4f99e3945ea756a-1536x782.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<p>Next, I added required reviewers (manual approvers) to this environment by clicking the <code>Required reviewers<\/code> checkbox and added both myself as a reviewer as well as my <code>approverteam<\/code> (you can add a list of people and\/or teams). Once done, don&#8217;t forget to click <code>Save protection rules<\/code>.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/eab2ca258f53525497a5d708857ddee32dfb2ba0fb4555791fbec14fbc557fd3.png?WT.mc_id=devops-11455-abewan\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/eab2ca258f53525497a5d708857ddee32dfb2ba0fb4555791fbec14fbc557fd3.png?WT.mc_id=devops-11455-abewan\" alt=\"Image eab2ca258f53525497a5d708857ddee32dfb2ba0fb4555791fbec14fbc557fd3\" width=\"1920\" height=\"977\" class=\"alignnone size-full wp-image-60462\" srcset=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/eab2ca258f53525497a5d708857ddee32dfb2ba0fb4555791fbec14fbc557fd3.png 1920w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/eab2ca258f53525497a5d708857ddee32dfb2ba0fb4555791fbec14fbc557fd3-300x153.png 300w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/eab2ca258f53525497a5d708857ddee32dfb2ba0fb4555791fbec14fbc557fd3-1024x521.png 1024w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/eab2ca258f53525497a5d708857ddee32dfb2ba0fb4555791fbec14fbc557fd3-768x391.png 768w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/eab2ca258f53525497a5d708857ddee32dfb2ba0fb4555791fbec14fbc557fd3-1536x782.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<p>Now I&#8217;m ready to edit my YAML. In my workflow definition, I have a job named <code>provisionProd<\/code> where I provision the resources I need in Azure using ARM templates. After the provisionProd job, I have another job that deploys my app into the freshly provisioned environment (if it has already been provisioned and nothing has changed, this will result in a no-op).<\/p>\n<p>I want manual approvers before I provision my prod environment so this is what my YAML now looks like:<\/p>\n<pre><code>  provisionProd:\n    name: Provision Prod\n    runs-on: ubuntu-latest\n    needs: functionalTestsStaging\n    environment:\n      name: abelNodeDemoAppEnv.prod\n      url: https:\/\/abel-node-gh-accelerator.azurewebsites.net\n    steps:\n    # Checkout\n    - name: Checkout\n      uses: actions\/checkout@v1\n\n    ...\n<\/code><\/pre>\n<p>Notice the lines<\/p>\n<pre><code>    environment:\n      name: abelNodeDemoAppEnv.prod\n      url: https:\/\/abel-node-gh-accelerator.azurewebsites.net\n<\/code><\/pre>\n<p>Under environment, the name needs to match the environment that I created earlier (if it doesn&#8217;t match, Actions will automatically create the environment for you so watch your typing) and url is the url to my production app.<\/p>\n<p>Now, when the workflow runs we get some super cool workflow visualization!<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/921a0c6d34524750b3af8baf7dce916ffd9dbf09c0267b60176d5bbd01f4c993.png?WT.mc_id=devops-11455-abewan\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/921a0c6d34524750b3af8baf7dce916ffd9dbf09c0267b60176d5bbd01f4c993.png?WT.mc_id=devops-11455-abewan\" alt=\"Image 921a0c6d34524750b3af8baf7dce916ffd9dbf09c0267b60176d5bbd01f4c993\" width=\"1920\" height=\"977\" class=\"alignnone size-full wp-image-60463\" srcset=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/921a0c6d34524750b3af8baf7dce916ffd9dbf09c0267b60176d5bbd01f4c993.png 1920w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/921a0c6d34524750b3af8baf7dce916ffd9dbf09c0267b60176d5bbd01f4c993-300x153.png 300w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/921a0c6d34524750b3af8baf7dce916ffd9dbf09c0267b60176d5bbd01f4c993-1024x521.png 1024w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/921a0c6d34524750b3af8baf7dce916ffd9dbf09c0267b60176d5bbd01f4c993-768x391.png 768w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/921a0c6d34524750b3af8baf7dce916ffd9dbf09c0267b60176d5bbd01f4c993-1536x782.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<p>In parallel, I&#8217;m building my app and provisioning a personal staging environment. Then I&#8217;m deploying my app to my personal staging environment. And then I run a bunch of functional\/automated UI tests against my personal staging environment.<\/p>\n<p>And here, the workflow pauses. Before going on and provisioning my production environment in Azure, it waits for a manual approver. This is because we added the protection rule of having required reviewers for this environment.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/e6af0ee8a362caa3187d880478612005eab8bf33e253baf47325f195c7714792.png?WT.mc_id=devops-11455-abewan\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/e6af0ee8a362caa3187d880478612005eab8bf33e253baf47325f195c7714792.png?WT.mc_id=devops-11455-abewan\" alt=\"Image e6af0ee8a362caa3187d880478612005eab8bf33e253baf47325f195c7714792\" width=\"1920\" height=\"977\" class=\"alignnone size-full wp-image-60464\" srcset=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/e6af0ee8a362caa3187d880478612005eab8bf33e253baf47325f195c7714792.png 1920w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/e6af0ee8a362caa3187d880478612005eab8bf33e253baf47325f195c7714792-300x153.png 300w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/e6af0ee8a362caa3187d880478612005eab8bf33e253baf47325f195c7714792-1024x521.png 1024w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/e6af0ee8a362caa3187d880478612005eab8bf33e253baf47325f195c7714792-768x391.png 768w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/e6af0ee8a362caa3187d880478612005eab8bf33e253baf47325f195c7714792-1536x782.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<p>Clicking on Review deployments brings up the <code>Review pending deployments<\/code> dialog. Check the box to approve and I&#8217;ll also leave a comment. Now click <code>Approve and deploy<\/code><\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/4eeb51fd7ca19d15b32346b8e27e644cb87eda1c4ef7fe04c3f9458200ff2c22.png?WT.mc_id=devops-11455-abewan\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/4eeb51fd7ca19d15b32346b8e27e644cb87eda1c4ef7fe04c3f9458200ff2c22.png?WT.mc_id=devops-11455-abewan\" alt=\"Image 4eeb51fd7ca19d15b32346b8e27e644cb87eda1c4ef7fe04c3f9458200ff2c22\" width=\"1920\" height=\"977\" class=\"alignnone size-full wp-image-60465\" srcset=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/4eeb51fd7ca19d15b32346b8e27e644cb87eda1c4ef7fe04c3f9458200ff2c22.png 1920w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/4eeb51fd7ca19d15b32346b8e27e644cb87eda1c4ef7fe04c3f9458200ff2c22-300x153.png 300w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/4eeb51fd7ca19d15b32346b8e27e644cb87eda1c4ef7fe04c3f9458200ff2c22-1024x521.png 1024w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/4eeb51fd7ca19d15b32346b8e27e644cb87eda1c4ef7fe04c3f9458200ff2c22-768x391.png 768w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/4eeb51fd7ca19d15b32346b8e27e644cb87eda1c4ef7fe04c3f9458200ff2c22-1536x782.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<p>After the approval, the workflow picks back up, provisions\/configures my production environment in Azure, deploys my app into prod and then runs functional tests against my prod environment!<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/fea1535e9a05d0e46b668e060002c596e1ea6cbb8591827f8912e389fe7ea109.png?WT.mc_id=devops-11455-abewan\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/fea1535e9a05d0e46b668e060002c596e1ea6cbb8591827f8912e389fe7ea109.png?WT.mc_id=devops-11455-abewan\" alt=\"Image fea1535e9a05d0e46b668e060002c596e1ea6cbb8591827f8912e389fe7ea109\" width=\"1920\" height=\"977\" class=\"alignnone size-full wp-image-60466\" srcset=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/fea1535e9a05d0e46b668e060002c596e1ea6cbb8591827f8912e389fe7ea109.png 1920w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/fea1535e9a05d0e46b668e060002c596e1ea6cbb8591827f8912e389fe7ea109-300x153.png 300w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/fea1535e9a05d0e46b668e060002c596e1ea6cbb8591827f8912e389fe7ea109-1024x521.png 1024w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/fea1535e9a05d0e46b668e060002c596e1ea6cbb8591827f8912e389fe7ea109-768x391.png 768w, https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2020\/12\/fea1535e9a05d0e46b668e060002c596e1ea6cbb8591827f8912e389fe7ea109-1536x782.png 1536w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/a><\/p>\n<h2>Conclusion<\/h2>\n<p>I&#8217;ve been waiting for this and I&#8217;m super excited these deployment features have now made it to GitHub Actions. Approvals\/environment protection is super necessary, specially in my bigger projects!<\/p>\n<p>Check out the new beta deployment features! Play with them and let me know what you all think.<\/p>\n<h2>Related Links<\/h2>\n<p><a href=\"https:\/\/docs.microsoft.com\/azure\/developer\/github\/github-variable-substitution?WT.mc_id=devops-11455-abewan\">GitHub Actions for Azure<\/a><\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/azure\/developer\/github\/connect-from-azure?WT.mc_id=devops-11455-abewan\">Connect to Azure from GitHub Actions<\/a><\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/learn\/paths\/automate-workflow-github-actions?WT.mc_id=devops-11455-abewan\">Learn How to Automate Your Workflows With GitHub Actions<\/a><\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/learn\/modules\/github-actions-cd?WT.mc_id=devops-11455-abewan\">Learn How to Build and Deploy applications to Azure by using GitHub Actions<\/a><\/p>\n<p><a href=\"https:\/\/docs.microsoft.com\/learn\/paths\/build-community-driven-projects-github?WT.mc_id=devops-11455-abewan\">Learn How to Build Community Driven Projects on GitHub<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>GitHub just announced some CD features and I love them! Manual approvers for environments along with workflow visualization!<\/p>\n","protected":false},"author":226,"featured_media":60467,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[226,1],"tags":[],"class_list":["post-60451","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ci","category-devops"],"acf":[],"blog_post_summary":"<p>GitHub just announced some CD features and I love them! Manual approvers for environments along with workflow visualization!<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts\/60451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/users\/226"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/comments?post=60451"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts\/60451\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/media\/60467"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/media?parent=60451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/categories?post=60451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/tags?post=60451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}