Skip to content

Latest commit

 

History

History
662 lines (570 loc) · 48.6 KB

File metadata and controls

662 lines (570 loc) · 48.6 KB
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]$

Azure DevOps

CI/CD the right way


Hello

$ryan = [Person]::new();

  • Automation Engineer @ itnetX 💻
  • PowerShell Enthusiast 🐱‍👤
  • blog @ dftai.ch
  • twitter @rd_bartram

  • don't forget to automate it!

who do we have here?

--

<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>

What is CICD?


CI
=
Continous Integration

--

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.

Azure Build Pipelines

--

Great!...
How do I do it?

--

CI
  • 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

--

CI

Key things to note

  • 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

CD
=
Continous Delivery

--

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.

Azure Release Pipelines

--

You sir, are a crazy person...

--

CI
  • 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!

--

CI

Change the culture

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

So what does this actually look like?

--

<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 &amp; 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 &amp; 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 &amp; 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>

--

CI

Super Cool Website

<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>

Cool...but how can I learn more?

--

Learning Material

  • Az Devops Blog
  • OpenEdx
  • Microsoft Professional Program
  • Your favourite blogger/youtuber

Thank You!

Platinum Sponsors

Gold Sponsors

Silver Sponsors