tag:blogger.com,1999:blog-73964227568014501522024-03-19T16:14:30.957+05:30Continuous Delivery with ThoughtWorks GoNote: These posts were written a while ago and might be out of date.sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comBlogger24125tag:blogger.com,1999:blog-7396422756801450152.post-79541572742462678772013-10-16T12:05:00.000+05:302013-10-16T12:05:22.523+05:30Modeling build promotions into Go<a href="http://www.thoughtworks.com/insights/blog/build-promotion-go">http://www.thoughtworks.com/insights/blog/build-promotion-go</a><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-57625643456392049622013-10-08T13:47:00.001+05:302013-10-08T13:47:47.770+05:30Use infrastructure automation tools for application deployment<a href="http://www.thoughtworks.com/insights/blog/use-infrastructure-automation-tools-application-deployment">http://www.thoughtworks.com/insights/blog/use-infrastructure-automation-tools-application-deployment</a><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-35227481767033997352013-10-03T13:04:00.003+05:302013-10-03T13:04:55.082+05:30Deploy a package, not just a tag, branch or binary<a href="http://www.thoughtworks.com/insights/blog/deploy-package-not-just-tag-branch-or-binary">http://www.thoughtworks.com/insights/blog/deploy-package-not-just-tag-branch-or-binary</a><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-16764984844496430382013-09-24T17:38:00.001+05:302013-09-24T17:38:35.009+05:30Timer pipelines that don't overwhelm the repository<a href="http://support.thoughtworks.com/entries/22279834-Timer-Pipelines-with-material-autoUpdate-turned-off">http://support.thoughtworks.com/entries/22279834-Timer-Pipelines-with-material-autoUpdate-turned-off</a><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-2169127095200059732013-05-10T11:17:00.003+05:302013-05-10T11:17:30.304+05:30Pass variables to other pipelines<a href="http://support.thoughtworks.com/entries/23754976-Pass-variables-to-other-pipelines">http://support.thoughtworks.com/entries/23754976-Pass-variables-to-other-pipelines</a><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-70155865964960793762013-04-30T16:44:00.000+05:302013-04-30T16:44:06.229+05:30Drive Go from Jenkins<br />
<a href="http://support.thoughtworks.com/entries/23704378-Drive-Go-from-Jenkins">http://support.thoughtworks.com/entries/23704378-Drive-Go-from-Jenkins</a><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-52744102865948534502013-04-22T10:01:00.000+05:302013-04-22T10:01:09.068+05:30How to peg your pipeline to a dependency version<a class="twitter-hashtag pretty-link js-nav" data-query-source="hashtag_click" dir="ltr" href="https://twitter.com/search?q=%23tw_go&src=hash"><b></b></a> <a class="twitter-timeline-link" data-expanded-url="http://www.thoughtworks-studios.com/blog/how-peg-your-pipeline-dependency-version" dir="ltr" href="http://t.co/yolMxkioXO" rel="nofollow" target="_blank" title="http://www.thoughtworks-studios.com/blog/how-peg-your-pipeline-dependency-version"><span class="invisible">http://www.</span><span class="js-display-url">thoughtworks-studios.com/blog/how-peg-y</span><span class="invisible">our-pipeline-dependency-version</span><span class="tco-ellipsis"><span class="invisible"> </span></span></a><br />
<br />
How to peg your pipeline to a dependency version...modeling static and fluid dependencies in Go.<div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-37948214772658828702013-03-22T09:16:00.000+05:302013-03-22T09:16:01.945+05:30A command repository for GoAs of release 13.1, we have added support for a command repository. This was hinted at earlier in this <a href="http://cd-with-thoughtworks-go.blogspot.in/2012/09/does-go-support-my-favorite-tool.html">post</a>. Please check out the following links for documentation and tips on usage.<br />
<br />
<a href="http://www.thoughtworks-studios.com/docs/go/current/help/command_repository.html">Offcial product documentation</a><br />
<br />
<a href="https://github.com/goteam/go-command-repo">Public github repo of commands (contributions accepted)</a><br />
<br />
<a href="http://www.thoughtworks-studios.com/blog/and-you-thought-go-did-not-support-maven-nuget-chef">And you thought Go didn't support Maven, Nuget or Chef?</a><br />
<br />
<a href="http://www.thoughtworks-studios.com/blog/use-gos-new-command-repository-lookup-your-config-scripts">Use Go's new command repository to lookup your config scripts (advanced)</a><br />
<br />
Somewhat related reading:<br />
<br />
<a href="http://support.thoughtworks.com/entries/22873043-go-s-custom-command">Understanding Go's custom command</a><br />
<br />
<a href="http://cd-with-thoughtworks-go.blogspot.in/2013/03/one-task-per-job.html">One task per job</a><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-78422730957681405332013-03-07T18:57:00.003+05:302014-01-23T10:15:45.347+05:30Go + Maven + Chef - a webinar<a href="https://github.com/ThoughtWorksInc/go-book-config">https://github.com/ThoughtWorksInc/go-book-config</a><br />
<br />
<a href="https://github.com/ThoughtWorksInc/go-book-website">https://github.com/ThoughtWorksInc/go-book-website</a><br />
<a href="https://github.com/ThoughtWorksInc/go-book-inventory">https://github.com/ThoughtWorksInc/go-book-inventory</a><br />
<a href="https://github.com/ThoughtWorksInc/go-book-management">https://github.com/ThoughtWorksInc/go-book-management</a> <br />
<br />
Notes:<br />
<a href="https://dl.dropboxusercontent.com/u/6691653/webinars/go-maven-chef-notes.pdf">https://dl.dropboxusercontent.com/u/6691653/webinars/go-maven-chef-notes.pdf</a> <br />
<br />
Update: 14th June 2013<br />
Here's how the demo pipelines look (minus the logos) with the new <a href="http://www.thoughtworks-studios.com/docs/go/current/help//value_stream_map.html" target="_blank">value stream visualization</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCXt_VfF88Vz6JP0jvYMZbDe1scmpO-FT2zIvj7sOBNDoWFuil7rsGObJpxP8HB1kS8BzJ2umPtvh9rUucOv6Pf3q_Pn9niRKA6gl_1ZxbtZzZJlStI40nqVh0GbvpXenObNzlgl0uvb8/s1600/webinar-vsm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCXt_VfF88Vz6JP0jvYMZbDe1scmpO-FT2zIvj7sOBNDoWFuil7rsGObJpxP8HB1kS8BzJ2umPtvh9rUucOv6Pf3q_Pn9niRKA6gl_1ZxbtZzZJlStI40nqVh0GbvpXenObNzlgl0uvb8/s400/webinar-vsm.png" height="275" width="400" /></a></div>
<br />
Update: 29th March 2013<br />
<a href="http://www.thoughtworks-studios.com/content/end-end-automated-build-and-deployment-pipeline-maven-chef-and-go">Recording</a> now available at the studios website. <br />
<br />
Maven based build pipelines are fairly common. Chef based deployment pipelines are also gaining traction. In this demo, I will demonstrate how to design and connect the two using Go. Along the way I'll explain why not to use maven-snaphosts, how to make Chef talk to Nexus and provide several tips on Go usage. The resulting end-to-end automated build and deployment pipeline will provide overarching visibility, traceability, orchestration and access control for the entire continuous delivery value stream.<br />
<br />
Date: 21st March 2013<br />
Time: UK 10:00 AM | IN 3:30 PM | AUS 9:00 PM <br />
<br /><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-43283313260024783232013-03-02T16:02:00.001+05:302013-03-02T16:02:29.641+05:30One task per job<b id="internal-source-marker_0.6845589354634285" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">I care for the ability to keep my build and deploy config</span></b><span style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> under version control (just like application source code and config). I also care for the ability to </span></span><b id="internal-source-marker_0.6845589354634285" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">run my builds and deployments outside of Go if needed. Turns out this is pretty straightforward to achieve with Go because Go simply execs its tasks, even in case of </span><a href="http://cd-with-thoughtworks-go.blogspot.in/2012/09/does-go-support-my-favorite-tool.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">first-class</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> support (except for fetch-artifact). </span></b><span style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">As an aside, t</span></span><b id="internal-source-marker_0.6845589354634285" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">his is actually one reason why even task-plugins should </span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">not</span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> be more than exec - get too close and you lose independence.</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">One useful step along the way is to make sure I don’t inline my build and deployment commands within Go. So each task should just be a script invocation to an externally version controlled script. For example if we use a tool like ant, maven, nant or rake, pretty much every task can be of the form: </span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">tool <target></span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> that runs off a version controlled build file.</span></b><span style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></span><b id="internal-source-marker_0.6845589354634285" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">In general, a job with N tasks can be refactored to a single-task-job that invokes a version controlled script containing N </span></b><span style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">lines</span></span><b id="internal-source-marker_0.6845589354634285" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. There is one small hitch though.<b> </b></span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">In Go, a job is the unit of work on the agent. A job can have many tasks, they will be executed in sequence on the same agent. If any task exits with non-zero, the job is failed and subsequent tasks are not executed (except for</span><a href="http://www.thoughtworks-studios.com/go/current/help/dev_clean_up_when_cancel.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"> cance</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">l and</span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/dev_conditional_task_execution.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;"> fai</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">l handlers). This is useful fail-fast behaviour.</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">However, we lose this behaviour when we move from N tasks to a single<b>-</b>script<b>-</b></span></b><span style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">task</span></span><b id="internal-source-marker_0.6845589354634285" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><b> </b></span></b><span style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">because</span></span><b id="internal-source-marker_0.6845589354634285" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></b><span style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">b</span></span><b id="internal-source-marker_0.6845589354634285" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">y default, a bash script or windows batch script will <i>not</i> stop execution if any of its lines returns non-zero. This can be easily fixed in bash with the </span><a href="http://wiki.bash-hackers.org/commands/builtin/set"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">set -e</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> command (thanks </span><a href="http://www.linkedin.com/pub/aravind-venkatanaranappa/9/52b/875"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Arvind</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">). Combine this with the -x option to get even better logging on the Go Job Console!</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">#!/bin/bash</span><br /><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">set -e -x</span><br /><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"># rest of the script</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">There are ways to do this on Windows, please see </span><a href="http://stackoverflow.com/questions/13859311/is-there-a-set-e-for-a-dos-batch-script"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">this</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> discussion on stackoverflow.</span></b><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-56141933135109171642013-02-01T19:15:00.000+05:302013-02-01T19:15:10.556+05:30Monitor Go Agents with Graphite<b id="internal-source-marker_0.3111065325792879" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><img height="404px;" src="https://lh5.googleusercontent.com/qVJnyUhOsKRcIO1rBDFlbn_dQYJRebbTQVr5943bhOOvW6hk1zBXMNrXH-Yvar8iDxd-bvO6a6Xo6hehB9Ysosmk3Gk_ERAgTaxv7HsqC9zQ0ZbvWFc8oMNM" width="602px;" /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Say we want to use Graphite to monitor free memory on all Go agents. There are many ways to do it (e.g. cron job, free -s) but you will have to set it up on each agent. Here is one way to do it using a combination of Go’s features.</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">We’ll send data using the </span><a href="http://graphite.readthedocs.org/en/latest/feeding-carbon.html#the-plaintext-protocol"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">plaintext</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> protocol. </span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">echo "local.random.diceroll 4 `date +%s`" | nc ${SERVER} ${PORT};</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">I find redirection cooler, so:</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">echo ”server-name.freemem 23 `date +%s`” >/dev/tcp/carbon-server/2003</span><br /><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">where 23 is percentage free memory. To get free memory as a single number, we use this </span><a href="http://stackoverflow.com/a/10586020/33434"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">tip</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">:</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">free | grep Mem | awk '{print $4/$2 * 100.0}'</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Thus, we have the following Go </span><a href="http://support.thoughtworks.com/entries/22873043-go-s-custom-command"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">custom command</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> that also reports hostname dynamically:</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"><exec command="</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">/bin/bash</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">"><br class="kix-line-break" /> <arg></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">-c</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></arg><br class="kix-line-break" /> <arg></span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">echo "`hostname`.freemem `free | grep Mem | awk '{print $4/$2 * 100.0}'` `date +%s`" &gt; /dev/tcp/carbon-server/2003</span><span style="background-color: transparent; color: black; font-family: Consolas; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></arg><br class="kix-line-break" /></exec></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Next, we set up a </span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/admin_timer.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">timer trigger</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> based pipeline (with a dummy material, </span><a href="http://www.thoughtworks-studios.com/go/current/help/configuration_reference.html#stage"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">fetch</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> set to false) so that it runs this command every x seconds.</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">To ensure that it always runs on the agent you want to monitor, you could use a </span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/managing_a_build_cloud.html#jobstoagents"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">job resource</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> with value equal to the hostname of the agent. On the other hand, you could check </span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/admin_run_on_all_agents.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">run-on-all-agents</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> on the job to monitor every agent - present and future, for now and ever!</span></b><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-62253509710037985902013-01-16T11:12:00.000+05:302013-02-07T22:50:21.721+05:30Mapping TeamCity to Go<b id="internal-source-marker_0.2560523592401296" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Here is a </span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">rough,</span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> partial mapping of </span><a href="http://cd-with-thoughtworks-go.blogspot.in/2012/08/domain-model-concepts-abstractions.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">abstractions</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> and features in TeamCity and Go.</span></b><br />
<br />
<b id="internal-source-marker_0.2560523592401296" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> </span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<div dir="ltr">
<table style="border-collapse: collapse; border: none; width: 602px;"><colgroup><col width="*"></col><col width="*"></col></colgroup><tbody>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">TeamCity</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Go</span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Project</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://www.thoughtworks-studios.com/go/current/help/dev_authorization.html#pipeline-groups"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">PipelineGroup</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">-</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://cd-with-thoughtworks-go.blogspot.in/2012/07/go-environments.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Environment</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">BuildConfiguration</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://cd-with-thoughtworks-go.blogspot.in/2012/11/flexible-modeling-pipeline-stage-job-task.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Job</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">BuildStep</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://cd-with-thoughtworks-go.blogspot.in/2012/11/flexible-modeling-pipeline-stage-job-task.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Task</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">BuildStep - Command line</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://support.thoughtworks.com/entries/22873043-go-s-custom-command"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Custom command</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> task</span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">BuildChain</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://cd-with-thoughtworks-go.blogspot.in/2012/10/pipelines-and-value-streams.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">ValueStream</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">BuildChain visual</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://www.thoughtworks-studios.com/docs/go/current/help/Pipelines_Dashboard_page.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Dashboard</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> and </span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/managing_dependencies.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">upstream-downstream</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">-</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://cd-with-thoughtworks-go.blogspot.in/2012/10/pipelines-and-value-streams.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Pipeline</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">-</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://www.thoughtworks-studios.com/docs/go/current/help/pipeline_activity_page.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Pipeline activity visual</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">-</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://cd-with-thoughtworks-go.blogspot.in/2012/11/flexible-modeling-pipeline-stage-job-task.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Stage</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Snapshot dependency based build chain (sharing same VCS root)</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://www.thoughtworks-studios.com/go/current/help/concepts_in_go.html#pipelines"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Single Pipeline</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Artifact dependency based build chain</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Pipeline </span><a href="http://www.thoughtworks-studios.com/go/current/help/managing_dependencies.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">dependency</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> with </span><a href="http://www.thoughtworks-studios.com/go/current/help/managing_dependencies.html#fetch_artifact_section"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">fetch artifact</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Version Control Settings</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://www.thoughtworks-studios.com/docs/go/current/help/quick_pipeline_setup.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">SCM Material</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Shared VCS Root</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">-</span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">VCS trigger</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://www.thoughtworks-studios.com/docs/go/current/help/configuration_reference.html#materials"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Material polling</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Schedule trigger</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><a href="http://www.thoughtworks-studios.com/docs/go/current/help/admin_timer.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Timer trigger</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Finish Build trigger</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Pipeline </span><a href="http://www.thoughtworks-studios.com/go/current/help/managing_dependencies.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">dependency</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> + </span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/configuration_reference.html#materials"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Material polling</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Maven artifact dependency trigger</span><br />
<span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Maven snapshot dependency trigger</span><br />
<span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Nuget dependency trigger</span></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Watch this space!</span></td></tr>
<tr style="height: 0px;"><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"></td><td style="border: 1px solid rgb(0, 0, 0); padding: 7px; vertical-align: top;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"><a href="http://www.thoughtworks-studios.com/docs/go/current/help/fan_in.html">Fan-in</a> dependency management</span></td></tr>
</tbody></table>
</div>
<b id="internal-source-marker_0.2560523592401296" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><br /></b><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-9963473131110617832012-12-05T19:04:00.000+05:302012-12-05T19:23:55.741+05:30Werner Vogels shows off GoAt the recently held AWS <a href="https://reinvent.awsevents.com/" target="_blank">ReInvent</a> conference in the US, during one of the keynotes, Werner Vogels (Amazon's CTO) cited REA as "one of the most advanced AWS users in the world", and specifically mentioned the approach to continuous delivery that has been implemented there.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" src="http://www.youtube.com/v/PW1lhU8n5So&start=2467" width="560"></iframe>
</div>
<br />
And then he showed Go's pipeline activity page to demonstrate how REA is set up.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCZwfz8QPGrvRCxF6Y-CqOKIuLdX3FH6QK0uXnpn0p7kTOLYjPpvIdHLR00Q80ATj0GDMPZBkD_DRyI0FbzI1acp2dLyyz3dF7toduKuFLBaTb71GCnQTiip-DLDB9rkBLFaN9UCDZCb0/s1600/aws-reinvent-go.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCZwfz8QPGrvRCxF6Y-CqOKIuLdX3FH6QK0uXnpn0p7kTOLYjPpvIdHLR00Q80ATj0GDMPZBkD_DRyI0FbzI1acp2dLyyz3dF7toduKuFLBaTb71GCnQTiip-DLDB9rkBLFaN9UCDZCb0/s320/aws-reinvent-go.png" width="320" /></a></div>
He said:<br />
<blockquote class="tr_bq">
"And in the new world where all our requirements change all the time, customers change their minds, environment changes, business decisions are being made. In the past, it would be almost impossible to meet those guarantees...Because we were in this style of development that was sort of <i>next generation</i> thinking. Oh you know, we'll do this in the next cycle...that is sort of thinking of the past...lots of lean thinking concepts being brought into businesses ...you will bring a product to market in a robust, limited feature set...then quickly iterate with your customers to go in a particular direction. Now if thats the new way that businesses actually want to build their product...after these days there is abundance of products in the market...competition is murderous..there is increasing consumer choice...it is highly uncertain if your product is going to be successful or not...so we need to have a development methodology that deals well with uncertainty...and the fact that you are no longer controlled by your resources allows you to be this flexible...<b>for example one of our customers in Australia has really pushed this to the max...can I show you that slide...yes</b>...<br />
This is the guys of realestate.com in OZ - they are...experts in Agile. They have a distributed development environment that runs all over the world...all the engineers are collaborating together...on top of AWS, they do continuous build and integration...whenever you check something in, it <b>automatically goes through all the steps and meets all the checks and will also be deployed into production.</b>"</blockquote>
<div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-1693592642905883452012-11-24T22:40:00.001+05:302012-12-19T17:27:58.403+05:30Choose wisely between Pipelines, Stages, Jobs and Tasks<span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;">When modeling pipelines with Go, always remember that, subject to availability of agents:</span></span><br />
<ol>
<li><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;">Multiple instances of a pipeline can run simultaneously. This is common if we have a pipeline that takes half an hour to complete and there are multiple commits to the pipeline's material during that interval.</span></span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;">Stages of a pipeline-instance will execute in sequence.</span></span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;">Jobs within a stage <i>will </i>be executed in parallel. If you have stuff that must run in sequence, model them as tasks within a job, not as multiple jobs. But you could also distribute these tasks over multiple stages having one job each</span><span style="font-size: small;">. Why? For one, it gives better visibility on the dashboard and pipeline activity page. Stage progression is visually depicted. Task progression within a job is only depicted as a overall progress bar (because agents only report back to the server on job completion, not for each task). But perhaps more importantly, this gives you finer-grained re-run ability. It isn't possible to re-run individual tasks, only jobs. So modeling a sequence of activities into a number of single-job stages lets us pick and choose what to re-run thus resulting in faster feedback at a micro level.</span></span></li>
<li><span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;">Note however t<span style="font-size: small;">hat refactoring a multi-task job into multiple jobs</span> me<span style="font-size: small;">ans that the ta<span style="font-size: small;">sks may not all run on the <span style="font-size: small;">same agent. Job is the unit of agent activity - so<span style="font-size: small;"> if you care about agent affinity (e.g. not fetch materials on <span style="font-size: small;">multiple</span> agents), </span></span></span></span></span></span>a single job is t<span style="font-size: small;">he way to go.</span></li>
</ol>
<span style="font-family: Georgia,"Times New Roman",serif;"><span style="font-size: small;">On the other hand, do make full of parallelizability. Try to refactor pipelines with many stages into multiple pipelines. Try to partition independent compilation or testing activity into multiple jobs. Go is quite powerful and flexible - make sure you put it to work.</span></span><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-42535643496574898212012-10-26T16:17:00.000+05:302012-11-07T21:43:26.111+05:30Pipelines and Value StreamsA Go Pipeline does not necessarily map one-to-one with what is referred to as <i>the</i> automated deployment pipeline in continuous delivery litreature. The automated deployment pipeline is essentially the end-to-end CD value stream. This end to end value stream is often better modeled using multiple Go Pipelines.<br />
<br />
For very simple cases, it may be enough to model the entire value stream inside a single Go Pipeline as the diagram in the <a href="http://www.thoughtworks-studios.com/docs/go/current/help/concepts_in_go.html" target="_blank">documentation</a> suggests.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw9zQ7CHw0Puu4U0OtqB1zBEfoaCO-6ibGpi-mcAeCwffo_tLBgg-dgOI5iL9pWXp40ble4ANbwSmIKowV67Q3ww6xdSRSBM4qY56KF_AJldabI9lZ2DNEAS_Gsa-0IPQ9zhBIbU1WEWo/s1600/go_concepts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw9zQ7CHw0Puu4U0OtqB1zBEfoaCO-6ibGpi-mcAeCwffo_tLBgg-dgOI5iL9pWXp40ble4ANbwSmIKowV67Q3ww6xdSRSBM4qY56KF_AJldabI9lZ2DNEAS_Gsa-0IPQ9zhBIbU1WEWo/s320/go_concepts.png" width="320" /></a></div>
But for any realistic case, we are going to have to integrate the output of multiple teams and then subject the combined package to integration testing etc. In this case, it is much more flexible to model the value stream with multiple pipelines as below (each box is a pipeline).<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtwuqOYeRiB3VAYixc9HVZgJFbIU0-oRzXZdbl1L3JcG2EQTbcctIGBlVi9xbXAUqD3un8nA737BWeoWxYn90RSHicBPByU_GAkyJDDxK8AjW1AovcmTddcMqrA30wxfNOWChv9adJGMQ/s1600/go-upstream-pipeline-labels.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="97" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtwuqOYeRiB3VAYixc9HVZgJFbIU0-oRzXZdbl1L3JcG2EQTbcctIGBlVi9xbXAUqD3un8nA737BWeoWxYn90RSHicBPByU_GAkyJDDxK8AjW1AovcmTddcMqrA30wxfNOWChv9adJGMQ/s320/go-upstream-pipeline-labels.png" width="320" /></a></div>
<br />
There is no need to stop at one pipeline per team. If anything, the <a href="http://www.thoughtworks-studios.com/docs/go/current/help/dev_authorization.html#pipeline-groups" target="_blank">pipeline group</a> is useful as a team level concept. Modeling your delivery value stream using multiple pipelines allows you to:<br />
<ol>
<li>Associate different materials with different pipelines</li>
<li>Associate different pipelines with different <a href="http://www.thoughtworks-studios.com/docs/go/current/help/managing_environments.html" target="_blank">environments</a>.</li>
<li>Pause or <a href="http://www.thoughtworks-studios.com/docs/go/12.3/help/admin_lock_pipelines.html" target="_blank">lock</a> a specific pipeline without affecting the other pipelines.</li>
</ol>
Here is a simple delivery value stream modeled using seven Go pipelines.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxtFNfHzI76TjsQgeYq5JSp-c0IJDavJgzqudzZQYEy6tMbGIG7UaiqJSXCpwHh35d8i4MoR7mAt4GZh6RIgS7dBYyLYHwwZQBArxVQnKh0bXL3izmkDLDx_rUNKi6rDNE37-uOaVieV8/s1600/cd_value-stream.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxtFNfHzI76TjsQgeYq5JSp-c0IJDavJgzqudzZQYEy6tMbGIG7UaiqJSXCpwHh35d8i4MoR7mAt4GZh6RIgS7dBYyLYHwwZQBArxVQnKh0bXL3izmkDLDx_rUNKi6rDNE37-uOaVieV8/s640/cd_value-stream.png" width="640" /></a></div>
<div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-79120426295721687702012-10-16T14:55:00.003+05:302013-05-22T11:59:14.149+05:30Users write/talk about GoThis is a compilation of user authored material that references Go. I expect to keep growing this list. Feel free to submit links via comments.<br />
<ol style="line-height: 200%;">
<li><a href="http://www.slideshare.net/matthewskelton/end-toend-deployment-pipelines">http://www.slideshare.net/matthewskelton/end-toend-deployment-pipelines</a>
</li>
<li><a href="http://www.youtube.com/watch?v=pF5ya0q53kk&feature=player_detailpage#t=1118s">ancestry.com's talk at Chef Conf (Go+Chef+Powershell)</a></li>
<li><a href="http://www.spin.org.za/wp-content/uploads/2012/06/SPIN-Presentation-20.06.12.pdf" target="_blank">CD and one touch deployment by Rustin Daniels</a></li>
<li><a href="http://blog.orfjackal.net/2012/08/continuous-delivery-with-maven-and-go.html" target="_blank">Continuous Delivery into Maven Central with Maven and Go</a></li>
<li><a href="http://delivermind.blogspot.in/2012/05/why-i-love-go.html">http://delivermind.blogspot.in/2012/05/why-i-love-go.html</a> </li>
<li><a href="https://www.youtube.com/watch?feature=player_embedded&v=PW1lhU8n5So#t=2478s" target="_blank">Amazon CTO, Werner Vogels showcases a team that uses Go</a></li>
<li><a href="http://puppetlabs.com/blog/a-deployment-pipeline-for-infrastructure/">Deployment pipeline for infrastructure using Go - NBN case study</a> </li>
<li><a href="http://vimeo.com/17580637" target="_blank">How moneysupermarket.com implemented CD</a></li>
<li><a href="https://www.youtube.com/watch?v=u6JnRSvGYIk" target="_blank">Using Go for mobile app dev - iOS and iPhone</a></li>
</ol>
And here is slightly more official content co-authored by ThoughtWorks and customers.<br />
<br />
<ol>
<li><a href="http://www.thoughtworks-studios.com/customers/nokia">Nokia</a></li>
<li><a href="http://www.thoughtworks-studios.com/customers/verivox">Verivox</a></li>
<li><a href="http://www.thoughtworks-studios.com/customers/caplin-trader">Caplin</a></li>
<li><a href="http://www.thoughtworks-studios.com/customers/thetrainlinecom">Trainline</a></li>
<li><a href="http://www.thoughtworks-studios.com/customers/moodys-analytics">Moody's Analytics</a></li>
<li><a href="http://www.thoughtworks-studios.com/customers/rosetta-stone">Rosetta Stone</a></li>
<li><a href="http://www.thoughtworks-studios.com/customers/premium-credit-limited">Premium Credit</a></li>
</ol>
<ol style="line-height: 200%;">
</ol>
<div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-49135020540617284662012-10-11T16:38:00.000+05:302013-04-02T16:20:45.457+05:30Why continuous delivery needs devops, and why devops needs infrastructure-as-code<b><span style="font-family: Georgia,"Times New Roman",serif;">Update 02-Apr-13</span></b><br />
<span style="font-family: Georgia,"Times New Roman",serif;">Just came across this detailed relevant talk by </span><strong>Reinertsen - </strong>the author I reference for silo reduction and batch size reduction.<a class="editorlink f_taxonomyEditor" href="http://www.infoq.com/author/Don-Reinertsen;jsessionid=64DAC7480C6A7365BAEF70A101B1E065"><br /></a><br />
<br />
<a href="http://www.infoq.com/presentations/lean-product-dev">http://www.infoq.com/presentations/lean-product-dev</a><strong> </strong><br />
<span style="font-family: Georgia,"Times New Roman",serif;"> </span><b><span style="font-family: Georgia,"Times New Roman",serif;"> </span></b><br />
<b><span style="font-family: Georgia,"Times New Roman",serif;">Update 31-Oct-12</span></b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/IAOmtBiKm94?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<b><span style="font-family: Georgia,"Times New Roman",serif;">Update 26-Oct-12</span></b><br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;"><a href="http://www.sriramnarayan.com/c/continuous-delivery_devops_infrastructure-as-code.pdf">Slides</a>, with <a href="http://www.sriramnarayan.com/c/continuous-delivery_devops_infrastructure-as-code_notes.pdf">notes </a></span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">=====================</span><br />
<br />
<span style="font-family: Georgia,"Times New Roman",serif;">I'll present on this topic on 25th October 2012 as part of a ThoughtWorks Studios webinar <a href="http://www.thoughtworks-studios.com/resources/agile-webinars" target="_blank">series</a> on continuous delivery. <span style="font-family: Georgia,"Times New Roman",serif;">Please register from the <a href="http://www.thoughtworks-studios.com/content/why-continuous-delivery-needs-devops-and-why-devops-needs-infrastructure-code">webinar page</a>.</span></span><br />
<span style="font-family: Georgia,"Times New Roman",serif;"><br /></span>
<span style="font-family: Georgia,"Times New Roman",serif;"><b>Abstract</b></span><br />
<span style="font-family: Georgia,"Times New Roman",serif;">Continuous delivery and devops have gone mainstream, at least in terms of mindshare. As a result, a lot of vendors have jumped onto the bandwagon. Most products that have anything to do with deployment now try to associate themselves with devops and continuous delivery. In this webinar, Sriram will try to clear the air in a product independent manner. He will also cover common devops anti-patterns and explain the idea of infrastructure as code.</span><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-52556090181934099882012-09-12T17:35:00.002+05:302012-09-12T19:26:55.728+05:30Does Go support my favorite build/deployment tool?<b id="internal-source-marker_0.7734798933379352" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">We’ve had numerous requests to provide </span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">first class</span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> support for more tasks (in Go). This is what first class support looks like<b>:</b></span></b><br />
<br />
<b id="internal-source-marker_0.7734798933379352" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><img height="446px;" src="https://lh4.googleusercontent.com/vVESATfi1womNqkvifb83LwzHGfuej3oL3kk9kiWkV78hib5dQ13GUnf_Uq3ult-7xDOtQQwbt46PeC5g0sRnjbK0XazCrYzwJP17IIJmdJLh1Ps05k" width="598px;" /><br /><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">And this is what </span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">less than first class</span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> support looks like:</span></b><br />
<br />
<br />
<b id="internal-source-marker_0.7734798933379352" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><img height="483px;" src="https://lh5.googleusercontent.com/hqHBg-2AyHxYbXqhRz5mzCUB3TTOuu5kWZzomG0D9-FkVSRwcuT-7WDiDoaO8wBR3hDbEyUSWd-esU-fLkU1Y43CnDEoT4YcMRrbYriKgYz3MmeF21A" width="326px;" /><br /><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">The thing to realize is that first class support really isn’t all that it is made out to be. Go necessarily execs all tasks, first class or not. If the exec returns an exit code of zero, the task is considered successful, else the task (and job) are failed. The task specific GUI is merely a scaffold. At the time of job execution, it makes no difference whether you defined an Ant task via the GUI or via a custom command. In fact, it is not possible to make this out from the execution log for the task. The Go config xml will differ slightly based on whether you used the task specific GUI or custom command but it really doesn’t matter.</span><br /><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">However, it may take a bit of effort to get the arguments in the custom command exactly right. Would it help if we hosted a task repository for this purpose? Something like </span><a href="https://gist.github.com/3313376"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">this</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">? Note that this is currently totally experimental, unsupported and may disappear any time. But we’d like your feedback on this (via comments to this post please). I think this has potential for community participation and may evolve into a useful repo of reusable tasks that serve as a useful starting point for your own tasks.</span></b><br />
<br />
<br />
<br />
<b id="internal-source-marker_0.7734798933379352" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">On the other hand, it is good practice to keep the definition of a Go job very light. Instead of defining ten different tasks under one job, just write a script (or a build target) for the ten tasks and hook it into Go with a bare bones custom command that calls the script/target.</span></b><br />
<b id="internal-source-marker_0.7734798933379352" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><img alt="" src="data:image/png;base64,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" /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></b><br />
<br />
<b id="internal-source-marker_0.7734798933379352" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">This lets you keep the script/build file under version control and change what a Go task does without touching the pipeline config. In fact, </span></b><span style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">there are some advanced folks out there who use Puppet to push config changes to the Go Server and keep the entire config.xml under version control.</span></span><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-59287303868010504292012-08-17T17:12:00.000+05:302012-08-17T17:15:16.163+05:30Go illustratedThe official Go documentation explains some key <a href="http://www.thoughtworks-studios.com/docs/go/current/help/concepts_in_go.html" target="_blank">concepts</a> with the help of a nice diagram (reproduced below).<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5HqCpABqnW48dsT3gq6lsMFbFQGvw37Rr_-nH7p_f59XpBAmto5XKzISyKXAakzuY9U6BIBU2q-7ONF633SK1NCl85-lA6r4blpHWrBCn3jEotJycJyo6kWmNDPth5L6jxj7yLQp6GYk/s1600/go_concepts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="465" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5HqCpABqnW48dsT3gq6lsMFbFQGvw37Rr_-nH7p_f59XpBAmto5XKzISyKXAakzuY9U6BIBU2q-7ONF633SK1NCl85-lA6r4blpHWrBCn3jEotJycJyo6kWmNDPth5L6jxj7yLQp6GYk/s640/go_concepts.png" width="640" /></a></div>
Here is another <i>clickable</i> diagram that tries to tie in other important abstractions in Go. Blogger does something to my image map that makes it a little off - kindly excuse.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX5iyPndanB4UI3k1ZVAMNfs1MBfWiDDXFXlXDmAdw_DIddIGdqrRBnVE5nNbTlNZc2u0m41g6QiK7MBylf_Kdpp-AnVEeoZwfUfi_r7P8F_F7s4r9A1A7jk8XFIDpOa7FRiyS6s2Rp-0/s640/Go_abstractions.jpg" usemap="#goabsmap" />
<map name="goabsmap">
<area coords="285,45,445,76" href="http://www.thoughtworks-studios.com/docs/go/current/help/dev_authorization.html#pipeline-groups" shape="rect"></area>
<area coords="39,8,167,40" href="http://www.thoughtworks-studios.com/docs/go/current/help/server_details_page.html" shape="rect"></area>
<area coords="503,7,632,40" href="http://www.thoughtworks-studios.com/docs/go/current/help/installing_go_agent.html" shape="rect"></area>
<area coords="134,96,319,139" href="http://www.thoughtworks-studios.com/docs/go/current/help/managing_dependencies.html" shape="rect"></area>
<area coords="349,102,520,135" href="http://www.thoughtworks-studios.com/docs/go/current/help/environments_page.html" shape="rect"></area>
<area coords="590,104,704,137" href="http://www.thoughtworks-studios.com/docs/go/12.2/help/agent_details.html" shape="rect"></area>
<area coords="254,175,368,208" href="http://www.thoughtworks-studios.com/docs/go/current/help/quick_pipeline_setup.html" shape="rect"></area>
<area coords="102,230,215,265" href="http://www.thoughtworks-studios.com/docs/go/current/help/configuration_reference.html#materials" shape="rect"></area>
<area coords="190,287,302,319" href="http://www.thoughtworks-studios.com/docs/go/current/help/pipeline_templates.html" shape="rect"></area>
<area coords="7,334,120,368" href="http://www.thoughtworks-studios.com/docs/go/current/help/managing_artifacts_and_reports.html" shape="rect"></area>
<area coords="352,262,432,296" href="http://www.thoughtworks-studios.com/docs/go/current/help/stage_details_page.html" shape="rect"></area>
<area coords="422,333,488,368" href="http://www.thoughtworks-studios.com/docs/go/current/help/job_details_page.html" shape="rect"></area>
<area coords="480,399,543,421" href="http://www.thoughtworks-studios.com/docs/go/current/help/configuration_reference.html#tasks" shape="rect"></area></map></div>
<br />Briefly, a pipeline may be based off a template. Materials refer to source code repositories or other pipelines. A pipeline group is a grouping of pipelines for administrative convinience. It is useful to think of a directed graph of pipelines (say from build to functional-test to integration to performance to QA to UAT to staging to production) as your <i>continuous delivery value stream.</i> An environment represents a ring-fencing of agents and includes one or more pipelines. The unit of work is a job. Jobs may be tagged with required resources so that they run only on correspondingly tagged agents. Jobs can be made to publish artifacts that are then stored on the server.<br />
<br />
At first blush, it may appear overkill to have four levels of abstraction (pipeline, stage, job and task) for work execution. But the moment you start doing more than single team CI, they become indispensible. For instance, it is trivial to set up an <a href="http://cd-with-thoughtworks-go.blogspot.com/2012/07/traceability-with-upstream-pipeline.html">integration pipeline</a> that feeds off three upstream component pipelines and also feeds off a integration test repository. It is also easy to define different triggering behaviours for pipelines and stages. If we had only two abstractions, say jobs and stages, they'd be overloaded with different behaviour configurations for different contexts. Jobs and stages are primitives, they can and should be extended to achieve higher order abstractions. By doing so, we avoid primitive obsession at an architectural level.<br />
<br />
Also note that multiple instances of a given pipeline can run in parallel. Stages within a pipeline run in sequence. Jobs in a stage can run in parallel. Tasks within a job run in sequence. This alternating behaviour is designed deliberately so that you have the ability to parallelize and sequentialize your work as needed at two different levels of granularity.<div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-11712049674649665432012-07-24T16:33:00.000+05:302012-11-07T21:44:36.325+05:30Traceability with upstream pipeline labelingYou can get good traceability for your builds by using Go's custom pipeline labels effectively. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz5uMJg3NoGztE_1drlYOO4sHhlVpEMkclcc8lN5HU3l4xYGZ2b09_UrOT4l0uM0G18CXtf_5ywpCRmzX3col__Aq2q7nWdbJJ7SDi4-10xn9FOK31GXmPaSVSmAJlUCpH-CR5D5ck7zc/s1600/go-upstream-pipeline-labels.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiz5uMJg3NoGztE_1drlYOO4sHhlVpEMkclcc8lN5HU3l4xYGZ2b09_UrOT4l0uM0G18CXtf_5ywpCRmzX3col__Aq2q7nWdbJJ7SDi4-10xn9FOK31GXmPaSVSmAJlUCpH-CR5D5ck7zc/s1600/go-upstream-pipeline-labels.png" /></a></div>
<br />
In the above diagram, each box represents a pipeline. This is a situation where there are three teams whose work needs to be integrated under the umbrella of a project X. Each box has three lines of text with the following convention.<br />
<br />
Line 1 is the name of the pipeline<br />
Line 2 is the custom pipeline label spec (see diag below for how to specify)<br />
Line 3 is the resulting pipeline label after a certain run of the pipeline<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguHaeWZzwi8ZTU9pTxsFNqi2Id-uCMqlcyOFZVIJCwTKLM2oyHCL0Bdym5HTdZjuqERP5hdv5sKEOCFyPiZKG2Jsvkc1vtH6kyOMbot6Lh516mcuqNQpC1TGTKB-ml2S8ybwmLshweQLQ/s1600/upstream-labeling.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguHaeWZzwi8ZTU9pTxsFNqi2Id-uCMqlcyOFZVIJCwTKLM2oyHCL0Bdym5HTdZjuqERP5hdv5sKEOCFyPiZKG2Jsvkc1vtH6kyOMbot6Lh516mcuqNQpC1TGTKB-ml2S8ybwmLshweQLQ/s400/upstream-labeling.png" width="400" /></a></div>
<br />
So the general technique here is to simply use the upstream label for downstream pipelines with just one upstream dependency. For pipelines with multiple upstream dependencies (e.g. project-X-integration), you could use a combination of upstream labels and new prefixes.<div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-44997008007441674832012-07-10T20:05:00.001+05:302012-12-10T09:50:55.126+05:30Go environments<h3 dir="ltr" style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 21px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></b></h3>
<h4 dir="ltr" style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: #666666; font-family: Georgia; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Introduction</span></b></h4>
<div style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">A </span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/managing_environments.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Go-Environment</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> is a grouping of pipelines and agents. By assigning an agent to an environment, it will be used to run only those jobs that belong to the pipelines of that environment. An agent can belong to more than one environment but a pipeline can only belong to a single environment.</span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Once an agent is associated with one or more environments, it is no longer capable of picking up jobs on pipelines that do not belong to environments. Pipelines outside of environments will only be assigned to agents in the default pool (not associated with any environment).</span></b></div>
<div style="text-align: left;">
<br /></div>
<h3 dir="ltr" style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: #666666; font-family: Georgia; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">So what?</span></b></h3>
<div style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> </span></b></div>
<div style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">What does this grouping buy us? Independent of all other features, Go-environments allow us to:</span></b></div>
<ol style="margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: initial; vertical-align: baseline;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Ring-fence agents so that they are only available to certain pipelines</span></li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: initial; vertical-align: baseline;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Define environment variables at the level of an environment. They become available to tasks in all pipelines associated with the environment.</span></li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: initial; vertical-align: baseline;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Visualize pipeline activity from the point of view of an environment.</span></li>
</b></ol>
<div style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Let’s explore each of the above in some detail. Note, however, that the overall utility of Go-environments increases significantly when used along with other features such as pipeline locking, run-on-all-agents, timer-triggers, trigger-with-options, manual stages and pipeline templates and parameters.</span></b></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
</div>
<h3 style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><h4 dir="ltr">
<span style="background-color: transparent; color: #666666; font-family: Georgia; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Ring fencing agents</span></h4>
</b></h3>
<h3 style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> </span></b><b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Go-agents can play one of two roles. For build pipelines, they act as workers. For pipelines that are meant to do deployments, Go-agents can serve as agents of software installation/deployment/distribution. </span></b></h3>
<div style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"></b></div>
<ol style="margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: initial; vertical-align: baseline;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Let’s say<b> </b>we have a QA environment with 5 nodes and a performance test environment with 7 nodes. Now if we install a Go-Agent on each of our 12 nodes, then a typical deployment job will start with a fetch-artifact task and end with a deployment script that simply extracts and configures the artifact into the right set of directories. (Some would argue against having agents running on performance nodes but it doesn’t matter so much if you are interested in understanding performance variations rather than absolutes. Go-agent activity won’t vary between runs). In this configuration, Go has full knowledge of your environments and can display the most information about deployment activity. But this would also require the purchase of sufficient number of agent licenses.</span></li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: initial; vertical-align: baseline;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">With the increasing popularity of techniques like infrastructure-as-code, we may not want to run a Go-agent in addition to a Chef or Puppet agent on every node. In this configuration, the actual environments are managed by Chef Server or Puppet Master and Go-Agents are used to orchestrate configuration runs. We set up one orchestrator Go-Agent per target environment and authorize each agent to ssh (or winRM) to its corresponding set of target environment nodes. This configuration is also effective with agentless tools like Ansible. Just install Ansible along with Go-Agent on the orchestrating nodes.</span></li>
</b></ol>
<div style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">But can’t we achieve all this ring-fencing with resource tagging? Well, it can get very cumbersome. With tagging, you can say run this job on an agent with matching resources (tags). What if the job has no tags? It is then free to run on any agent. To work around this, we could attempt to assign tags to all jobs but it soon gets impractical. If you forget, the first run on the job may overwrite a deployment on some other tag-based environment. Also, this tag-every-job approach overloads the meaning of resources for the same job - one resource may stand for what software the agent is expected to have, the other stands for a logical partitioning - potentially confusing for users.</span></b></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
</div>
<h3 style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><h4 dir="ltr">
<span style="background-color: transparent; color: #666666; font-family: Georgia; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Environment Variables</span></h4>
<span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">You don't necessarily need Go-environments to use environment variables. These two are somewhat independent. Environment variables can be defined at environment/pipeline/stage/job level and can be dereferenced using ${env_var_name} inside a task definition. There are a bunch of predefined variables that may come in handy e.g. GO_PIPELINE_LABEL for suffixing versions to artifact names etc. Secondly, you can specify sensitive information (passwords, private keys etc) using the recently introduced </span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/deploy_a_specific_build_to_an_environment.html#secure_variables_section"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">secure</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> environment variable feature available at pipeline level. By the way, doing config via environment variables is considered a good thing by </span><a href="http://www.12factor.net/config"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">12factor</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">. Finally, note that one pipeline cannot belong to more than one environment at a time, so what is the use of defining variables at the Go-environment level versus pipeline level? Well, doing so makes the variables available to all pipelines in a given environment.</span></b></h3>
<h3 style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> </span></b></h3>
<h4 dir="ltr" style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<span style="background-color: transparent; color: #666666; font-family: Georgia; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Visualization</span></b></h4>
<div style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Here is a view of a static environment definition.</span><img height="177px;" src="https://lh6.googleusercontent.com/AjttzNDFxSP4zTCfgmnZ_pLNRmCqXtDx4t8xJ8BvECnd5nBft-wwUaaCCasFAaI2dkpFetrL3MMypqZS2UI7hVw1DZ-qAUrelFsdR_Fih5QLRj434AE" width="619px;" /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> </span></b></div>
<div style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">And here is a dyamic view of pipeline activity. Click compare to get a detailed listing of material changes that triggered this run. </span><img height="323px;" src="https://lh5.googleusercontent.com/BSFJ6kkMfmDJmwqkio-ohG0NvAN-9AFJV8nkrZEEfYKCq_hDYFamhF9ZtIbB8F6KY4XofUaLNWJpFNMmJbKILulk6mh0y7qngnXNrhZjtEzIZ19ei-I" width="232px;" /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">When combined with other features, you get the ability to:</span></b></div>
<ol style="margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: initial; vertical-align: baseline;"><b><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Easily r</span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/job_rerun.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">erun </span></a></b><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">jobs only on the servers that they failed on (</span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/admin_run_on_all_agents.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">run-on-all-agents</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">)</span></li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: initial; vertical-align: baseline;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;">Does it seem like a particular server always takes longer to deploy? That it fails more often? Easily check with the Agent job run </span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/agent_details.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">history</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> tab.</span></li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: initial; vertical-align: baseline;"><a href="http://www.thoughtworks-studios.com/docs/go/12.2/help/managing_a_build_cloud.html#pausing_agent"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Pause</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> an Agent to disable deployments to that node.</span></li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: decimal; text-decoration: initial; vertical-align: baseline;"><a href="http://www.thoughtworks-studios.com/docs/go/12.2/help/deploy_a_specific_build_to_an_environment.html#secure_variables_section"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Secure</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"> environment variables. You can find other ways but I think this is a good option. Works well when the person with permission to deploy (e.g.: "product owner") shouldn't have the production db password (who trusts product owners?)</span></li>
</b><b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
</b></ol>
<div style="text-align: left;">
<b id="internal-source-marker_0.8604430451523513" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
</b></div>
<div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-85645875121820233772012-06-29T10:23:00.000+05:302012-12-11T11:45:45.812+05:30Modeling higher order workflows with Go<br />
<div class="MsoNormal">
<span style="font-family: Georgia, serif; font-size: 12pt; line-height: 115%;">How do you use Go to address the following situation?<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Georgia, serif; font-size: 12pt; line-height: 115%;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Georgia, serif; font-size: 12pt; line-height: 115%;">Say your QAs do some manual exploratory testing in addition
to all the automation. They might want to have the last good build
automatically deployed to their test environment for them every morning so that they don’t have to spend time manually figuring out the last good build and
deploying it.</span></div>
<div class="MsoNormal">
<span style="font-family: Georgia, serif; font-size: 12pt; line-height: 115%;"><br /></span></div>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeKSNUiXPgwVNPFtE5Pjm-JDSoa6w8XCOvpeYTEicnbPHxnhUH_wjx6aI04YKRNo0IcAr87st4g_zqYukhLPrdYUi-O7pDbONFsofyuZiX59punmL5Oyw7cBmZCFVdoMCDtiv65aAwTkE/s1600/manual-first-stage.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="162" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeKSNUiXPgwVNPFtE5Pjm-JDSoa6w8XCOvpeYTEicnbPHxnhUH_wjx6aI04YKRNo0IcAr87st4g_zqYukhLPrdYUi-O7pDbONFsofyuZiX59punmL5Oyw7cBmZCFVdoMCDtiv65aAwTkE/s400/manual-first-stage.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Manual Stage Type</td></tr>
</tbody></table>
<div class="MsoNormal">
<span style="font-family: Georgia, serif; font-size: 12pt; line-height: 115%;">Simply creating a <a href="http://www.thoughtworks-studios.com/docs/go/current/help/managing_dependencies.html" target="_blank">downstream</a> deployment pipeline won’t do the
trick. For one, it would auto-schedule for every successful upstream build thus
wiping out the previous deployment and any testing in progress. To prevent auto-scheduling, you need to mark the first stage of the downstream pipeline as type <i>manual</i>.<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="font-family: Georgia, serif; font-size: 12pt; line-height: 115%;"><br /></span></div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
<span style="font-family: Georgia, serif; font-size: 12pt; line-height: 18px;">Next, you could set up a timer <a href="http://www.thoughtworks-studios.com/docs/go/current/help/configuration_reference.html#timer" target="_blank">spec</a> so that the <a href="http://www.thoughtworks-studios.com/docs/go/current/help/admin_timer.html" target="_blank">pipeline</a> schedules say every morning at 10:15am.</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD6ohllx31WCsKoa75SeFd_nL9qgtK26qeeIS7mUyGIMOSrDlidb-BV5e0KZq_GbWirppP1a8p0gSdR7NQWJdqJ9gs163bQKHvZLw_w86AYyHOe2e6hVWnEIl9REON0KxwjFEEeqsy4qs/s1600/cron-timer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjD6ohllx31WCsKoa75SeFd_nL9qgtK26qeeIS7mUyGIMOSrDlidb-BV5e0KZq_GbWirppP1a8p0gSdR7NQWJdqJ9gs163bQKHvZLw_w86AYyHOe2e6hVWnEIl9REON0KxwjFEEeqsy4qs/s400/cron-timer.png" width="400" /></a></div>
<div class="MsoNormal">
<span style="font-family: Georgia, serif;"><span style="line-height: 18px;"><br /></span></span></div>
<div class="MsoNormal">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoKTaf-z-x2rZehvMV5Q4Tat0KfA5DW3ALIVEcfnFjooz4m5jiuOZspNTnM11fwcYLbh2UaG47ByClqupcYviUcY5gDelsDHbwA7qYXk0rsUfTT3sm_HWgO7NJHh0vNatKXF20XaQsiWA/s1600/pause.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoKTaf-z-x2rZehvMV5Q4Tat0KfA5DW3ALIVEcfnFjooz4m5jiuOZspNTnM11fwcYLbh2UaG47ByClqupcYviUcY5gDelsDHbwA7qYXk0rsUfTT3sm_HWgO7NJHh0vNatKXF20XaQsiWA/s200/pause.png" width="200" /></a><span style="font-family: Georgia, serif;"><span style="line-height: 18px;">So far so good. Our deploy pipeline will now only schedule at 10:15am every day. But sometimes, the QAs want to continue testing a given build the next day. They don't want the next day's timer trigger to deploy a new build. One way to do this is to manually pause the pipeline. This will prevent the pipeline from scheduling until unpaused.</span></span></div>
<div class="MsoNormal">
<span style="font-family: Georgia, serif;"><span style="line-height: 18px;"><br /></span></span></div>
<div class="MsoNormal">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFJAdE3J2jO1q3FibnSMVuMXKAl_RU8s-fW4P_DpkSdl9RhPMW26U9GWqQFpqGQ9dONehqSu5OcEf_VFEt6gQj9MkzxDqpZyXQfrgbvHWBSUXwyJMW0Ide3Lx-6iQooTY9Yerx1kQLLZk/s1600/locked-pipeline.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFJAdE3J2jO1q3FibnSMVuMXKAl_RU8s-fW4P_DpkSdl9RhPMW26U9GWqQFpqGQ9dONehqSu5OcEf_VFEt6gQj9MkzxDqpZyXQfrgbvHWBSUXwyJMW0Ide3Lx-6iQooTY9Yerx1kQLLZk/s200/locked-pipeline.png" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A locked pipeline</td></tr>
</tbody></table>
<span style="font-family: Georgia, serif;"><span style="line-height: 18px;"><br /></span></span>
<span style="font-family: Georgia, serif;"><span style="line-height: 18px;"><br /></span></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8wEwPrVtPOqJzNCAejmJqWamMW2GaaN_0IDVLpE3BPCyRKxKxAMYzDtNQuQ9N8g_HTkMW3BzSGm5Ul47I9HtYs_u-FCYTNF3Vrvl-tDcBYTE7lwyoQrHLqI_ZOID9Puof3b10wtrZecE/s1600/manual-approval-stage.png" imageanchor="1" style="background-color: white; clear: right; display: inline !important; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"><img border="0" height="94" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8wEwPrVtPOqJzNCAejmJqWamMW2GaaN_0IDVLpE3BPCyRKxKxAMYzDtNQuQ9N8g_HTkMW3BzSGm5Ul47I9HtYs_u-FCYTNF3Vrvl-tDcBYTE7lwyoQrHLqI_ZOID9Puof3b10wtrZecE/s200/manual-approval-stage.png" width="200" /></a></div>
<span style="font-family: Georgia, serif;"><span style="line-height: 18px;">Another way to achieve this is to add another manual stage at the end and use <i>automatic pipeline <a href="http://www.thoughtworks-studios.com/docs/go/12.2/help/admin_lock_pipelines.html" target="_blank">locking</a>. </i></span></span><span style="font-family: Georgia, serif; line-height: 18px;">When auto locking is enabled in a multi-stage pipeline, the pipeline will only get scheduled if the previous run is complete.This may sound roundabout compared to simply pausing the pipeline. But it could serve a useful function. The final manual stage could serve as an indicator of successful exploratory testing. You could even treat this a restricted </span><a href="http://www.thoughtworks-studios.com/docs/go/12.2/help/dev_authorization.html#approvals" style="font-family: Georgia, serif; line-height: 18px;" target="_blank">approval</a><span style="font-family: Georgia, serif; line-height: 18px;"> privilege. Any pipelines further downstream will now only get scheduled after QAs give the go-ahead.</span><br />
<br />
<div style="text-align: left;">
<br /></div>
</div>
<div class="MsoNormal">
<span style="font-family: Georgia, serif;"><span style="line-height: 18px;">Finally, we need to consider the agents where stuff gets deployed. It is important to ring-fence the agents by defining an QA-exploratory-testing <a href="http://www.thoughtworks-studios.com/docs/go/current/help/managing_environments.html" target="_blank">environment</a>. It is also necessary to instruct all deployment jobs to <i>run on <a href="http://www.thoughtworks-studios.com/docs/go/current/help/admin_run_on_all_agents.html" target="_blank">all agents</a>.</i></span></span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcswZf_p12efyurOIx4-WOW44oih_cRqQ9y8EtGYbE3pdLqghNuFCBkYF4un-LiAMFkb0It4w-uLc-v3KZHqgCfFSfjK5xIohTKCDA-Yxy1bxp_XB4e2zgtFOGAvPKYorh691kehhgptA/s1600/run-on-all-agents.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcswZf_p12efyurOIx4-WOW44oih_cRqQ9y8EtGYbE3pdLqghNuFCBkYF4un-LiAMFkb0It4w-uLc-v3KZHqgCfFSfjK5xIohTKCDA-Yxy1bxp_XB4e2zgtFOGAvPKYorh691kehhgptA/s320/run-on-all-agents.png" width="265" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
</div>
<div class="MsoNormal">
<span style="font-family: Georgia, serif;"><span style="line-height: 18px;">Hopefully this illustrates the power of combining a number of <i>Go-primitives</i> to achieve higher order behaviour.</span></span></div>
<div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-30553072916636566712012-06-25T09:18:00.001+05:302012-12-11T11:51:04.493+05:30The power of pipeline templates and parameters<b id="internal-source-marker_0.34268626547418535" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"></b><br />
<b id="internal-source-marker_0.34268626547418535" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Pipeline </span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/pipeline_templates.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">templates</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">are usefu</span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">l when you need two pipelines to do the same things except that they build against different repositories or different branches of the same repository. This latter case is common. You might have a short lived branch and a long lived mainline. Using templates here is better than cloning the mainline pipeline because any future change to the template will automatically get reflected in both mainline and branch. On the other hand, you do want to clone if you want to simply start off as same and then diverge. e.g. perhaps your branch pipeline needs an extra stage.</span></b><br />
<h3 dir="ltr">
<b id="internal-source-marker_0.34268626547418535" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<span style="background-color: transparent; color: #4c1130; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Parameterized artifact names</span></b></h3>
<b id="internal-source-marker_0.34268626547418535" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Pipeline </span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/admin_use_parameters_in_configuration.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">parameters</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> allow for quite an impressive degree of customization. Say the mainline works against oracle-jdk and we create a branch to support open-jdk. We want the artifact names to reflect this. Just define a pipeline parameter called target_jdk in both pipelines with values oracle-jdk and open-jdk respectively.</span><img height="298px;" src="https://lh5.googleusercontent.com/JsWHkWvIfLPXva_oIsLchTYdYPMHsn8F64JFBfxEHqf4XMZ9z02lKj9250GjkoQBGxNzj0tHB8wIoeoQ0NDoFuEEJ4FtqUrDKSV4KJIuT4IaLtCd2yI" width="608px;" /><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Then, in the template, at the appropriate job, specify the name of the artifact as: myproduct_#{target-jdk}_$GO_PIPELINE_LABEL</span><img height="285px;" src="https://lh4.googleusercontent.com/vcUJAh7jUa__aeibkI4Mi_vu6Lwl_Mwi-FOwmOiLXXCpuMdGWxa9nV1KFL4trA1WQLuGrIXDTizOICKDeg2HEdoJLFg79fjOLG5yqy5CbPbdug_brUk" width="690px;" /></b><br />
<h3 dir="ltr">
<b id="internal-source-marker_0.34268626547418535" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<span style="background-color: transparent; color: #4c1130; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Parameterized job resources</span></b></h3>
<b id="internal-source-marker_0.34268626547418535" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Next, we want to make sure that the branch pipeline only executes on agents where open-jdk is available. We could do this by tagging all jobs in the template with parameterised </span><a href="http://www.thoughtworks-studios.com/docs/go/current/help/managing_a_build_cloud.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">resources</span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.</span><img height="214px;" src="https://lh5.googleusercontent.com/YN8Ho4ASbca3MsSJoZjdx5GF2BHziHwfg7Crr0ackqp6-vD7BUsd4CBI6nwq8_0qpPX1AjEsm1P5tEiRjuZpfgBX4B61lf-tKTeCeUypwLECffYOfto" width="566px;" /><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">There is a flip side of partitioning agents using resources. Now all jobs in all pipelines need to say via resources what kind of agents they should execute on. Othewise , a job without any resources specified is free to execute on an open-jdk agent or an oracle-jdk agent or any other agent. To achieve true ring-fencing, we need to use the </span><a href="http://cd-with-thoughtworks-go.blogspot.in/2012/07/go-environments.html"><span style="background-color: transparent; color: #1155cc; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">environments</span><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></a><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">feature in Go.</span><br /><h3 dir="ltr">
<span style="background-color: transparent; color: #4c1130; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Parameterized commands</span><img height="152px;" src="https://lh4.googleusercontent.com/7Khq0btyKHP5qaYD04LxXiOh1EYUfEKINp-51jLu5jZvMKNXUmY2cq3D3l3oI2E87IupMRNmh3pA7kOfTtVuQjNpzI4PXflVgwe980_tALI1Y6z7GIU" width="664px;" /><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">We could also parameterize the name of batch or shell script in a template job so that you can have a windows pipeline and a linux pipeline based off the same template.</span></h3>
<span style="background-color: white; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><span style="background-color: white; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><span style="background-color: white; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><h3 dir="ltr">
<span style="background-color: transparent; color: #4c1130; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Parameterized fetch artifact specification</span></h3>
<h3 dir="ltr">
<img height="367px;" src="https://lh6.googleusercontent.com/Cb4U9jw8sBfMGGjUnIr3e8s_OjPkBjF_JI5HldMp0d8IfhUAR1S9vbZUG-jAa0Cun6SoTXDwyGadSSJ-anH3RlJNGX8oj3exNsUkEvDO4TE0i6hcv9M" width="764px;" /><b id="internal-source-marker_0.34268626547418535" style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></b></h3>
<h3 dir="ltr">
<b id="internal-source-marker_0.34268626547418535" style="color: black; font-family: 'Times New Roman'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span style="background-color: transparent; color: black; font-family: Georgia; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">What if you have two (or more) templated pipelines that have different upstream pipelines? Each downstream pipeline would want to specify a different artifact to be fetched from parent. Parameters to the rescue again. Simple define a parameter called my-upstream in each of the templated downstream pipelines. Then use the parameter in the fetch artifact specification inside the template as shown above.</span></b></h3>
</b><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.comtag:blogger.com,1999:blog-7396422756801450152.post-27508171744798942192012-06-25T09:18:00.000+05:302012-06-25T09:18:32.599+05:30Introduction<span style="font-family: Georgia,"Times New Roman",serif;">This is meant to be an unofficial, unsupported blog about ThoughtWorks' agile release engineering, continuous delivery orchestrator tool called Go. The opinions expressed here are personal and not necessarily those of my employer.</span><div class="blogger-post-footer"><br/>
<a href="http://cd-with-thoughtworks-go.blogspot.in">blog home</a></div>sriramhttp://www.blogger.com/profile/01237485664035584743noreply@blogger.com