blob: c0684728b2c0421a09190d41a462ed89c9aa7cf3 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>PLC4X &#x2013; </title>
<script src="../../js/jquery.slim.min.js" type="text/javascript"></script>
<!--script src="../../js/popper.min.js" type="javascript"></script-->
<script src="../../js/bootstrap.bundle.min.js" type="text/javascript"></script>
<!-- The tooling for adding images and links to Apache events -->
<script src="https://www.apachecon.com/event-images/snippet.js" type="text/javascript"></script>
<!-- FontAwesome -->
<link rel="stylesheet" href="../../css/all.min.css" type="text/css"/>
<!-- Bootstrap -->
<link rel="stylesheet" href="../../css/bootstrap.min.css" type="text/css"/>
<!-- Some Maven Site defaults -->
<link rel="stylesheet" href="../../css/maven-base.css" type="text/css"/>
<link rel="stylesheet" href="../../css/maven-theme.css" type="text/css"/>
<!-- The PLC4X version of a bootstrap theme -->
<link rel="stylesheet" href="../../css/themes/plc4x.css" type="text/css" id="pagestyle"/>
<!-- A custom style for printing content -->
<link rel="stylesheet" href="../../css/print.css" type="text/css" media="print"/>
<meta http-equiv="Content-Language" content="en"/>
</head>
<body class="composite">
<nav class="navbar navbar-light navbar-expand-md bg-faded justify-content-center border-bottom">
<!--a href="/" class="navbar-brand d-flex w-50 mr-auto">Navbar 3</a-->
<a href="https://plc4x.apache.org/" id="bannerLeft"><img src="../../images/apache_plc4x_logo_small.png" alt="Apache PLC4X"/></a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsingNavbar3">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse w-100" id="collapsingNavbar3">
<ul class="navbar-nav w-100 justify-content-center">
<li class="nav-item">
<a class="nav-link" href="../../index.html">Home</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../users/index.html">Users</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="../../developers/index.html">Developers</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../../apache/index.html">Apache</a>
</li>
</ul>
<ul class="nav navbar-nav ml-auto justify-content-end">
<li class="nav-item row valign-middle">
<a class="acevent" data-format="wide" data-mode="light" data-event="random" style="width:240px;height:60px;"></a>
</li>
</ul>
</div>
</nav>
<div class="container-fluid">
<div class="row h-100">
<nav class="col-sm-push col-md-2 pt-3 sidebar">
<div class="sidebar-sticky">
<ul class="nav flex-column">
<li class="nav-item">
<a href="../../developers/infrastructure/issues.html" class="nav-link">Bug & Issue Tracker</a>
</li>
<li class="nav-item">
<a href="../../developers/index.html" class="nav-link">Section Home</a>
</li>
<li class="nav-item">
<a href="../../developers/preparing/index.html" class="nav-link">Preparing your Computer</a>
<ul class="flex-column pl-4 nav">
<li class="nav-item">
<a href="../../developers/preparing/linux.html" class="nav-link">Linux</a>
</li>
<li class="nav-item">
<a href="../../developers/preparing/macos.html" class="nav-link">Mac OS</a>
</li>
<li class="nav-item">
<a href="../../developers/preparing/windows.html" class="nav-link">Windows</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="../../developers/building.html" class="nav-link">Building</a>
</li>
<li class="nav-item">
<a href="../../developers/contributing.html" class="nav-link">Contributing</a>
</li>
<li class="nav-item">
<a href="../../developers/tutorials/index.html" class="nav-link">Tutorials</a>
<ul class="flex-column pl-4 nav">
<li class="nav-item">
<a href="../../developers/tutorials/writing-driver.html" class="nav-link">Writing Drivers</a>
</li>
<li class="nav-item">
<a href="../../developers/tutorials/testing-serializers-and-parsers.html" class="nav-link">Testing Drivers</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="../../developers/code-gen/index.html" class="nav-link">Code Generation</a>
<ul class="flex-column pl-4 nav">
<li class="nav-item">
<a href="../../developers/code-gen/protocol/mspec.html" class="nav-link">Protocol: MSpec Format</a>
</li>
<li class="nav-item">
<a href="../../developers/code-gen/language/freemarker.html" class="nav-link">Language: Apache Freemarker</a>
</li>
<li class="nav-item">
<a href="../../developers/code-gen/protocol/df1.html" class="nav-link">Example: DF1 MSpec</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="../../developers/infrastructure/index.html" class="nav-link">Infrastructure</a>
<ul class="flex-column pl-4 nav">
<li class="nav-item">
<a href="../../developers/infrastructure/ci.html" class="nav-link">Continuous Integration</a>
</li>
<li class="nav-item">
<a href="../../developers/infrastructure/issues.html" class="nav-link">Bug & Issue Tracker</a>
</li>
<li class="nav-item">
<a href="../../developers/infrastructure/sonar.html" class="nav-link">Code Analysis</a>
</li>
<li class="nav-item">
<a href="../../developers/infrastructure/wiki.html" class="nav-link">Wiki</a>
</li>
<li class="nav-item">
<a href="../../developers/infrastructure/vm.html" class="nav-link">Build VM</a>
</li>
<li class="nav-item">
<a href="../../developers/infrastructure/website.html" class="nav-link">Website</a>
</li>
<li class="nav-item">
<a href="../../developers/infrastructure/vpn.html" class="nav-link">IoT VPN</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="../../developers/release/index.html" class="nav-link">Releasing</a>
<ul class="flex-column pl-4 nav">
<li class="nav-item">
<a href="../../developers/release/release.html" class="nav-link">Releasing</a>
</li>
<li class="nav-item">
<a href="../../developers/release/validation.html" class="nav-link">Validating</a>
</li>
<li class="nav-item">
<strong class="nav-link">Releasing Build-Tools</strong>
</li>
</ul>
</li>
<li class="nav-item">
<a href="../../developers/tools.html" class="nav-link">Tools</a>
</li>
<li class="nav-item">
<a href="../../developers/team.html" class="nav-link">Team</a>
</li>
<li class="nav-item">
<a href="../../developers/decisions.html" class="nav-link">Decision Making</a>
</li>
<li class="nav-item">
<a href="../../developers/maturity.html" class="nav-link">Maturity</a>
</li>
</ul>
</div>
</nav>
<main role="main" class="ml-sm-auto px-4 col-sm-pull col-md-9 col-lg-10 h-100">
<div class="sect1">
<h2 id="releasing_plc4x_build_tools">Releasing PLC4X Build-Tools</h2>
<div class="sectionbody">
<div class="paragraph">
<p>In contrast to the main project, the <code>plc4x-build-tools</code> repository contains a loose collection of sub-projects.</p>
</div>
<div class="paragraph">
<p>The main <code>pom.xml</code> in the root directory is mainly for allowing to import all modules into an IDE and shouldn&#8217;t be used for releases.</p>
</div>
<div class="paragraph">
<p>If you want to release a part of the build-tools, please execute the following release steps in the parts sub-directory.</p>
</div>
<div class="paragraph">
<p>In general the preparation steps for releasing a build-tool is equal to those of the main project.
So please check <a href="release.html">here</a> (Chapters: <code>Preparing your system for being able to release</code> and <code>Preparing the codebase for a release</code>)</p>
</div>
<div class="paragraph">
<p>The rest of the steps are a lot simpler than those of the main project as there aren&#8217;t any profiles involved.</p>
</div>
<div class="sect2">
<h3 id="creating_a_release_branch_for_the_code_generation_module">Creating a release branch (For the code-generation module)</h3>
<div class="paragraph">
<p>According to SemVer, we have: Major, Minor and Bugfix releases.</p>
</div>
<div class="paragraph">
<p>For each new Major and Minor release we create a new branch at the beginning of a code-freeze phase.</p>
</div>
<div class="paragraph">
<p>So if currently the project version in develop is <code>1.6.0-SNAPSHOT</code>, we create a branch <code>release/1.6</code>.</p>
</div>
<div class="paragraph">
<p>When creating the branch is exactly the moment in which the version in <code>develop</code> is incremented to the next minor version.</p>
</div>
<div class="paragraph">
<p>This can and should be automated by the <code>maven-release-plugin</code>.</p>
</div>
<div class="paragraph">
<p>Per default the plugin will ask for the working copy version during the build execution.
This is the version the <code>develop</code> branch will be changed to.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>mvn release:branch -DbranchName=releases/code-generation/{minor-version}</pre>
</div>
</div>
<div class="paragraph">
<p>Per default the plugin suggests the next bugfix version as working version, however we want it to use the next minor version.
So in case of preparing the release branch for <code>1.6.0</code> the command would be the following:</p>
</div>
<div class="listingblock">
<div class="content">
<pre> mvn release:branch -DbranchName=releases/code-generation/1.6</pre>
</div>
</div>
<div class="paragraph">
<p>The plugin will then aks for the version:</p>
</div>
<div class="listingblock">
<div class="content">
<pre> What is the new working copy version for "PLC4X Build Tools: Code Generation"? (org.apache.plc4x.plugins:plc4x-code-generation) 1.6.1-SNAPSHOT: : 1.7.0-SNAPSHOT</pre>
</div>
</div>
<div class="paragraph">
<p>Where the suggested default is manually overridden.</p>
</div>
<div class="paragraph">
<p>This step now should perform quite quickly as no build and no tests are involved.</p>
</div>
<div class="paragraph">
<p>However in the end the versions of the <code>develop</code> branch are updated and a new <code>releases/code-generation/1.6</code> branch is created.</p>
</div>
</div>
<div class="sect2">
<h3 id="preparing_develop_for_the_next_iteration">Preparing <code>develop</code> for the next iteration</h3>
<div class="paragraph">
<p>Now is a good time to add a new section to the <code>RELEASE_NOTES</code> document for the new <code>SNAPSHOT</code> version.</p>
</div>
<div class="paragraph">
<p>Here comes a template:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>==============================================================
(Unreleased) Apache PLC4X 1.7.0-SNAPSHOT
==============================================================
New Features
------------
Incompatible changes
--------------------
Bug Fixes
---------
// Rest of the file</pre>
</div>
</div>
<div class="paragraph">
<p>After that please remove the <code>(Unreleased)</code> from the following section, as we are currently working on its release.</p>
</div>
<div class="paragraph">
<p>Also be sure to do a quick full-text-search to check if the version was updated correctly everywhere.</p>
</div>
<div class="admonitionblock warning">
<table>
<tr>
<td class="icon">
<i class="fa icon-warning" title="Warning"></i>
</td>
<td class="content">
If you find anything here, you will need to pay attention during the release.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="release_stabilization_phase">Release stabilization phase</h3>
<div class="paragraph">
<p>Now usually comes a phase in which last tests and checks should be performed.</p>
</div>
<div class="paragraph">
<p>If any problems are found they, have to be fixed in the release branch.</p>
</div>
<div class="paragraph">
<p>Changes should either be re applied in <code>develop</code> or <code>cherry-picked</code>, however merging things back can cause a lot of problems, and we no longer have the same versions.</p>
</div>
</div>
<div class="sect2">
<h3 id="preparing_a_release">Preparing a release</h3>
<div class="paragraph">
<p>Before you start preparing the release, it is important to manually make the <code>RELEASE_NOTES</code> reflect the version we are planning on releasing.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Be sure to ensure you have switched to the release branch before continuing.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>So be sure to remove the <code>(Unreleased)</code> and <code>SNAPSHOT</code> from the version.</p>
</div>
<div class="paragraph">
<p>As especially when switching a lot between different branches, it is recommended to do a clean checkout of the repository.
Otherwise, a lot of directories can be left over, which would be included in the source-release zip.
In order to prepare a release-candidate, the first step is switching to the corresponding release-branch.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Again, just in case you missed the first warning: Be sure to ensure you have switched to the release branch before continuing.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>After that, the following command will to all preparation steps for the release:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>mvn release:prepare</pre>
</div>
</div>
<div class="paragraph">
<p>In general the plugin will now ask you 3 questions:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>The version we want to release as (It will suggest the version you get by omitting the <code>-SNAPSHOT</code> suffix, keep it as it is)</p>
</li>
<li>
<p>The name of the tag the release commit will be tagged with in the SCM (Name it <code>releases/code-generation/{release-version}</code> (<code>releases/code-generation/1.6.0</code> in our case)</p>
</li>
<li>
<p>The next development version (The version present in the pom after the release) (leave it as it is suggested by the plugin)</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>Usually for 1 and 3 the defaults are just fine, make sure the tag name is correct as this usually is different.</p>
</div>
<div class="paragraph">
<p>However, it is important to check that nowhere else SNAPSHOT versions are referenced.</p>
</div>
<div class="paragraph">
<p>What the plugin now does, is automatically to execute the following operations:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Check we aren&#8217;t referencing any <code>SNAPSHOT</code> dependencies.</p>
</li>
<li>
<p>Update all pom versions to the release version.</p>
</li>
<li>
<p>Run a build with all tests</p>
</li>
<li>
<p>Commit the changes (commit message: <code>[maven-release-plugin] prepare release releases/code-generation/1.6.0</code>)</p>
</li>
<li>
<p>Push the commit</p>
</li>
<li>
<p>Tag the commit</p>
</li>
<li>
<p>Update all poms to the next development version.</p>
</li>
<li>
<p>Commit the changes (commit message: <code>[maven-release-plugin] prepare for next development iteration</code>)</p>
</li>
<li>
<p>Push the commit</p>
</li>
</ol>
</div>
<div class="paragraph">
<p>However, this just prepared the git repository for the release, we have to perform the release to produce and stage the release artifacts.</p>
</div>
<div class="paragraph">
<p>Please verify the git repository at: <a href="https://gitbox.apache.org/repos/asf?p=plc4x-build-tools.git" class="bare">https://gitbox.apache.org/repos/asf?p=plc4x-build-tools.git</a>
is in the correct state. Please select the release branch and verify the commit log looks similar to this</p>
</div>
<div class="imageblock">
<div class="content">
<img src="../../images/release-git-history.png" alt="release git history"/>
</div>
</div>
<div class="paragraph">
<p>It is important that the commit with the message "[maven-release-plugin] prepare release releases/code-generation/1.6.0" is tagged with the release tag (in this case releases/code-generation/1.6.0)</p>
</div>
<div class="paragraph">
<p>If you check the commit itself, it should mainly consist of version updates like this:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="../../images/release-git-diff-prepare-release.png" alt="release git diff prepare release"/>
</div>
</div>
<div class="paragraph">
<p>The root pom has a few more changes, but in general this should be what you are seeing.</p>
</div>
<div class="paragraph">
<p>After that should come a second commit:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="../../images/release-git-diff-next-development-iteration.png" alt="release git diff next development iteration"/>
</div>
</div>
<div class="paragraph">
<p>This now updates the versions again, but this time from the release version to the one we selected for the next development iteration (in this case <code>1.6.1-SNAPSHOT</code>)</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
If the commit history doesn&#8217;t look like this, something went wrong.
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="what_if_something_goes_wrong">What if something goes wrong?</h2>
<div class="sectionbody">
<div class="paragraph">
<p>If something goes wrong, you can always execute:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>mvn release:rollback</pre>
</div>
</div>
<div class="paragraph">
<p>And it will change the versions back and commit and push things.</p>
</div>
<div class="paragraph">
<p>However, it will not delete the tag in GIT (locally and remotely). So you have to do that manually or use a different tag next time.</p>
</div>
<div class="sect2">
<h3 id="performing_a_release">Performing a release</h3>
<div class="paragraph">
<p>This is done by executing another goal of the <code>maven-release-plugin</code>:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>mvn release:perform</pre>
</div>
</div>
<div class="paragraph">
<p>This executes automatically as all information it requires is located in the <code>release.properties</code> file the <code>prepare</code>-goal prepared.</p>
</div>
<div class="paragraph">
<p>The first step is that the <code>perform</code>-goal checks out the previously tagged revision into the root modules <code>target/checkout</code> directory.
Here it automatically executes a maven build (You don&#8217;t have to do this, it&#8217;s just that you know what&#8217;s happening):</p>
</div>
<div class="literalblock">
<div class="content">
<pre>mvn clean deploy -P apache-release</pre>
</div>
</div>
<div class="paragraph">
<p>As the <code>apache-release</code> profile is activated, this builds and tests the project as well as creates the JavaDocs, Source packages and signs each of these with your PGP key.</p>
</div>
<div class="paragraph">
<p>As this time the build is building with release versions, Maven will automatically choose the release url for deploying artifacts.</p>
</div>
<div class="paragraph">
<p>The way things are set up in the apache parent pom, is that release artifacts are deployed to a so-called <code>staging repository</code>.</p>
</div>
<div class="paragraph">
<p>You can think of a <code>staging repository</code> as a dedicated repository created on the fly as soon as the first artifact comes in.</p>
</div>
<div class="paragraph">
<p>After the build you will have a nice and clean Maven repository at <a href="https://repository.apache.org/" class="bare">https://repository.apache.org/</a> that contains only artifacts from the current build.</p>
</div>
<div class="paragraph">
<p>After the build it is important to log in to <code>Nexus</code> at <a href="https://repository.apache.org/" class="bare">https://repository.apache.org/</a>, select <code>Staging Repositories</code> and find the repository with the name: <code>orgapacheplc4x-{somenumber}</code>.</p>
</div>
<div class="paragraph">
<p>Select that and click on the <code>Close</code> button.</p>
</div>
<div class="paragraph">
<p>Now Nexus will do some checks on the artifacts and check the signatures.</p>
</div>
<div class="paragraph">
<p>As soon as it&#8217;s finished, we are done on the Maven side and ready to continue with the rest of the release process.</p>
</div>
<div class="paragraph">
<p>A release build also produces a so-called <code>source-assembly</code> zip.</p>
</div>
<div class="paragraph">
<p>This contains all sources of the project and will be what&#8217;s actually the release from an Apache point of view and will be the thing we will be voting on.</p>
</div>
<div class="paragraph">
<p>This file will also be signed and <code>SHA512</code> hashes will be created.</p>
</div>
</div>
<div class="sect2">
<h3 id="staging_a_release">Staging a release</h3>
<div class="paragraph">
<p>Each new release and release-candidate has to be staged in the Apache SVN under:</p>
</div>
<div class="paragraph">
<p><a href="https://dist.apache.org/repos/dist/dev/plc4x/" class="bare">https://dist.apache.org/repos/dist/dev/plc4x/</a></p>
</div>
<div class="paragraph">
<p>The directory structure of this directory is as follows:</p>
</div>
<div class="listingblock">
<div class="content">
<pre> ./KEYS
./build-tools/code-generation/1.6.0
./build-tools/code-generation/1.6.0/rc1
./build-tools/code-generation/1.6.0/rc1/README
./build-tools/code-generation/1.6.0/rc1/RELEASE_NOTES
./build-tools/code-generation/1.6.0/rc1/apache-plc4x-code-generation-1.6.0-source-release.zip
./build-tools/code-generation/1.6.0/rc1/apache-plc4x-code-generation-1.6.0-source-release.zip.asc
./build-tools/code-generation/1.6.0/rc1/apache-plc4x-code-generation-1.6.0-source-release.zip.sha512</pre>
</div>
</div>
<div class="paragraph">
<p>I usually prepare exactly the same directory structure, starting with the 1.6.0 locally and then just import everything using the following command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>svn import 1.6.0 https://dist.apache.org/repos/dist/dev/plc4x/build-tools/code-generation/1.6.0 -m"Staging of rc1 of PLC4X Build-Tools (Code-Generation) 1.6.0"</pre>
</div>
</div>
<div class="paragraph">
<p>The <code>KEYS</code> file contains the PGP public key which belongs to the private key used to sign the release artifacts.</p>
</div>
<div class="paragraph">
<p>If this is your first release be sure to add your key to this file.
For the format have a look at the file itself.
It should contain all the information needed.</p>
</div>
<div class="paragraph">
<p>Be sure to stage exactly the <code>README</code> and <code>RELEASE_NOTES</code> files contained in the root of your project.
Ideally you just copy them there from there.</p>
</div>
<div class="paragraph">
<p>The three <code><strong>-source-release.zip</strong></code> artifacts should be located in the directory: <code>code-generation/target/checkout/code-generation/target</code></p>
</div>
<div class="paragraph">
<p>So, after committing these files to SVN, you are ready to start the vote.</p>
</div>
</div>
<div class="sect2">
<h3 id="starting_a_vote_on_the_mailing_list">Starting a vote on the mailing list</h3>
<div class="paragraph">
<p>After staging the release candidate in the Apache SVN, it is time to actually call out the vote.</p>
</div>
<div class="paragraph">
<p>For this we usually send two emails.
The following would be the one used to do our first TLP release:</p>
</div>
<div class="listingblock">
<div class="content">
<pre> E-Mail Topic:
[VOTE] Apache PLC4X Build-Tools Code-Generation 1.6.0 RC1
Message:
Apache PLC4X Build-Tools Code-Generation 1.6.0 has been staged under [2]
and it’s time to vote on accepting it for release.
All Maven artifacts are available under [1]. Voting will be open for 72hr.
A minimum of 3 binding +1 votes and more binding +1 than binding -1
are required to pass.
Repository: https://gitbox.apache.org/repos/asf/plc4x-build-tools.git
Release tag: releases/code-generation/1.6.0
Hash for the release tag: {replacethiswiththerealgitcommittag}
Per [3] "Before voting +1 PMC members are required to download
the signed source code package, compile it as provided, and test
the resulting executable on their own platform, along with also
verifying that the package meets the requirements of the ASF policy
on releases."
You can achieve the above by following [4].
[ ] +1 accept (indicate what you validated - e.g. performed the non-RM items in [4])
[ ] -1 reject (explanation required)
[1] https://repository.apache.org/content/repositories/orgapacheplc4x-{somefourdigitnumber}
[2] https://dist.apache.org/repos/dist/dev/plc4x/build-tools/code-generation/1.6.0/rc1/
[3] https://www.apache.org/dev/release/validation.html#approving-a-release
[4] https://plc4x.apache.org/developers/release/validation.html</pre>
</div>
</div>
<div class="paragraph">
<p>As it is sometimes to do the vote counting, if voting and discussions are going on in the same thread, we send a second email:</p>
</div>
<div class="listingblock">
<div class="content">
<pre> E-Mail Topic:
[DISCUSS] Apache PLC4X Build-Tools Code-Generation 1.6.0 RC1
Message:
This is the discussion thread for the corresponding VOTE thread.
Please keep discussions in this thread to simplify the counting of votes.
If you have to vote -1 please mention a brief description on why and then take the details to this thread.</pre>
</div>
</div>
<div class="paragraph">
<p>Now we have to wait 72 hours till we can announce the result of the vote.</p>
</div>
<div class="paragraph">
<p>This is an Apache policy to make it possible for anyone to participate in the vote, no matter where that person lives and not matter what weekends or public holidays might currently be.</p>
</div>
<div class="paragraph">
<p>The vote passes, if at least 3 <code>+1</code> votes are received and more <code>+1</code> are received than <code>-1</code>.</p>
</div>
<div class="paragraph">
<p>After the 72-our minimum wait period is over, and we have fulfilled the requirement of at least 3 +1 votes and more +1 than -1, a final reply is sent to the vote thread with a prefix of <code>[RESULT]</code> in the title in which the summary of the vote is presented in an aggregated form.</p>
</div>
<div class="listingblock">
<div class="content">
<pre> E-Mail Topic:
[RESULT] [VOTE] Apache PLC4X Build-Tools Code-Generation 1.6.0 RC1
Message:
So, the vote passes with 3 +1 votes by PMC members and one +1 vote by a non PMC member.
Chris</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="releasing_after_a_successful_vote">Releasing after a successful vote</h3>
<div class="paragraph">
<p>As soon as the votes are finished, and the results were in favor of a release, the staged artifacts can be released.
This is done by moving them inside the Apache SVN.</p>
</div>
<div class="listingblock">
<div class="content">
<pre> svn move -m "Release Apache PLC4X 1.6.0" \
https://dist.apache.org/repos/dist/dev/plc4x/build-tools/code-generation/1.6.0/rc1 \
https://dist.apache.org/repos/dist/release/plc4x/build-tools/code-generation/1.6.0</pre>
</div>
</div>
<div class="paragraph">
<p>This will make the release artifacts available and will trigger them being copied to mirror sites.</p>
</div>
<div class="paragraph">
<p>This is also the reason why you should wait at least 24 hours before sending out the release notification emails.</p>
</div>
</div>
<div class="sect2">
<h3 id="cleaning_up_older_release_versions">Cleaning up older release versions</h3>
<div class="paragraph">
<p>As a lot of mirrors are serving our releases, it is the Apache policy to clean old releases from the repo if newer versions are released.</p>
</div>
<div class="paragraph">
<p>This can be done like this:</p>
</div>
<div class="literalblock">
<div class="content">
<pre>svn delete https://dist.apache.org/repos/dist/release/plc4x/0.3.0/ -m"deleted version 0.3.0"</pre>
</div>
</div>
<div class="paragraph">
<p>After this, <a href="https://dist.apache.org/repos/dist/release/plc4x" class="bare">https://dist.apache.org/repos/dist/release/plc4x</a> should only contain the latest release directory.</p>
</div>
</div>
<div class="sect2">
<h3 id="releasing_the_maven_artifacts">Releasing the Maven artifacts</h3>
<div class="paragraph">
<p>The probably simplest part is releasing the Maven artifacts.</p>
</div>
<div class="paragraph">
<p>In order to do this, the release manager logs into Nexus at <a href="https://repository.apache.org/" class="bare">https://repository.apache.org/</a>, selects the staging repository and clicks on the <code>Release</code> button.</p>
</div>
<div class="paragraph">
<p>This will move all artifacts into the Apache release repository and delete the staging repository after that.</p>
</div>
<div class="paragraph">
<p>All release artifacts released to the Apache release repo, will automatically be synced to Maven central.</p>
</div>
</div>
<div class="sect2">
<h3 id="merge_back_release_version_to_release_branch">Merge back release version to <code>release</code> branch</h3>
<div class="paragraph">
<p>The `release branch should always point to the last released version.
This has to be done with git</p>
</div>
<div class="listingblock">
<div class="content">
<pre>git checkout release
git merge releases/code-generation/1.6.0</pre>
</div>
</div>
<div class="paragraph">
<p>When there are conflicts it could help to use the <code>theirs</code> merge strategy, i.e.,</p>
</div>
<div class="listingblock">
<div class="content">
<pre>git merge -X theirs releases/code-generation/1.6.0</pre>
</div>
</div>
<div class="paragraph">
<p>Possibly a manual conflict resolution has to be done afterwards. After that, changes need to
be pushed.</p>
</div>
<div class="paragraph">
<p>In contrast to main releases of PLC4X we won&#8217;t do any JIRA version updates, updating of the download page or notifying of the world email to <a href="mailto:announce@apache.org">announce@apache.org</a></p>
</div>
<div class="paragraph">
<p>So now you&#8217;re done. Congrats!</p>
</div>
</div>
</div>
</div>
</main>
<footer class="pt-4 my-md-5 pt-md-5 w-100 border-top">
<div class="row justify-content-md-center" style="font-size: 13px">
<div class="col col-6 text-center">
Copyright &#169; 2017&#x2013;2022 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
All rights reserved.<br/>
Apache PLC4X, PLC4X, Apache, the Apache feather logo, and the Apache PLC4X project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries. All other marks mentioned may be trademarks or registered trademarks of their respective owners.
<br/><div style="text-align:center;">Home screen image taken from <a
href="https://flic.kr/p/chEftd">Flickr</a>, "Tesla Robot Dance" by Steve Jurvetson, licensed
under <a href="https://creativecommons.org/licenses/by/2.0/">CC BY 2.0 Generic</a>, image cropped
and blur effect added.</div>
</div>
</div>
</footer>
</div>
</div>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="../../js/jquery.slim.min.js"></script>
<script src="../../js/popper.min.js"></script>
<script src="../../js/bootstrap.min.js"></script>
<script type="text/javascript">
$('.carousel .carousel-item').each(function(){
var next = $(this).next();
if (!next.length) {
next = $(this).siblings(':first');
}
next.children(':first-child').clone().appendTo($(this));
for (let i = 0; i < 3; i++) {
next=next.next();
if (!next.length) {
next = $(this).siblings(':first');
}
next.children(':first-child').clone().appendTo($(this));
}
});
</script>
</body>
</html>