396 lines
13 KiB
HTML
396 lines
13 KiB
HTML
<!--[[[cog
|
|
from tools.showcode import showcode, runscript
|
|
import re
|
|
]]]-->
|
|
<!--[[[end]]]-->
|
|
|
|
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
|
|
<title>6 Months in the Life of OpenStack</title>
|
|
|
|
<meta name="author" content="OpenStack Release Team">
|
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
|
|
|
|
<link rel="stylesheet" href="css/reveal.css">
|
|
<link rel="stylesheet" href="css/theme/dhellmann.css" id="theme">
|
|
<link rel="stylesheet" href="css/selectable.css" id="theme">
|
|
<link rel="stylesheet" href="css/font-awesome.min.css">
|
|
|
|
<!-- Code syntax highlighting -->
|
|
<link rel="stylesheet" href="lib/css/github.css">
|
|
|
|
<!-- Printing and PDF exports -->
|
|
<script>
|
|
var link = document.createElement( 'link' );
|
|
link.rel = 'stylesheet';
|
|
link.type = 'text/css';
|
|
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
|
|
document.getElementsByTagName( 'head' )[0].appendChild( link );
|
|
</script>
|
|
|
|
<!--[if lt IE 9]>
|
|
<script src="lib/js/html5shiv.js"></script>
|
|
<![endif]-->
|
|
|
|
</head>
|
|
|
|
<body>
|
|
<div class="reveal">
|
|
<div class="slides">
|
|
|
|
<section>
|
|
<h2>6 Months in the Life of OpenStack</h2>
|
|
<h3>OpenStack Rocky PTG</h3>
|
|
<h4>Release Team</h4>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Mission</h2>
|
|
|
|
<p>Coordinating the release of OpenStack deliverables, by
|
|
defining the overall development cycle, release models,
|
|
publication processes, versioning rules and tools, then
|
|
enabling project teams to produce their own releases.</p>
|
|
|
|
<aside class="notes">
|
|
Release schedule planning and coordination</br>
|
|
</br>
|
|
Assist teams producing deliverables: signed tarballs; announcements</br>
|
|
</br>
|
|
Communicate to users of deliverables: SemVer</br>
|
|
</br>
|
|
Maintaining release automation
|
|
</aside>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Not Responsible for</h2>
|
|
|
|
<ul>
|
|
<li>Feature scheduling</li>
|
|
<li>Feature tracking</li>
|
|
<li>Prioritization of work</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>cycle-with-milestones</h2>
|
|
|
|
<ul>
|
|
<li>commit to publish development milestones following a
|
|
predetermined schedule</li>
|
|
<li>commit to produce a release to match the end of the
|
|
6-month development cycle</li>
|
|
<li>used by service projects</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>cycle-with-intermediary</h2>
|
|
|
|
<ul>
|
|
<li>produce multiple full releases during the cycle</li>
|
|
<li>commit to produce a release near the end of the
|
|
6-month development cycle</li>
|
|
<li>used by libraries and service projects</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>cycle-trailing</h2>
|
|
|
|
<ul>
|
|
<li>commit to produce a release no later than 2 weeks
|
|
after the end of the 6-month development cycle</li>
|
|
<li>within the cycle can follow milestones or produce
|
|
intermediate releases</li>
|
|
<li>used by deployment tools</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Staying in touch</h2>
|
|
<ul>
|
|
<li><tt>#openstack-release</tt> on freenode</li>
|
|
<li><tt>[release]</tt> on openstack-dev@</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Before PTG</h2>
|
|
<ul>
|
|
<li>Establish and publish release schedule</li>
|
|
</ul>
|
|
|
|
<aside class="notes">
|
|
look for obviously bad times like major holidays, school starting, etc.</br>
|
|
</br>
|
|
coordinate with the foundation staff about when the PTG
|
|
and summit will be held</br>
|
|
</aside>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Before Milestone 1</h2>
|
|
<ul>
|
|
<li>Make initial contact with PTLs</li>
|
|
<li>Sign up release liaisons</li>
|
|
</ul>
|
|
|
|
<aside class="notes">
|
|
This is the only time we will reach out directly because
|
|
there are 60+ of you and 3 of us.
|
|
</aside>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Before Milestone 2</h2>
|
|
<ul>
|
|
<li>First "warning" for projects that missed the
|
|
milestone</li>
|
|
<li>Why do milestones apply to everyone?</li>
|
|
</ul>
|
|
|
|
<aside class="notes">
|
|
|
|
milestones give us a cadence for checking in with all
|
|
teams</br>
|
|
</br>
|
|
|
|
gives us a way to break up the work over the course of the
|
|
cycle in a consistent way, since all teams use the same
|
|
milestones</br>
|
|
</br>
|
|
|
|
missing is an early indicator for problems because the
|
|
project team isn't paying attention to the schedule
|
|
</aside>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Before Milestone 3</h2>
|
|
<ul>
|
|
<li>Coordinate the library release freeze</li>
|
|
<li>Update gerrit and the CI system to handle the new
|
|
stable branches</li>
|
|
<li>Coordinate requirements freeze</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Why do we want to release before the final cut-off?</h2>
|
|
<ul>
|
|
<li>Services are only tested with released libraries</li>
|
|
<li>We need a place to create the stable branch</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Why do we freeze library releases?</h2>
|
|
<ul>
|
|
<li>Stability for consumers</li>
|
|
<li>Downstream packagers</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Why are client and regular library freezes different?</h2>
|
|
<ul>
|
|
<li>Clients have late-landing features to support the
|
|
service</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Why do we freeze the requirements list?</h2>
|
|
<ul>
|
|
<li>Stability for our CI</li>
|
|
<li>Downstream packagers</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Before RC1</h2>
|
|
<ul>
|
|
<li>Make sure cycle-with-intermediary projects are
|
|
thinking about the end of cycle coming up</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>At RC1</h2>
|
|
<ul>
|
|
<li>Ensure all projects are branched</li>
|
|
<li>Coordinate updates and branching for devstack and
|
|
grenade</li>
|
|
<li>Coordinate branching of requirements list</li>
|
|
</ul>
|
|
|
|
<aside class="notes">
|
|
we need to branch together, at roughly the same time and
|
|
in the right order, because otherwise the configuration
|
|
for the CI system becomes too complicated (ensuring that
|
|
the right versions of master and stable branches are
|
|
combined for testing, using the right sets of requirements
|
|
and constraints, etc.)
|
|
</aside>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Before Final</h2>
|
|
<ul>
|
|
<li>Publish a planned set of final releases for PTL and
|
|
liaison review</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>At Final</h2>
|
|
<ul>
|
|
<li>Tag the final releases</li>
|
|
<li>Coordinate with the docs team to publish the
|
|
documentation</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Planned Changes for Rocky</h2>
|
|
|
|
<ul>
|
|
<li>nudging library maintainers more often for
|
|
releases</li>
|
|
<li>nudging cycle-with-intermediary maintainers earlier
|
|
for releases</li>
|
|
<li>publishing all services to PyPI (under
|
|
discussion)</li>
|
|
</ul>
|
|
|
|
<aside class="notes">
|
|
Trying to avoid a repeat of Rocky where we had late
|
|
branches, late releases, etc.
|
|
</aside>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Resources</h2>
|
|
<p><small>
|
|
<a href="http://git.openstack.org/cgit/openstack-infra/release-tools/tree/presentation-6-months-in-the-life-of-openstack">openstack-infra/release-tools/presentation-6-months-in-the-life-of-openstack
|
|
</a>
|
|
</small></p>
|
|
<p><small>
|
|
<a href="http://git.openstack.org/cgit/openstack/releases/tree/PROCESS.rst">openstack/releases/PROCESS.rst
|
|
</a>
|
|
</small></p>
|
|
<p class="creativecommons">
|
|
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/">
|
|
<img alt="Creative Commons License" src="img/cc-by-80x15.png" />
|
|
</a>
|
|
<span> This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>.</span>
|
|
</p>
|
|
</section>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
<script src="lib/js/head.min.js"></script>
|
|
<script src="js/jquery-3.1.1.js"></script>
|
|
<script src="js/reveal.js"></script>
|
|
<script src="js/lineselect.js"></script>
|
|
|
|
<script>
|
|
|
|
function _prev_slide() {
|
|
if (!_reveal_navigation_active()) {
|
|
return;
|
|
}
|
|
console.log('reveal: prev');
|
|
Reveal.navigatePrev();
|
|
};
|
|
|
|
function _next_slide() {
|
|
if (!_reveal_navigation_active()) {
|
|
return;
|
|
}
|
|
console.log('reveal: next');
|
|
Reveal.navigateNext();
|
|
};
|
|
|
|
function _reveal_navigation_active () {
|
|
return !document.querySelector( '.reveal' ).classList.contains('reveal-nav-off');
|
|
};
|
|
|
|
function _toggle_reveal_navigation () {
|
|
if (_reveal_navigation_active()) {
|
|
console.log('reveal: turning off nav');
|
|
document.querySelector( '.reveal' ).classList.add('reveal-nav-off');
|
|
document.querySelector('aside.controls').classList.add('controls-off');
|
|
} else {
|
|
console.log('reveal: turning on nav');
|
|
document.querySelector( '.reveal' ).classList.remove('reveal-nav-off');
|
|
document.querySelector('aside.controls').classList.remove('controls-off');
|
|
};
|
|
};
|
|
|
|
// Full list of configuration options available at:
|
|
// https://github.com/hakimel/reveal.js#configuration
|
|
Reveal.initialize({
|
|
controls: true,
|
|
keyboard: {
|
|
// Use Logitech presenter remote black screen button
|
|
// to control when we are changing slides vs. selected lines.
|
|
190: _toggle_reveal_navigation,
|
|
// p, page up
|
|
80: _prev_slide,
|
|
33: _prev_slide,
|
|
// n, page down
|
|
78: _next_slide,
|
|
34: _next_slide,
|
|
// h, left
|
|
72: _prev_slide,
|
|
37: _prev_slide,
|
|
// l, right
|
|
76: _next_slide,
|
|
39: _next_slide,
|
|
},
|
|
progress: true,
|
|
history: true,
|
|
center: true,
|
|
transition: 'slide', // none/fade/slide/convex/concave/zoom
|
|
// Optional reveal.js plugins
|
|
dependencies: [
|
|
{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
|
|
{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
|
{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
|
{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
|
|
{ src: 'plugin/zoom-js/zoom.js', async: true },
|
|
{ src: 'plugin/notes/notes.js', async: true }
|
|
]
|
|
});
|
|
</script>
|
|
|
|
<script>
|
|
/* find all of the lineselect nodes and add spans for their lines */
|
|
$(function() {
|
|
$('.lineselect_selectable').each(function (i, e) {
|
|
var $e = $(e);
|
|
var h = $e.html();
|
|
h = h.replace(/\n\n/g, "\n \n");
|
|
h = h.replace(/\n/g, "</span>\n<span class='line'>");
|
|
h = "<span class='line'>" + h + "</span>";
|
|
$e.html(h);
|
|
});
|
|
/* enable lineselect for the line nodes */
|
|
$(".lineselect_selectable").each(function () {
|
|
$(this).lineselect({ lines: "span.line" });
|
|
});
|
|
});
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|