diff options
| author | Monty Taylor <mordred@inaugust.com> | 2016-10-06 07:13:44 +0200 |
|---|---|---|
| committer | Monty Taylor <mordred@inaugust.com> | 2016-10-06 07:47:33 +0200 |
| commit | 46d929fad9cd6363b6ce8d3f440183fad96ae95d (patch) | |
| tree | bc73abab61c9570af19a9cadf801aa02c47c4c55 /src/talks | |
| parent | e2f00edda0c8a768879682da23f8a62c1f00bf36 (diff) | |
Add talk for LinuxConf Europe
Diffstat (limited to 'src/talks')
| -rw-r--r-- | src/talks/test-it-like-you-deploy-it.hbs | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/src/talks/test-it-like-you-deploy-it.hbs b/src/talks/test-it-like-you-deploy-it.hbs new file mode 100644 index 0000000..808cad8 --- /dev/null +++ b/src/talks/test-it-like-you-deploy-it.hbs | |||
| @@ -0,0 +1,346 @@ | |||
| 1 | <!doctype html> | ||
| 2 | <html lang="en"> | ||
| 3 | |||
| 4 | <head> | ||
| 5 | <meta charset="utf-8"> | ||
| 6 | |||
| 7 | <title>Test it like you Deploy It</title> | ||
| 8 | |||
| 9 | </head> | ||
| 10 | <body> | ||
| 11 | |||
| 12 | <section id="who-am-i-redhat" class="slide level2"> | ||
| 13 | <h1>Who am I?</h1> | ||
| 14 | <img style="float:right; margin:24pt" src="/images/Logo_RH_CMYK_Default.jpg" /> | ||
| 15 | <p> Office of Technology </p> | ||
| 16 | <p> Zuul </p> | ||
| 17 | <p> Ansible </p> | ||
| 18 | </section> | ||
| 19 | |||
| 20 | <section id="who-am-i-openstack" class="slide level2"> | ||
| 21 | <h1>Who am I?</h1> | ||
| 22 | <img style="float:right; margin-right:24pt; width:300px; height: auto" src="/images/openstack-cloud-software-vertical-large.png" /> | ||
| 23 | <p>Technical Committee</p> | ||
| 24 | <p>Foundation Board of Directors</p> | ||
| 25 | <p>Developer Infrastructure Core Team</p> | ||
| 26 | </section> | ||
| 27 | |||
| 28 | <section id="what-are-we-going-to-talk-about" class="slide level2"> | ||
| 29 | <h1>What are we going to talk about?</h1> | ||
| 30 | <ul> | ||
| 31 | <li>Zuul</li> | ||
| 32 | <li>Ansible</li> | ||
| 33 | </ul> | ||
| 34 | </section> | ||
| 35 | |||
| 36 | <section id="what-is-zuul" class="slide level2"> | ||
| 37 | <h1>What is Zuul?</h1> | ||
| 38 | <ul> | ||
| 39 | <li>Multi-cloud, scalable, elastic CI/CD engine</li> | ||
| 40 | <li>Validation of speculative future states</li> | ||
| 41 | <li>Single-use VM build nodes - safely run tests that need root</li> | ||
| 42 | <li>Multi-node builds</li> | ||
| 43 | <li>Multi-repo projects</li> | ||
| 44 | <li>Native support for gating configuration</li> | ||
| 45 | </ul> | ||
| 46 | </section> | ||
| 47 | |||
| 48 | <section id="terminoloy" class="slide level2"> | ||
| 49 | <h1>Terminology</h1> | ||
| 50 | <ul> | ||
| 51 | <li>Periodic: jobs run in response to a timer</li> | ||
| 52 | <li>Post: jobs run after a change</li> | ||
| 53 | <li>Check: job run when someone proposes a change</li> | ||
| 54 | <li>Gate: jobs run between change approval and landing</li> | ||
| 55 | </ul> | ||
| 56 | </section> | ||
| 57 | |||
| 58 | <section id="why" class="slide level2"> | ||
| 59 | <h1>Why?</h1> | ||
| 60 | <h2> The original OpenStack use case</h2> | ||
| 61 | <ul> | ||
| 62 | <li>Fully automated gated commits</li> | ||
| 63 | <li>Full end-to-end integration tests from scratch for every commit</li> | ||
| 64 | <li>Massive scale</li> | ||
| 65 | </ul> | ||
| 66 | </section> | ||
| 67 | |||
| 68 | <section id="openstack-scale" class="slide level2"> | ||
| 69 | <h1> OpenStack Scale by the numbers</h1> | ||
| 70 | <ul> | ||
| 71 | <li>2 KJPH (kilo-jobs / hour)</li> | ||
| 72 | <li>2376 arbitrary developers</li> | ||
| 73 | <li>1474 git repositories</li> | ||
| 74 | <li>11727 Jobs</li> | ||
| 75 | <li>Merge 10k Changes / Month</li> | ||
| 76 | </ul> | ||
| 77 | <p class='fragment'>ansible has <em>received</em> 13171 PRs (changes), | ||
| 78 | has merged 8190 of them and has 37788 commits in its entire lifetime</p> | ||
| 79 | </section> | ||
| 80 | |||
| 81 | <section id="speculative-execution" class="slide level2"> | ||
| 82 | <h1>Multi Repository Speculative Execution</h1> | ||
| 83 | <ul> | ||
| 84 | <li>Zuul constructs speculative states as-if a change were merged</li> | ||
| 85 | <li>Tests future states without landing those changes first</li> | ||
| 86 | <li>The as-if spans multiple repos</li> | ||
| 87 | <li>In the Gate pipeline, speculative changes are put into a | ||
| 88 | virtual serial queue, then tested in parallel as-if each change | ||
| 89 | combination in front of them had landed</li> | ||
| 90 | </ul> | ||
| 91 | </section> | ||
| 92 | |||
| 93 | <section id="animation" class="slide level2"> | ||
| 94 | <h1>Zuul Animation</h1> | ||
| 95 | <a href='http://docs.openstack.org/infra/publications/zuul/#(18)'>http://docs.openstack.org/infra/publications/zuul/#(18)</a> | ||
| 96 | </section> | ||
| 97 | |||
| 98 | <section id="depends-on" class="slide level2"> | ||
| 99 | <h1>Multi-Repo Dependencies</h1> | ||
| 100 | <pre><code> | ||
| 101 | commit 30039f04109efa2263aba6eb302a29bd8d5e8f53 | ||
| 102 | Author: Monty Taylor | ||
| 103 | Date: Mon Sep 26 14:14:15 2016 -0500 | ||
| 104 | |||
| 105 | Add simple field for disabled flavors | ||
| 106 | |||
| 107 | When we were equalizing out the old silly names from the new pretty | ||
| 108 | ones, we missed disabled. | ||
| 109 | |||
| 110 | Change-Id: I4cbf5f7c27f640c566460c18951ab9030aae84e4 | ||
| 111 | Depends-On: I523e0ab6e376f5ff6205b1cc1748aa6d546919cb | ||
| 112 | </code></pre> | ||
| 113 | </section> | ||
| 114 | |||
| 115 | <section id="depends-on" class="slide level2"> | ||
| 116 | <h1>Multi-Repo Dependencies - an example</h1> | ||
| 117 | <ul> | ||
| 118 | <li>shade library runs functional tests against openstack</li> | ||
| 119 | <li>neutron change breaks shade tests (more later)</li> | ||
| 120 | <li>neutron fix is proposed</li> | ||
| 121 | <li>shade change Depends-On proposed neutron change</li> | ||
| 122 | <li>shade tests are run as-if neutron change has landed</li> | ||
| 123 | <li>shade change cannot land until neutron change lands</li> | ||
| 124 | </ul> | ||
| 125 | </section> | ||
| 126 | |||
| 127 | <section id="depends-on" class="slide level2"> | ||
| 128 | <h1>Isn't this supposed to prevent neutron from breaking shade?</h1> | ||
| 129 | <ul> | ||
| 130 | <li>shade and neutron do not share a gating relationship</li> | ||
| 131 | <li>shade has, by choice, a test that tests against master of OpenStack</li> | ||
| 132 | <li>Such a test is 'risky' to shade devs</li> | ||
| 133 | <li>shade devs desire the risk - can work around breaks, or submit bugs</li> | ||
| 134 | </ul> | ||
| 135 | </section> | ||
| 136 | |||
| 137 | <section id="not-specific" class="slide level2"> | ||
| 138 | <h1>Not Specific to OpenStack</h1> | ||
| 139 | <ul> | ||
| 140 | <li>"Gate" and "Check" are merely configurations</li> | ||
| 141 | <li>50+ OpenStack Vendors use Zuul for "3rd Party CI" of drivers</li> | ||
| 142 | <li>Wikimedia uses Zuul</li> | ||
| 143 | </ul> | ||
| 144 | </section> | ||
| 145 | |||
| 146 | <section id="status-pages" class="slide level2"> | ||
| 147 | <h1>Status Pages</h1> | ||
| 148 | <p><a href="https://integration.wikimedia.org/zuul/"> | ||
| 149 | https://integration.wikimedia.org/zuul/</a></p> | ||
| 150 | <p><a href="http://status.openstack.org/zuul/"> | ||
| 151 | http://status.openstack.org/zuul/</a></p> | ||
| 152 | </section> | ||
| 153 | |||
| 154 | <section id="pluggable" class="slide level2"> | ||
| 155 | <h1>Pluggable</h1> | ||
| 156 | <ul> | ||
| 157 | <li>Triggers</li> | ||
| 158 | <li>Reporters</li> | ||
| 159 | <li>Node Providers</li> | ||
| 160 | <li>Execution content</li> | ||
| 161 | </ul> | ||
| 162 | </section> | ||
| 163 | |||
| 164 | <section id="zuul-v2" class="slide level2"> | ||
| 165 | <h1>Zuul v2</h1> | ||
| 166 | <ul> | ||
| 167 | <li>In production for OpenStack for 4 years</li> | ||
| 168 | <li>What most people run</li> | ||
| 169 | <li>Triggers: Gerrit, Periodic</li> | ||
| 170 | <li>Reporters: Gerrit, Email, MySQL</li> | ||
| 171 | <li>Node Providers: Elastic OpenStack Nodepool, Static servers</li> | ||
| 172 | <li>Jobs executed by Jenkins</li> | ||
| 173 | </ul> | ||
| 174 | </section> | ||
| 175 | |||
| 176 | <section id="v2-architecture" class="slide level2"> | ||
| 177 | <p><img src="/images/infra_architecture.jpg" alt="image" /></p> | ||
| 178 | </section> | ||
| 179 | |||
| 180 | <section id="zuul-v2.5" class="slide level2"> | ||
| 181 | <h1>Zuul v2.5</h1> | ||
| 182 | <ul> | ||
| 183 | <li>In use only by OpenStack (on purpose)</li> | ||
| 184 | <li>Replaced Jenkins with Ansible</li> | ||
| 185 | <li>Jobs still written using JJB - playbooks generated on the fly</li> | ||
| 186 | </ul> | ||
| 187 | <p><a href='http://logs.openstack.org/09/352209/7/check/gate-networking-ovn-python35/0fae86c/_zuul_ansible/'> | ||
| 188 | http://logs.openstack.org/09/352209/7/check/gate-networking-ovn-python35/0fae86c/_zuul_ansible/ | ||
| 189 | </a></p> | ||
| 190 | </section> | ||
| 191 | |||
| 192 | <section id="replace-jenkins" class="slide level2"> | ||
| 193 | <h1>Why Replace Jenkins?</h1> | ||
| 194 | </section> | ||
| 195 | |||
| 196 | <section id="no-lack-of-trying" class="slide level2"> | ||
| 197 | <h1>Not for lack of trying</h1> | ||
| 198 | <ul> | ||
| 199 | <li>OpenStack started on Jenkins (actually, on Hudson, remember that?)</li> | ||
| 200 | <li>We funded the Jenkins JClouds Plugin</li> | ||
| 201 | <li>We did deep dev in the Gerrit Trigger Plugin</li> | ||
| 202 | <li>Maintain the SCP artifact plugin (added console log support)</li> | ||
| 203 | <li>Added 0mq notification plugin</li> | ||
| 204 | <li>Added Gearman Worker plugin - allowed us to grow to 8 Masters/1000 slaves</li> | ||
| 205 | <li>We wrote Jenkins Job Builder</li> | ||
| 206 | </ul> | ||
| 207 | </section> | ||
| 208 | |||
| 209 | <section id="problems" class="slide level2"> | ||
| 210 | <h1>Before I answer that ...</h1> | ||
| 211 | <p>The world is a better place with Jenkins existing</p> | ||
| 212 | </section> | ||
| 213 | |||
| 214 | <section id="problems" class="slide level2"> | ||
| 215 | <h1>Jenkins Problems</h1> | ||
| 216 | <p>Security</p> | ||
| 217 | <ul> | ||
| 218 | <li>don't run WebUI on the internet</li> | ||
| 219 | <li> ssh slave plugin - it's possible for a slave to run arbitrary | ||
| 220 | code on the master</li> | ||
| 221 | </ul> | ||
| 222 | <p>Stability</p> | ||
| 223 | <ul><li>almost every Jenkins upgrade has broken us</li></ul> | ||
| 224 | <p>Scalability</p> | ||
| 225 | <ul> | ||
| 226 | <li>Jenkins has global mutexes, especially in plugins</li> | ||
| 227 | <li>Extra large cloud server could handle ~100 concurrent jobs</li> | ||
| 228 | <li>We ran 8 Jenkins Masters with slaves sharded across them</li> | ||
| 229 | </ul> | ||
| 230 | <p>Overkill</p> | ||
| 231 | <ul><li>we only used it as a remote shell execution engine</li></ul> | ||
| 232 | </section> | ||
| 233 | |||
| 234 | <section id="better-engine" class="slide level2"> | ||
| 235 | <h1>We know a better engine for remote execution</h1> | ||
| 236 | </section> | ||
| 237 | |||
| 238 | <section id="zuul-v3-architecture" class="slide level2"> | ||
| 239 | <p><img src="/images/infra-zuul-architecture.png" alt="image" /></p> | ||
| 240 | </section> | ||
| 241 | |||
| 242 | <section id="zuul-v3" class="slide level2"> | ||
| 243 | <h1>Zuul V3</h1> | ||
| 244 | <h2>Test things like you deploy them</h2> | ||
| 245 | <ul> | ||
| 246 | <li>Intended for broad use</li> | ||
| 247 | <li>Jobs written in and executed with ansible</li> | ||
| 248 | <li>Fully support Bare Metal, VMs and Containers</li> | ||
| 249 | <li>Add GitHub PR Support</li> | ||
| 250 | <li>Add AWS and GCE Node Provider Support</li> | ||
| 251 | <li>Multi-node build clusters as first class resource</li> | ||
| 252 | <li>Docker and Kubernetes Build Resources</li> | ||
| 253 | <li>Multi-Tenant</li> | ||
| 254 | <li>In-repo config</li> | ||
| 255 | <li>Self-testing tests</li> | ||
| 256 | </ul> | ||
| 257 | </section> | ||
| 258 | |||
| 259 | <section id="ansible-execution" class="slide level2"> | ||
| 260 | <h1> Ansible execution </h1> | ||
| 261 | <h2>Merge the mergers and the launchers</h2> | ||
| 262 | <ul> | ||
| 263 | <li>Constructs relevant repo states and inventory</li> | ||
| 264 | <li>Push repos to test nodes</li> | ||
| 265 | <li>Execute playbook with inventory</li> | ||
| 266 | <li>Playbook can be defined centrally or in a repo</li> | ||
| 267 | </ul> | ||
| 268 | </section> | ||
| 269 | |||
| 270 | <section id="in-repo-config" class="slide level2"> | ||
| 271 | <h1>In repo config</h1> | ||
| 272 | <ul> | ||
| 273 | <li>Minimal config at start - other than "where are my repos"</li> | ||
| 274 | <li>'trusted' config repos</li> | ||
| 275 | <li>config per-repo </li> | ||
| 276 | <li>At start, zuul asks the fleet of merger-launchers to calculate config</li> | ||
| 277 | </ul> | ||
| 278 | </section> | ||
| 279 | |||
| 280 | <section id="test-tests" class="slide level2"> | ||
| 281 | <h1> Test tests before you land them </h1> | ||
| 282 | <ul> | ||
| 283 | <li>Config is in git. Zuul does multo-repo git depends.</li> | ||
| 284 | <li>v3 adds with in-tree test definitions</li> | ||
| 285 | <li>Speculative state includes speculative state of test jobs</li> | ||
| 286 | </ul> | ||
| 287 | </section> | ||
| 288 | |||
| 289 | <section id="multi-node-support" class="slide level2"> | ||
| 290 | <h1>First class multi-node support</h1> | ||
| 291 | <pre><code> | ||
| 292 | - job: | ||
| 293 | name: ursula | ||
| 294 | parent: base | ||
| 295 | nodes: | ||
| 296 | - name: controller | ||
| 297 | image: ubuntu-trusty | ||
| 298 | - name: db | ||
| 299 | image: centos-7 | ||
| 300 | </code></pre> | ||
| 301 | </section> | ||
| 302 | |||
| 303 | <section id="active-node-requests" class="slide level2"> | ||
| 304 | <h1>Active node requests</h1> | ||
| 305 | <ul> | ||
| 306 | <li>zuul requests named resources</li> | ||
| 307 | <li>resources are created/checked out of pool</li> | ||
| 308 | <li>at finish, checked back in</li> | ||
| 309 | <li>Single-use environments delete on check in</li> | ||
| 310 | <li>Multi-use environments become available for subsequent jobs</li> | ||
| 311 | <li>Request non-node resources, such as kubernetes cluster</li> | ||
| 312 | </ul> | ||
| 313 | </section> | ||
| 314 | |||
| 315 | <section id="status" class="slide level2"> | ||
| 316 | <h1>Status</h1> | ||
| 317 | <p>Focus</p> | ||
| 318 | <ul> | ||
| 319 | <li>OpenStack first, and the hard problems that brings</li> | ||
| 320 | <li>Extra-hard is handled. So is simple - but zuul is complex to run | ||
| 321 | if you only have the simple use cases</li> | ||
| 322 | </ul> | ||
| 323 | <p>Next up</p> | ||
| 324 | <ul> | ||
| 325 | <li>Get it ready for Ansible project</li> | ||
| 326 | <li>Making it truly suitable for not-OpenStack Infra to run</li> | ||
| 327 | <li>Making the easy tasks simple</li> | ||
| 328 | </ul> | ||
| 329 | </section> | ||
| 330 | |||
| 331 | <section id="more-info" class="slide level2"> | ||
| 332 | <h1>For More Information</h1> | ||
| 333 | |||
| 334 | <ul> | ||
| 335 | <li><a href='href=http://docs.openstack.org/infra/zuul/'> | ||
| 336 | http://docs.openstack.org/infra/zuul/</a></li> | ||
| 337 | <li><a href='http://specs.openstack.org/openstack-infra/infra-specs/specs/zuulv3.html'> | ||
| 338 | http://specs.openstack.org/openstack-infra/infra-specs/specs/zuulv3.html</a></li> | ||
| 339 | <li>freenode:#zuul</li> | ||
| 340 | <li><a href='http://docs.openstack.org/infra/publications/zuul/#'> | ||
| 341 | http://docs.openstack.org/infra/publications/zuul/#(1)</a></li> | ||
| 342 | </ul> | ||
| 343 | </section> | ||
| 344 | |||
| 345 | </body> | ||
| 346 | </html> | ||
