| theme | none |
|---|---|
| customTheme | assets/css/gabc |
| transition | slide |
| highlightTheme | darkula |
| loop | true |
| title | Azure DevOps: CI/CD the right way |
| autoSlideMethod | Reveal.navigateRight |
| separator | ^[\r\n?|\n]---[\r\n?|\n]$ |
| verticalSeparator | ^[\r\n?|\n]--[\r\n?|\n]$ |
CI/CD the right way
- Automation Engineer @ itnetX 💻
- PowerShell Enthusiast 🐱👤
- blog @ dftai.ch
- twitter @rd_bartram
- don't forget to automate it!
--
<style>.dev_circle,.ops_circle{fill:none;stroke-miterlimit:10;stroke-width:2px;}.dev_circle{stroke:url(#linear-gradient);}.dev_text_1{fill:url(#linear-gradient-2);}.dev_text_2{fill:url(#linear-gradient-4);}.dev_text_3{fill:url(#linear-gradient-5);}.ops_circle{stroke:url(#linear-gradient-6);}.ops_text_1{fill:url(#linear-gradient-7);}.ops_text_2{fill:url(#linear-gradient-8);}.ops_text_3{fill:url(#linear-gradient-9);}.care_circle{fill:url(#linear-gradient-10);}.care_text{fill:#fff;}</style> <title>who</title>
--
A development practice that requires developers to integrate code into a shared repository several times a day. Each check-in is then verified by an automated build, allowing teams to detect problems early.
--
--
- Maintain a single source repository
- Automate the build
- Make your build self-testing
- Every commit should build on an integration machine
- Keep the build fast
- Test in a clone of the production environment
- Make it easy for anyone to get the latest executable version
- Everyone can see what’s happening
- Automate deployment
--
- Check in frequently
- Don’t check in broken code
- Don’t check in untested code
- Don’t check in when the build is broken
- Don’t go home after checking in until
the system builds
--
Releasing software/infrastructure into production as soon as it passes the automated tests. By adopting both Continuous Integration and Continuous Deployment, you not only reduce risks and catch bugs quickly, but also move rapidly to working software.
--
--
- The process for releasing/deploying software MUST be repeatable and reliable
- If somethings difficult or painful, do it more often
- Keep everything in source control
- Smoke test your deployment
- Everybody has responsibility for the release process
- Done means "released"
- If anything fails, stop the line!
- Improve continuously
- Automate everything!
--
| Pathological (Power) | Bureaucratic (Rules) | Generative (Performance) |
|---|---|---|
| Low Cooperation | Modest Cooperation | High Cooperation |
| Messengers Shot | Messengers Neglected | Messengers Trained |
| Responsibilities Shirked | Narrow Responsibilities | Risks Are Shared |
| Bridging discouraged | Bridging tolerated | Bridging encouraged |
| Failure leads to scapegoating | Failure leads to justice | Failure leads to inquiry |
| Novelty crushed | Novelty leads to problems | Novelty implemented |
--
<style type="text/css"> .st0{fill:none;stroke:#979797;} .st1{fill:#4A4A4A;} .st2{font-family:'IBMPlexSans';} .st3{font-size:18px;} .st4{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Grad1);} .st5{fill:#FFFFFF;} .st6{fill-rule:evenodd;clip-rule:evenodd;fill:#4A4A4A;} .st7{fill:none;stroke:#4A4A4A;} .st8{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Grad2);} .st9{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Grad3);} .st10{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Grad4);} .st11{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Grad5);} .st12{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Grad6);} .st13{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Grad7);} .st14{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Grad8);} .st15{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Grad9);} .st16{fill-rule:evenodd;clip-rule:evenodd;fill:url(#Grad10);} .st17{fill:url(#Grad11);} .st18{fill:url(#Grad12);} .st19{fill:url(#Grad13);} .st20{fill:url(#Grad14);} .st21{fill:url(#Grad15);} .st22{fill:url(#Grad16);} .st23{fill:url(#Grad17);} .st24{fill:url(#Grad18);} .st25{fill:url(#Grad19);} .st26{fill:url(#Grad20);} .st27{fill:url(#Grad21);} </style><path id="Line" class="st0" d="M0,205h1529.5"/>
<g id="CM_x5F_Group" class="fragment fade-up" data-fragment-index="9">
<g id="text_8_">
<text transform="matrix(1 0 0 1 1322.171 271)" class="st1 st2 st3">Cheer & be Merry!</text>
<linearGradient id="Grad1" gradientUnits="userSpaceOnUse" x1="33.247" y1="292.753" x2="53.7531" y2="272.2469" gradientTransform="matrix(1 0 0 -1 1250 542)">
<stop offset="0" style="stop-color:#EC726E"/>6
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<circle class="st4" cx="1300.5" cy="266.5" r="14.5"/>
<text transform="matrix(1 0 0 1 1290.2 273)" class="st5 st2 st3">10</text>
</g>
<g id="stick_8_">
<circle id="Oval-4-Copy-4" class="st6" cx="1411" cy="205" r="7"/>
<path id="Path-3-Copy-4" class="st7" d="M1411,255v-51"/>
</g>
</g>
<g id="DP_x5F_Group" class="fragment fade-down" data-fragment-index="8">
<g id="text_7_">
<text transform="matrix(1 0 0 1 1159.0811 143)" class="st1 st2 st3">Deploy to Production</text>
<linearGradient id="Grad2" gradientUnits="userSpaceOnUse" x1="4.247" y1="285.7531" x2="24.753" y2="265.2469" gradientTransform="matrix(1 0 0 -1 1118 414)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<circle class="st8" cx="1132.5" cy="138.5" r="14.5"/>
<text transform="matrix(1 0 0 1 1127 144)" class="st5 st2 st3">9</text>
</g>
<g id="stick_7_">
<circle class="st6" cx="1213" cy="204" r="7"/>
<path class="st7" d="M1212.8,204.1v-51"/>
</g>
</g>
<g id="Integ_x5F_Group" class="fragment fade-up" data-fragment-index="7">
<g id="text_6_">
<text transform="matrix(1 0 0 1 997.4131 273)" class="st1 st2 st3">Run Auto. Integration Tests</text>
<linearGradient id="Grad3" gradientUnits="userSpaceOnUse" x1="4.247" y1="285.7531" x2="24.753" y2="265.2469" gradientTransform="matrix(1 0 0 -1 953 542)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<circle class="st9" cx="967.5" cy="266.5" r="14.5"/>
<text transform="matrix(1 0 0 1 962.1 272)" class="st5 st2 st3">8</text>
</g>
<g id="stick_6_">
<circle id="Oval-4-Copy-3" class="st6" cx="1073" cy="206" r="7"/>
<path id="Path-3-Copy-3" class="st7" d="M1073,258v-51"/>
</g>
</g>
<g id="DI_x5F_Group" class="fragment fade-down" data-fragment-index="6">
<g id="text_5_">
<text transform="matrix(1 0 0 1 901.0969 145)" class="st1 st2 st3">Deploy to integration</text>
<linearGradient id="Grad4" gradientUnits="userSpaceOnUse" x1="4.247" y1="285.7531" x2="24.753" y2="265.2469" gradientTransform="matrix(1 0 0 -1 859 414)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<circle class="st10" cx="873.5" cy="138.5" r="14.5"/>
<text transform="matrix(1 0 0 1 868.1 144)" class="st5 st2 st3">7</text>
</g>
<g id="stick_5_">
<circle class="st6" cx="926" cy="205" r="7"/>
<path class="st7" d="M925.8,205.1v-51"/>
</g>
</g>
<g id="TRM_x5F_Group" class="fragment fade-up" data-fragment-index="5">
<g id="text_4_">
<text transform="matrix(1 0 0 1 722.149 273)" class="st1 st2 st3">Tests, Review & Merge</text>
<linearGradient id="Grad5" gradientUnits="userSpaceOnUse" x1="4.247" y1="285.7531" x2="24.753" y2="265.2469" gradientTransform="matrix(1 0 0 -1 675 542)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<circle class="st11" cx="689.5" cy="266.5" r="14.5"/>
<text transform="matrix(1 0 0 1 684.1 272)" class="st5 st2 st3">6</text>
</g>
<g id="stick_4_">
<circle class="st6" cx="813" cy="205" r="7"/>
<path class="st7" d="M813,255v-51"/>
</g>
</g>
<g id="PR_x5F_Group" class="fragment fade-down" data-fragment-index="4">
<g id="text_3_">
<text transform="matrix(1 0 0 1 615.184 145)" class="st1 st2 st3">Create Pull Request</text>
<linearGradient id="Grad6" gradientUnits="userSpaceOnUse" x1="4.247" y1="285.7531" x2="24.753" y2="265.2469" gradientTransform="matrix(1 0 0 -1 572 414)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<circle class="st12" cx="586.5" cy="138.5" r="14.5"/>
<text transform="matrix(1 0 0 1 581.1 144)" class="st5 st2 st3">5</text>
</g>
<g id="stick_3_">
<circle class="st6" cx="668" cy="205" r="7"/>
<path class="st7" d="M667.8,205.1v-51"/>
</g>
</g>
<g id="CP_x5F_Group" class="fragment fade-up" data-fragment-index="3">
<g>
<text transform="matrix(1 0 0 1 490.338 273)" class="st1 st2 st3">Commit & Push</text>
<linearGradient id="Grad7" gradientUnits="userSpaceOnUse" x1="4.247" y1="285.7531" x2="24.753" y2="265.2469" gradientTransform="matrix(1 0 0 -1 447 542)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<circle class="st13" cx="461.5" cy="266.5" r="14.5"/>
<text transform="matrix(1 0 0 1 456.1 272)" class="st5 st2 st3">4</text>
</g>
<g>
<circle class="st6" cx="529" cy="205" r="7"/>
<path class="st7" d="M529,255v-51"/>
</g>
</g>
<g id="CCTR_x5F_Group" class="fragment fade-down" data-fragment-index="2">
<g id="text_2_">
<text transform="matrix(1 0 0 1 319.026 145)" class="st1 st2 st3">Clone, Code, Test, Repeat!</text>
<linearGradient id="Grad8" gradientUnits="userSpaceOnUse" x1="4.247" y1="285.7531" x2="24.753" y2="265.2469" gradientTransform="matrix(1 0 0 -1 279 414)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<circle class="st14" cx="293.5" cy="138.5" r="14.5"/>
<text transform="matrix(1 0 0 1 288.1 144)" class="st5 st2 st3">3</text>
</g>
<g id="stick_2_">
<circle class="st6" cx="391" cy="205" r="7"/>
<path class="st7" d="M390.8,205.1v-51"/>
</g>
</g>
<g id="FB_x5F_Group" class="fragment fade-up" data-fragment-index="1">
<g id="text_1_">
<text transform="matrix(1 0 0 1 191.467 273)" class="st1 st2 st3">Create Feature Branch</text>
<linearGradient id="Grad9" gradientUnits="userSpaceOnUse" x1="4.247" y1="285.7531" x2="24.753" y2="265.2469" gradientTransform="matrix(1 0 0 -1 148 542)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<circle class="st15" cx="162.5" cy="266.5" r="14.5"/>
<text transform="matrix(1 0 0 1 157.1 272)" class="st5 st2 st3">2</text>
</g>
<g id="stick_1_">
<circle class="st6" cx="240" cy="205" r="7"/>
<path class="st7" d="M240,255v-51"/>
</g>
</g>
<g id="WI_x5F_Group" class="fragment fade-down" data-fragment-index="0">
<g id="text">
<text transform="matrix(1 0 0 1 42.47 145)" class="st1 st2 st3">Create Work Item</text>
<linearGradient id="Grad10" gradientUnits="userSpaceOnUse" x1="4.247" y1="285.7531" x2="24.753" y2="265.2469" gradientTransform="matrix(1 0 0 -1 0 414)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<circle class="st16" cx="14.5" cy="138.5" r="14.5"/>
<text transform="matrix(1 0 0 1 9.1 144)" class="st5 st2 st3">1</text>
</g>
<g id="stick">
<circle class="st6" cx="107" cy="205" r="7"/>
<path class="st7" d="M106.8,205.1v-51"/>
</g>
</g>
<g id="Title">
<linearGradient id="Grad11" gradientUnits="userSpaceOnUse" x1="3.7034" y1="279.0431" x2="81.1716" y2="201.5749" gradientTransform="matrix(1 0 0 -1 0 282)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<path class="st17" d="M2.7,8.7C2.7,3.1,5.2,0,9.4,0c2.8,0,4.7,1.3,5.8,3.7l-1.6,1C12.9,3,11.5,1.8,9.5,1.8C6.6,1.8,4.9,4,4.9,7.5
V10c0,3.4,1.7,5.5,4.6,5.5c2.1,0,3.6-1.2,4.3-3l1.6,1c-1.1,2.4-3.1,3.8-5.9,3.8C5.2,17.3,2.7,14.3,2.7,8.7z"/>
<linearGradient id="Grad12" gradientUnits="userSpaceOnUse" x1="9.5022" y1="284.8478" x2="86.9704" y2="207.3797" gradientTransform="matrix(1 0 0 -1 0 282)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<path class="st18" d="M17.6,17v-1.7H20V1.9h-2.4V0.2h6.7v1.7H22v13.4h2.4V17H17.6z"/>
<linearGradient id="Grad13" gradientUnits="userSpaceOnUse" x1="15.9754" y1="291.3211" x2="93.4436" y2="213.8529" gradientTransform="matrix(1 0 0 -1 0 282)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<path class="st19" d="M27.2,8.7c0-5.6,2.5-8.8,6.7-8.8c2.8,0,4.7,1.3,5.8,3.7l-1.6,1C37.4,2.9,36,1.7,34,1.7
c-2.9,0-4.6,2.3-4.6,5.7V10c0,3.4,1.7,5.5,4.6,5.5c2.1,0,3.6-1.2,4.3-3l1.6,1c-1.1,2.4-3.1,3.8-5.9,3.8
C29.7,17.3,27.2,14.3,27.2,8.7z"/>
<linearGradient id="Grad14" gradientUnits="userSpaceOnUse" x1="22.6145" y1="297.9602" x2="100.0827" y2="220.492" gradientTransform="matrix(1 0 0 -1 0 282)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<path class="st20" d="M42.9,0.2h5.6c4.2,0,6.9,2.8,6.9,8.4S52.7,17,48.5,17h-5.6V0.2z M48.6,15.2c2.8,0,4.7-1.9,4.7-5.2V7.3
c0-3.3-1.9-5.2-4.7-5.2H45v13.2h3.6V15.2z"/>
<linearGradient id="Grad15" gradientUnits="userSpaceOnUse" x1="33.6023" y1="308.948" x2="111.0705" y2="231.4798" gradientTransform="matrix(1 0 0 -1 0 282)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<path class="st21" d="M64.7,17V0.2h6.7c3,0,4.7,1.8,4.7,4.8s-1.7,4.8-4.7,4.8h-4.7V17H64.7z M66.7,8.1h4.7c1.6,0,2.5-0.9,2.5-2.4
V4.4C73.9,2.9,73,2,71.4,2h-4.7C66.7,2,66.7,8.1,66.7,8.1z"/>
<linearGradient id="Grad16" gradientUnits="userSpaceOnUse" x1="39.0522" y1="314.3979" x2="116.5203" y2="236.9296" gradientTransform="matrix(1 0 0 -1 0 282)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<path class="st22" d="M79.1,17V4.6H81v2.3h0.1c0.4-1.2,1.6-2.3,3.6-2.3h0.7v1.9h-1.1c-2.1,0-3.3,0.9-3.3,2.1V17H79.1z"/>
<linearGradient id="Grad17" gradientUnits="userSpaceOnUse" x1="44.2256" y1="319.5713" x2="121.6938" y2="242.1031" gradientTransform="matrix(1 0 0 -1 0 282)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<path class="st23" d="M87,10.8c0-3.9,2.3-6.5,5.6-6.5c3.3,0,5.6,2.5,5.6,6.5s-2.3,6.5-5.6,6.5C89.2,17.3,87,14.7,87,10.8z
M96.1,11.7V9.9c0-2.6-1.5-3.9-3.5-3.9C90.5,6,89,7.3,89,9.9v1.8c0,2.6,1.5,3.9,3.5,3.9C94.6,15.6,96.1,14.3,96.1,11.7z"/>
<linearGradient id="Grad18" gradientUnits="userSpaceOnUse" x1="50.8596" y1="326.2054" x2="128.3278" y2="248.7371" gradientTransform="matrix(1 0 0 -1 0 282)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<path class="st24" d="M100.4,10.8c0-4,2-6.5,5.5-6.5c2.4,0,3.9,1.2,4.6,2.9L108.9,8c-0.5-1.3-1.5-2-3-2c-2.3,0-3.5,1.6-3.5,3.7v2.1
c0,2.2,1.2,3.7,3.5,3.7c1.6,0,2.7-0.7,3.4-2.2l1.4,0.9c-0.8,1.8-2.4,2.9-4.8,2.9C102.4,17.3,100.4,14.8,100.4,10.8z"/>
<linearGradient id="Grad19" gradientUnits="userSpaceOnUse" x1="56.9737" y1="332.3194" x2="134.4419" y2="254.8512" gradientTransform="matrix(1 0 0 -1 0 282)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<path class="st25" d="M112.5,10.8c0-3.9,2.2-6.5,5.6-6.5c3.3,0,5.4,2.5,5.4,6v0.9h-8.9v0.6c0,2.1,1.4,3.7,3.7,3.7
c1.6,0,2.8-0.8,3.4-2.1l1.4,1c-0.8,1.7-2.6,2.8-4.9,2.8C114.7,17.3,112.5,14.7,112.5,10.8z M114.5,9.7v0.2h6.8V9.6
c0-2.2-1.3-3.6-3.3-3.6C115.9,5.9,114.5,7.5,114.5,9.7z"/>
<linearGradient id="Grad20" gradientUnits="userSpaceOnUse" x1="62.9754" y1="338.3211" x2="140.4436" y2="260.8529" gradientTransform="matrix(1 0 0 -1 0 282)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<path class="st26" d="M125.4,14.9l1.4-1.1c1,1.2,2.1,1.9,3.7,1.9c1.6,0,2.6-0.7,2.6-2c0-1-0.5-1.7-2.2-1.9l-1-0.1
c-2.3-0.3-4-1.3-4-3.6c0-2.4,1.9-3.6,4.4-3.6c2,0,3.3,0.7,4.3,2l-1.3,1.2c-0.6-0.8-1.6-1.5-3.2-1.5c-1.6,0-2.4,0.7-2.4,1.9
s0.8,1.7,2.4,1.9l1,0.1c2.7,0.4,3.8,1.6,3.8,3.5c0,2.4-1.8,3.9-4.6,3.9C128,17.3,126.5,16.3,125.4,14.9z"/>
<linearGradient id="Grad21" gradientUnits="userSpaceOnUse" x1="68.8257" y1="344.1714" x2="146.2939" y2="266.7032" gradientTransform="matrix(1 0 0 -1 0 282)">
<stop offset="0" style="stop-color:#EC726E"/>
<stop offset="1" style="stop-color:#FBB236"/>
</linearGradient>
<path class="st27" d="M137.1,14.9l1.4-1.1c1,1.2,2.1,1.9,3.7,1.9c1.6,0,2.6-0.7,2.6-2c0-1-0.5-1.7-2.2-1.9l-1-0.1
c-2.3-0.3-4-1.3-4-3.6c0-2.4,1.9-3.6,4.4-3.6c2,0,3.3,0.7,4.3,2l-1.3,1c-0.6-0.8-1.6-1.5-3.2-1.5c-1.6,0-2.4,0.7-2.4,1.9
s0.8,1.7,2.4,1.9l1,0.1c2.7,0.4,3.8,1.6,3.8,3.5c0,2.4-1.8,3.9-4.6,3.9C139.7,17.3,138.2,16.3,137.1,14.9z"/>
</g>
--
<ul class="definition__list">
<li class="demo__listItem fragment fade-right">Repo hosted on <img style="height: 1em" data-src="assets/github.png"> DFTAI/CICDExample</li>
<li class="demo__listItem fragment fade-right">Hosted in <img style="height: 1.5em" data-src="assets/azure_blue.svg"></li>
<li class="demo__listItem fragment fade-right">Deployed and tested with PowerShell in <img style="height: 1.5em" data-src="assets/azdevops.svg"></li>
</ul>
--
- Az Devops Blog
- OpenEdx
- Microsoft Professional Program
- Your favourite blogger/youtuber






