forked from apache/spark-website
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrelease-process.html
520 lines (415 loc) · 25.8 KB
/
release-process.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
Release Process | Apache Spark
</title>
<!-- Bootstrap core CSS -->
<link href="/css/cerulean.min.css" rel="stylesheet">
<link href="/css/custom.css" rel="stylesheet">
<!-- Code highlighter CSS -->
<link href="/css/pygments-default.css" rel="stylesheet">
<script type="text/javascript">
<!-- Google Analytics initialization -->
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-32518208-2']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
<!-- Adds slight delay to links to allow async reporting -->
function trackOutboundLink(link, category, action) {
try {
_gaq.push(['_trackEvent', category , action]);
} catch(err){}
setTimeout(function() {
document.location.href = link.href;
}, 100);
}
</script>
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
</head>
<body>
<script src="https://code.jquery.com/jquery.js"></script>
<script src="https://netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
<script src="/js/lang-tabs.js"></script>
<script src="/js/downloads.js"></script>
<div class="container" style="max-width: 1200px;">
<div class="masthead">
<p class="lead">
<a href="/">
<img src="/images/spark-logo-trademark.png"
style="height:100px; width:auto; vertical-align: bottom; margin-top: 20px;"></a><span class="tagline">
Lightning-fast cluster computing
</span>
</p>
</div>
<nav class="navbar navbar-default" role="navigation">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse"
data-target="#navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/downloads.html">Download</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Libraries <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/sql/">SQL and DataFrames</a></li>
<li><a href="/streaming/">Spark Streaming</a></li>
<li><a href="/mllib/">MLlib (machine learning)</a></li>
<li><a href="/graphx/">GraphX (graph)</a></li>
<li class="divider"></li>
<li><a href="/third-party-projects.html">Third-Party Projects</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Documentation <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/docs/latest/">Latest Release (Spark 2.2.1)</a></li>
<li><a href="/documentation.html">Older Versions and Other Resources</a></li>
<li><a href="/faq.html">Frequently Asked Questions</a></li>
</ul>
</li>
<li><a href="/examples.html">Examples</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Community <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/community.html">Mailing Lists & Resources</a></li>
<li><a href="/contributing.html">Contributing to Spark</a></li>
<li><a href="/improvement-proposals.html">Improvement Proposals (SPIP)</a></li>
<li><a href="https://issues.apache.org/jira/browse/SPARK">Issue Tracker</a></li>
<li><a href="/powered-by.html">Powered By</a></li>
<li><a href="/committers.html">Project Committers</a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Developers <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li><a href="/developer-tools.html">Useful Developer Tools</a></li>
<li><a href="/versioning-policy.html">Versioning Policy</a></li>
<li><a href="/release-process.html">Release Process</a></li>
<li><a href="/security.html">Security</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="https://www.apache.org/" class="dropdown-toggle" data-toggle="dropdown">
Apache Software Foundation <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="https://www.apache.org/">Apache Homepage</a></li>
<li><a href="https://www.apache.org/licenses/">License</a></li>
<li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
<li><a href="https://www.apache.org/foundation/thanks.html">Thanks</a></li>
<li><a href="https://www.apache.org/security/">Security</a></li>
</ul>
</li>
</ul>
</div>
<!-- /.navbar-collapse -->
</nav>
<div class="row">
<div class="col-md-3 col-md-push-9">
<div class="news" style="margin-bottom: 20px;">
<h5>Latest News</h5>
<ul class="list-unstyled">
<li><a href="/news/spark-2-2-1-released.html">Spark 2.2.1 released</a>
<span class="small">(Dec 01, 2017)</span></li>
<li><a href="/news/spark-2-1-2-released.html">Spark 2.1.2 released</a>
<span class="small">(Oct 09, 2017)</span></li>
<li><a href="/news/spark-summit-eu-2017-agenda-posted.html">Spark Summit Europe (October 24-26th, 2017, Dublin, Ireland) agenda posted</a>
<span class="small">(Aug 28, 2017)</span></li>
<li><a href="/news/spark-2-2-0-released.html">Spark 2.2.0 released</a>
<span class="small">(Jul 11, 2017)</span></li>
</ul>
<p class="small" style="text-align: right;"><a href="/news/index.html">Archive</a></p>
</div>
<div class="hidden-xs hidden-sm">
<a href="/downloads.html" class="btn btn-success btn-lg btn-block" style="margin-bottom: 30px;">
Download Spark
</a>
<p style="font-size: 16px; font-weight: 500; color: #555;">
Built-in Libraries:
</p>
<ul class="list-none">
<li><a href="/sql/">SQL and DataFrames</a></li>
<li><a href="/streaming/">Spark Streaming</a></li>
<li><a href="/mllib/">MLlib (machine learning)</a></li>
<li><a href="/graphx/">GraphX (graph)</a></li>
</ul>
<a href="/third-party-projects.html">Third-Party Projects</a>
</div>
</div>
<div class="col-md-9 col-md-pull-3">
<h2>Preparing Spark Releases</h2>
<h3>Background</h3>
<p>The release manager role in Spark means you are responsible for a few different things:</p>
<ol>
<li>Preparing your setup</li>
<li>Preparing for release candidates:
<ol>
<li>cutting a release branch</li>
<li>informing the community of timing</li>
<li>working with component leads to clean up JIRA</li>
<li>making code changes in that branch with necessary version updates</li>
</ol>
</li>
<li>Running the voting process for a release:
<ol>
<li>creating release candidates using automated tooling</li>
<li>calling votes and triaging issues</li>
</ol>
</li>
<li>Finalizing and posting a release:
<ol>
<li>updating the Spark website</li>
<li>writing release notes</li>
<li>announcing the release</li>
</ol>
</li>
</ol>
<h2>Preparing your setup</h2>
<p>If you are a new Release Manager, you can read up on the process from the followings:</p>
<ul>
<li>release signing https://www.apache.org/dev/release-signing.html</li>
<li>gpg for signing https://www.apache.org/dev/openpgp.html</li>
<li>svn https://www.apache.org/dev/version-control.html#https-svn</li>
</ul>
<h2>Preparing Spark for Release</h2>
<p>The main step towards preparing a release is to create a release branch. This is done via
standard Git branching mechanism and should be announced to the community once the branch is
created.</p>
<p>It is also good to set up Jenkins jobs for the release branch once it is cut to
ensure tests are passing. These are jobs like
https://amplab.cs.berkeley.edu/jenkins/view/Spark%20QA%20Test/job/spark-branch-2.3-test-maven-hadoop-2.7/ .
Consult Josh Rosen and Shane Knapp for help with this. Also remember to add the newly-added jobs
to the test dashboard at https://amplab.cs.berkeley.edu/jenkins/view/Spark%20QA%20Test%20(Dashboard)/ .</p>
<h3>Cutting a Release Candidate</h3>
<p>If this is not the first RC, then make sure that the JIRA issues that have been solved since the
last RC are marked as <code>Resolved</code> and has a <code>Target Versions</code> set to this release version.</p>
<p>To track any issue with pending PR targeting this release, create a filter in JIRA with a query like this
<code>project = SPARK AND "Target Version/s" = "12340470" AND status in (OPEN, "In Progress")</code></p>
<p>For target version string value to use, find the numeric value corresponds to the release by looking into
an existing issue with that target version and click on the version (eg. find an issue targeting 2.2.1
and click on the version link of its Target Versions field)</p>
<p>Verify from <code>git log</code> whether they are actually making it in the new RC or not. Check for JIRA issues
with <code>release-notes</code> label, and make sure they are documented in relevant migration guide for breaking
changes or in the release news on the website later.</p>
<p>Also check that all build and test passes are green from the RISELab Jenkins: https://amplab.cs.berkeley.edu/jenkins/ particularly look for Spark Packaging, QA Compile, QA Test.
Note that not all permutations are run on PR therefore it is important to check Jenkins runs.</p>
<p>The process of cutting a release candidate has been partially automated via the RISELab Jenkins. There are
Jenkins jobs that can tag a release candidate and create various packages based on that candidate.
At present the Jenkins jobs <em>SHOULD NOT BE USED</em> as they use a legacy shared key for signing.</p>
<p>Instead much of the same release logic can be accessed in <code>dev/create-release/release-tag.sh</code> and <code>dev/create-release/release-build.sh</code>. The general order of creating a release using the scripts is:</p>
<ul>
<li>Verify Jenkins test pass on your desired commit</li>
<li>Set the shell environment variables used by the scripts (run with “help” for details)</li>
<li>Verify your JAVA_HOME is set to the correct Java version (2.2+ Java 8, pre-2.2 Java 7)</li>
<li>You may find Felix’s docker env useful - https://github.com/felixcheung/spark-build/blob/master/Dockerfile .</li>
<li>Ensure you have the required dependencies to build the docs <code>docs/README.md</code></li>
<li>R, for CRAN packaging tests, requires e1071 to be installed as part of the packaging tests.</li>
<li>In addition R uses LaTeX for some things, and requires some additional fonts. On Debian based systems you may wish to install <code>texlive-fonts-recommended</code> and <code>texlive-fonts-extra</code>.</li>
<li>Make sure you required Python packages for packaging (see <code>dev/requirements.txt</code>)</li>
<li>Tag the release candidate with <code>dev/create-release/release-tag.sh</code> (e.g. for creating 2.1.2 RC2 we did <code>ASF_USERNAME=holden ASF_PASSWORD=yoursecretgoeshere GIT_NAME="Holden Karau" GIT_BRANCH=branch-2.1 GIT_EMAIL="holden@us.ibm.com" RELEASE_VERSION=2.1.2 RELEASE_TAG=v2.1.2-rc2 NEXT_VERSION=2.1.3-SNAPSHOT ./dev/create-release/release-tag.sh</code>)</li>
<li>Package the release binaries & sources with <code>dev/create-release/release-build.sh package</code></li>
<li>Create the release docs with <code>dev/create-release/release-build.sh docs</code></li>
<li>For Spark versions prior to 2.1.2, change the SPARK_VERSION from X.Y.Z to X.Y.Z-rcA then run <code>dev/create-release/release-build.sh publish-release</code>.</li>
<li>Publish a snapshot to the Apache release repo <code>dev/create-release/release-build.sh publish-release</code></li>
<li>If you are a new Release Manager, update the KEYS file with your code signing key https://www.apache.org/dev/openpgp.html#export-public-key</li>
</ul>
<pre><code># Move dev/ to release/ when the voting is completed. See Finalize the Release below
svn co "https://dist.apache.org/repos/dist/dev/spark" svn-spark
# edit svn-spark/KEYS file
svn ci --username $ASF_USERNAME --password "$ASF_PASSWORD" -m"Update KEYS"
</code></pre>
<p>If the Jenkins jobs have been updated to support signing with your key you can look at the job required for a release are located in the <a href="https://amplab.cs.berkeley.edu/jenkins/view/Spark%20Release/">Spark Release Jobs</a> collection.
If you don’t have access, talk to a previous release manager for guidance and to get access.
The jobs can be launched with “Build with Parameters” and the general order is:</p>
<ul>
<li>Create a tag for the current RC with <a href="https://amplab.cs.berkeley.edu/jenkins/view/Spark%20Release/job/spark-release-tag/">spark-release-tag</a> job.</li>
<li>Kick off the rest of the jobs except spark-release-publish after the current RC has been configured.</li>
<li>Once the packaging and doc jobs have finished kick off the <a href="https://amplab.cs.berkeley.edu/jenkins/view/Spark%20Release/job/spark-release-publish">spark-release-publish</a> job.</li>
</ul>
<p>The jobs are configured through build parameters. If the build parameters are unclear you can look at previous releases or if available, the recommended process is to ask the previous release manager to walk you through the Jenkins jobs as this document may not be 100% up to date.</p>
<h3>Call a Vote on the Release Candidate</h3>
<p>The release voting takes place on the Apache Spark developers list (the PMC is voting).
Look at past voting threads to see how this proceeds. The email should follow
<a href="https://mail-archives.apache.org/mod_mbox/spark-dev/201407.mbox/%3cCABPQxss7Cf+YaUuxCk0jnusH4207hCP4dkWn3BWFSvdnD86HHQ@mail.gmail.com%3e">this format</a>.</p>
<ul>
<li>Make a shortened link to the full list of JIRAs using <a href="https://s.apache.org/">https://s.apache.org/</a></li>
<li>If possible, attach a draft of the release notes with the email</li>
<li>Make sure the voting closing time is in UTC format. Use this script to generate it</li>
<li>Make sure the email is in text format and the links are correct</li>
</ul>
<p>Once the vote is done, you should also send out a summary email with the totals, with a subject
that looks something like <code>[RESULT] [VOTE]...</code>.</p>
<h3>Finalize the Release</h3>
<p><strong>Be Careful!</strong></p>
<p><strong>THIS STEP IS IRREVERSIBLE so make sure you selected the correct staging repository. Once you
move the artifacts into the release folder, they cannot be removed.</strong></p>
<p>After the vote passes, to upload the binaries to Apache mirrors, you move the binaries from dev directory (this should be where they are voted) to release directory. This “moving” is the only way you can add stuff to the actual release directory.</p>
<pre><code># Checkout the Spark directory in Apache distribution SVN "dev" repo
$ svn co https://dist.apache.org/repos/dist/dev/spark/
# Move the sub-directory in "dev" to the
# corresponding directory in "release"
$ export SVN_EDITOR=vim
$ svn mv https://dist.apache.org/repos/dist/dev/spark/spark-1.1.1-rc2 https://dist.apache.org/repos/dist/release/spark/spark-1.1.1
</code></pre>
<p>Verify that the resources are present in <a href="https://www.apache.org/dist/spark/">https://www.apache.org/dist/spark/</a>.
It may take a while for them to be visible. This will be mirrored throughout the Apache network.
There are a few remaining steps.</p>
<p>For Maven Central Repository, you can Release from the <a href="https://repository.apache.org/">Apache Nexus Repository Manager</a>. This is already populated by the <code>release-build.sh publish-release</code> step. Log in, open Staging Repositories, find the one voted on (eg. orgapachespark-1257 for https://repository.apache.org/content/repositories/orgapachespark-1257/), select and click Release and confirm. If successful, it should show up under https://repository.apache.org/content/repositories/releases/org/apache/spark/spark-core_2.11/2.2.1/
and the same under https://repository.apache.org/content/groups/maven-staging-group/org/apache/spark/spark-core_2.11/2.2.1/ (look for the correct release version). After some time this will be sync’d to <a href="https://search.maven.org/">Maven Central</a> automatically.</p>
<h4>Upload to PyPI</h4>
<p>Uploading to PyPI is done after the release has been uploaded to Apache. To get started, go to the <a href="https://pypi.python.org">PyPI website</a> and log in with the spark-upload account (see the PMC mailing list for account permissions).</p>
<p>Once you have logged in it is time to register the new release, on the <a href="https://pypi.python.org/pypi?%3Aaction=submit_form">submitting package information</a> page by uploading the PKG-INFO file from inside the pyspark packaged artifact.</p>
<p>Once the release has been registered you can upload the artifacts
to the <b>legacy</b> pypi interface, using <a href="https://pypi.python.org/pypi/twine">twine</a>.
If you don’t have twine setup you will need to create a .pypirc file with the reository pointing to <code>https://upload.pypi.org/legacy/</code> and the same username and password for the spark-upload account.</p>
<p>In the release directory run <code>twine upload -r legacy pyspark-version.tar.gz pyspark-version.tar.gz.asc</code>.
If for some reason the twine upload is incorrect (e.g. http failure or other issue), you can rename the artifact to <code>pyspark-version.post0.tar.gz</code>, delete the old artifact from PyPI and re-upload.</p>
<h4>Remove Old Releases from Mirror Network</h4>
<p>Spark always keeps two releases in the mirror network: the most recent release on the current and
previous branches. To delete older versions simply use svn rm. The <code>downloads.js</code> file in the
website <code>js/</code> directory must also be updated to reflect the changes. For instance, the two
releases should be 1.1.1 and 1.0.2, but not 1.1.1 and 1.1.0.</p>
<pre><code>$ svn rm https://dist.apache.org/repos/dist/release/spark/spark-1.1.0
</code></pre>
<h4>Update the Spark Apache Repository</h4>
<p>Check out the tagged commit for the release candidate that passed and apply the correct version tag.</p>
<pre><code>$ git checkout v1.1.1-rc2 # the RC that passed
$ git tag v1.1.1
$ git push apache v1.1.1
# Verify that the tag has been applied correctly
# If so, remove the old tag
$ git push apache :v1.1.1-rc2
$ git tag -d v1.1.1-rc2
</code></pre>
<p>Next, update remaining version numbers in the release branch. If you are doing a patch release,
see the similar commit made after the previous release in that branch. For example, for branch 1.0,
see <a href="https://github.com/apache/spark/commit/2a5514f7dcb9765b60cb772b97038cbbd1b58983">this example commit</a>.</p>
<p>In general, the rules are as follows:</p>
<ul>
<li><code>grep</code> through the repository to find such occurrences</li>
<li>References to the version just released. Upgrade them to next release version. If it is not a
documentation related version (e.g. inside <code>spark/docs/</code> or inside <code>spark/python/epydoc.conf</code>),
add <code>-SNAPSHOT</code> to the end.</li>
<li>References to the next version. Ensure these already have <code>-SNAPSHOT</code>.</li>
</ul>
<!--
<h4>Update the EC2 Scripts</h4>
Upload the binary packages to the S3 bucket s3n://spark-related-packages (ask pwendell to do this). Then, change the init scripts in mesos/spark-ec2 repository to pull new binaries (see this example commit).
For Spark 1.1+, update branch v4+
For Spark 1.1, update branch v3+
For Spark 1.0, update branch v3+
For Spark 0.9, update branch v2+
You can audit the ec2 set-up by launching a cluster and running this audit script. Make sure you create cluster with default instance type (m1.xlarge).
-->
<h4>Update the Spark Website</h4>
<p>The website repository is located at
<a href="https://github.com/apache/spark-website">https://github.com/apache/spark-website</a>.
Ensure the docs were generated with the PRODUCTION=1 environment variable.</p>
<pre><code># Build the latest docs
$ git checkout v1.1.1
$ cd docs
$ PRODUCTION=1 jekyll build
# Copy the new documentation to Apache
$ git clone https://github.com/apache/spark-website
...
$ cp -R _site spark-website/site/docs/1.1.1
# Update the "latest" link
$ cd spark/site/docs
$ rm latest
$ ln -s 1.1.1 latest
</code></pre>
<p>Next, update the rest of the Spark website. See how the previous releases are documented
(all the HTML file changes are generated by <code>jekyll</code>).
In particular, update <code>documentation.md</code> to add link to <code>docs</code> for the previous release. Add
the new release to <code>js/downloads.js</code>. Check <code>security.md</code> for anything to update.</p>
<pre><code>$ git add 1.1.1
$ git commit -m "Add docs for Spark 1.1.1"
</code></pre>
<p>Then, create the release notes. Go to the
<a href="https://issues.apache.org/jira/projects/SPARK?selectedItem=com.atlassian.jira.jira-projects-plugin:release-page">release page in JIRA</a>,
pick the release version from the list, then click on “Release Notes”. Copy this URL and then make a short URL on
<a href="https://s.apache.org/">s.apache.org</a>, sign in to your Apache account, and pick the ID as something like
<code>spark-2.1.2</code>. Create a new release post under <code>releases/_posts</code> to include this short URL.</p>
<p>Then run <code>jekyll build</code> to update the <code>site</code> directory.</p>
<p>On a related note, make sure the version is marked as released on JIRA. Go find the release page as above, eg.,
<code>https://issues.apache.org/jira/projects/SPARK/versions/12340295</code>, and click the “Release” button on the right and enter the release date.</p>
<p>(Generally, this is only for major and minor, but not patch releases) The contributors list can be automatically generated through
<a href="https://github.com/apache/spark/blob/branch-1.1/dev/create-release/generate-contributors.py">this script</a>.
It accepts the tag that corresponds to the current release and another tag that
corresponds to the previous (not including maintenance release). For instance, if you are
releasing Spark 1.2.0, set the current tag to v1.2.0-rc2 and the previous tag to v1.1.0.
Once you have generated the initial contributors list, it is highly likely that there will be
warnings about author names not being properly translated. To fix this, run
<a href="https://github.com/apache/spark/blob/branch-1.1/dev/create-release/translate-contributors.py">this other script</a>,
which fetches potential replacements from Github and JIRA. For instance:</p>
<pre><code>$ cd release-spark/dev/create-release
# Set RELEASE_TAG and PREVIOUS_RELEASE_TAG
$ vim generate-contributors.py
# Generate initial contributors list, likely with warnings
$ ./generate-contributors.py
# Set JIRA_USERNAME, JIRA_PASSWORD, and GITHUB_API_TOKEN
$ vim release-spark/dev/translate-contributors.py
# Translate names generated in the previous step, reading from known_translations if necessary
$ ./translate-contributors.py
</code></pre>
<p>Additionally, if you wish to give more specific credit for developers of larger patches, you may
use the the following commands to identify large patches. Extra care must be taken to make sure
commits from previous releases are not counted since git cannot easily associate commits that
were back ported into different branches.</p>
<pre><code># Determine PR numbers closed only in the new release
$ git log v1.1.1 | grep "Closes #" | cut -d " " -f 5,6 | grep Closes | sort > closed_1.1.1
$ git log v1.1.0 | grep "Closes #" | cut -d " " -f 5,6 | grep Closes | sort > closed_1.1.0
$ diff --new-line-format="" --unchanged-line-format="" closed_1.1.1 closed_1.1.0 > diff.txt
# Grep expression with all new patches
$ EXPR=$(cat diff.txt | awk '{ print "\\("$1" "$2" \\)"; }' | tr "\n" "|" | sed -e "s/|/\\\|/g" | sed "s/\\\|$//")
# Contributor list
$ git shortlog v1.1.1 --grep "$EXPR" > contrib.txt
# Large patch list (300+ lines)
$ git log v1.1.1 --grep "$expr" --shortstat --oneline | grep -B 1 -e "[3-9][0-9][0-9] insert" -e "[1-9][1-9][1-9][1-9] insert" | grep SPARK > large-patches.txt
</code></pre>
<h4>Create an Announcement</h4>
<p>Once everything is working (website docs, website changes) create an announcement on the website
and then send an e-mail to the mailing list. To create an announcement, create a post under
<code>news/_posts</code> and then run <code>jekyll build</code>.</p>
<p>Enjoy an adult beverage of your choice, and congratulations on making a Spark release.</p>
</div>
</div>
<footer class="small">
<hr>
Apache Spark, Spark, Apache, and the Spark logo are <a href="/trademarks.html">trademarks</a> of
<a href="https://www.apache.org">The Apache Software Foundation</a>.
Copyright © 2018 The Apache Software Foundation, Licensed under the
<a href="https://www.apache.org/licenses/LICENSE-2.0.html">Apache License, Version 2.0</a>.
</footer>
</div>
</body>
</html>