{"id":9013,"date":"2021-12-14T16:34:59","date_gmt":"2021-12-14T11:04:59","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=9013"},"modified":"2021-12-14T16:34:59","modified_gmt":"2021-12-14T11:04:59","slug":"ecs-rollback-with-jenkins-active-choice-parameter","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2021\/12\/14\/ecs-rollback-with-jenkins-active-choice-parameter\/","title":{"rendered":"ECS rollback with Jenkins Active Choice Parameter"},"content":{"rendered":"\n<p>Browser: Chrome or Firefox or Brave? (<em>Sorry Edge! :p )<\/em><\/p>\n\n\n\n<p>Social Media: Facebook or Instagram?<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/E3JgPTRep-57DNcQ8hs1tq33hdnYGpnlxrGsoYAeAz1cv6v-UzIVa2rGTrfbVqFDED8vN3sKnO9Gya4Z0ByNyIrzhhumhflaTFNkXAlM4gM5Tgv7Ff9yTuiA5552CjMrE3RiDmeB\" alt=\"\" width=\"484\" height=\"726\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>In our daily lives, we always have choices, which one to use.<\/p>\n\n\n\n<p>That was a brief intro about what we are going to read today. Yes, <strong>choices<\/strong>!<\/p>\n\n\n\n<p class=\"has-text-align-justify\">In Jenkins, while defining parameters, we can mention whether it needs to be a string parameter, a choice parameter, etc. These parameters will work on the input that you are mentioning in your job while running it. For example, if you are asking the user to choose between options A or B, the user chooses the parameter, and then Jenkins runs the script with that parameter.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"has-text-align-justify\">As an advanced feature to choice parameters, Jenkins has a plugin named <a href=\"https:\/\/github.com\/jenkinsci\/active-choices-plugin\/blob\/master\/README.md\" target=\"_blank\" rel=\"noreferrer noopener\">Active Choices<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"installation\">Installation<\/h2>\n\n\n\n<p>The installation is quite simple. You need to go to <strong>Manage Plugins<\/strong>, check for the <strong>Active Choices<\/strong> plugin, and install. There you go!!<\/p>\n\n\n\n<p class=\"has-text-align-justify\"><em>Dashboard -&gt; Manage Jenkins -&gt; Manage Plugins -&gt; Available -&gt; Search for Active Choices.<\/em><\/p>\n\n\n\n<p>This plugin installs 3 parameter types:<\/p>\n\n\n\n<ol><li><strong>Active Choices Parameter<\/strong>: This parameter uses a groovy script to dynamically provide a list of choices for the user.<\/li><li><strong>Active Choices Reactive Parameter<\/strong>: Works the same way as Active Choices Parameter, you need to reference the Active choice parameter name. It also dynamically provides a list of choices but depends on the Active Choice parameter.<\/li><li><strong>Active Choices Reactive Reference Parameter:<\/strong> Similar to those above, but with a lot more rendering options.<\/li><\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"the-use-case\">The Use Case:<\/h3>\n\n\n\n<p class=\"has-text-align-justify\">In the project that I am working on, we have ECS clusters created and there are frequent deployments. There might be a case where the Developer wants to rollback to the previous deployment (due to multiple reasons) in the preprod environment.&nbsp;<\/p>\n\n\n\n<p class=\"has-text-align-justify\">What I had to do, is to create a rollback job, which will help the Developer to rollback to a previous version of the application. That\u2019s when I came to know about Active Choice and here is a sample <em>Groovy script<\/em> that helps you list down regions in AWS.<\/p>\n\n\n\n<pre id=\"block-30af3690-13e7-4007-9601-e2079bba28c3\" class=\"wp-block-preformatted has-white-color has-dark-gray-background-color has-text-color has-background\">import groovy.json.JsonSlurper\ndef regions = \"aws ec2 describe-regions --query Regions --region us-east-1\"\ndef region = regions.execute() \nregion.waitFor()\ndef output = region.in.text\ndef exitcode= region.exitValue()\ndef error = region.err.text\ndef refString = \"\"\nif (error) {\n    \tprintln \"Std Err: ${error}\"\n    \tprintln \"Process exit code: ${exitcode}\"\n    \treturn exitcode\n    }\nfor(i in output.tokenize()){\n  refString += i\n}\ndef jsonSlurper = new JsonSlurper()\ndef parseJson = jsonSlurper.parseText(refString)\ndef arrays = []\nfor(i in 0..(parseJson.size()-1)) {\narrays.add(parseJson[i].RegionName)\n}\nreturn arrays<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"output\">Output:<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"449\" height=\"449\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2021\/11\/pasted-image-0-1-1.png?w=449\" alt=\"\" class=\"wp-image-9098\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"509\" height=\"509\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2021\/11\/pasted-image-0.png?w=509\" alt=\"\" class=\"wp-image-9096\" \/><\/figure>\n\n\n\n<p>Likewise, I have defined multiple other parameters:<\/p>\n\n\n\n<ol><li><strong>Region<\/strong>: List downs all the regions present in AWS<\/li><li><strong>Cluster<\/strong>: Depends on the parameter <em><strong>Region<\/strong><\/em>, and then shows the clusters in a particular region. For example, if you choose ap-south-1, it will list all the clusters present in ap-south-1<\/li><li><strong>Service<\/strong>: Depends on Region Cluster. Shows all the services present in a cluster.<\/li><li><strong>Task<\/strong>: The task parameter depends on all the above parameters. It lists the active task definitions for that Service.<\/li><li><strong>force_new_deployment<\/strong>: This is a choice parameter with choices: <strong><em>true <\/em>or <em>false<\/em><\/strong><em>.&nbsp;<\/em><\/li><\/ol>\n\n\n\n<p><\/p>\n\n\n\n<p>Now, with all these parameters in hand, we run our pipeline:<\/p>\n\n\n\n<pre class=\"wp-block-verse has-white-color has-text-color has-background\" style=\"background-color:#000000;\">pipeline {\n    agent any\n\n\n    stages {\n        stage('testing') {\n            steps {\n                println \"Cluster Name: ${Cluster}\"\n                println \"Service Name: ${service}\"\n                \n                println \"Task: ${Task}\"\n                println \"Force: ${force_new_deployment}\"\n            }  \n        }\n        \n        stage ('Force deployment') {\n      when {\n                expression { force_new_deployment == 'true'}\n            }\n            steps {\n                sh 'aws ecs update-service --cluster ${Cluster} --service ${Service} --task-definition ${Task} --force-new-deployment'\n            }\n    }\n    \n    stage ('Normal deployment') {\n      when {\n                expression { force_new_deployment == 'false'}\n            }\n            steps {\n                sh 'aws ecs update-service --cluster ${Cluster} --service ${Service} --task-definition ${Task}'\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<p class=\"has-text-align-justify\">If the <strong>force_new_deployment<\/strong> is<em> true<\/em>, it will force a new deployment of the task definition that you will choose and create new tasks.&nbsp;<\/p>\n\n\n\n<p class=\"has-text-align-justify\">If it is <em>false<\/em>, the service will wait for the other tasks to stop and then will create new tasks with the selected task definition.<\/p>\n\n\n\n<p class=\"has-text-align-justify\"><strong>You can find the code here:<\/strong><br>https:\/\/github.com\/prakashjha08\/ecs-rollback<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Help was taken from:<br>https:\/\/stackoverflow.com\/questions\/48982349\/query-aws-cli-to-populate-jenkins-active-choices-reactive-parameter-linux<\/p>\n\n\n\n<p class=\"has-text-align-justify\">So, that\u2019s a use-case that I worked upon, and it was quite a good learning on how ECS deployment works and how Active choice in Jenkins works. Also, groovy!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"what-else-can-i-do-with-active-choice-plugin\">What else can I do with Active choice plugin??<\/h2>\n\n\n\n<p>Here is a list of things that we have done with this plugin:<\/p>\n\n\n\n<ol><li>Copy file from local to <strong>EC2 Instances<\/strong> using Jenkins (dropdown will show Instances present in the selected region)<\/li><li>Upload files directly to <strong>S3<\/strong> bucket via Jenkins<\/li><li>List down branches from <strong>GitHub<\/strong> and build the job with selected branch<\/li><\/ol>\n\n\n\n<p>&#8230;&#8230;.and many more.<\/p>\n\n\n\n<p>You can also comment down any such scenario if performed in your infra.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion:<\/h2>\n\n\n\n<p>Here we are, at the end of this blog, what are the key takeaways?<\/p>\n\n\n\n<ol><li>Jenkins has a lot of plugins which we are not aware of!<\/li><li>Keep exploring, you may find something that might help you with the work that you have been provided with.<\/li><li>It doesn&#8217;t harm if you learn new tech :p<\/li><\/ol>\n\n\n\n<p class=\"has-text-align-justify\">If you have come this far, a big shoutout to you. Thanks for reading the whole blog.&nbsp;<\/p>\n\n\n\n<p>Happy Learning! <strong>\ud83d\ude42<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/www.google.com\/imgres?imgurl=https%3A%2F%2Fi.imgflip.com%2F4%2F5pnrbl.jpg&amp;im[\u2026]utton&amp;hl=en&amp;ved=2ahUKEwiLuo_ejeP0AhUwgGMGHQ2YA2UQMygAegQIARAh\" target=\"_blank\" rel=\"noreferrer noopener\">Image Reference<\/a><\/p>\n\n\n\n<p><b> <\/b><strong style=\"font-weight:bold;\">Blog Pundit: <\/strong><a href=\"https:\/\/opstree.com\/blog\/\/author\/naveenverma023\/\"><strong>Naveen Verma <\/strong><\/a>and <strong><a href=\"https:\/\/opstree.com\/blog\/\/author\/abhishekbhardwaj510\/\"><strong>Abhishek Dubey<\/strong><\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/opstree.com\/blog\/\/author\/adeel109\/\" target=\"_blank\"> <\/a><\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/www.opstree.com\/contact-us?utm_source=Blog&amp;utm_medium=Wordpress&amp;utm_campaign=ecs-rollback-with-jenkins-active-choice-parameter\" target=\"_blank\" rel=\"noreferrer noopener\">Opstree <\/a>is an End to End DevOps solution provider<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-fill\"><a class=\"wp-block-button__link\" href=\"https:\/\/www.opstree.com\/contact-us\" target=\"_blank\" rel=\"noreferrer noopener\">CONTACT US<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"has-text-align-center\"><strong>Connect Us <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-social-links aligncenter is-content-justification-right is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li><\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Browser: Chrome or Firefox or Brave? (Sorry Edge! :p ) Social Media: Facebook or Instagram? In our daily lives, we always have choices, which one to use. That was a brief intro about what we are going to read today. Yes, choices! In Jenkins, while defining parameters, we can mention whether it needs to be &hellip; <a href=\"https:\/\/opstree.com\/blog\/2021\/12\/14\/ecs-rollback-with-jenkins-active-choice-parameter\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;ECS rollback with Jenkins Active Choice Parameter&#8221;<\/span><\/a><\/p>\n","protected":false},"author":201814660,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474],"tags":[727694392,460,306058,768739299,727694395,4996032],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-2ln","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/9013"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/201814660"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=9013"}],"version-history":[{"count":23,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/9013\/revisions"}],"predecessor-version":[{"id":9517,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/9013\/revisions\/9517"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=9013"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=9013"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=9013"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}