Add release process
authorTom Denham <tom@tomdee.co.uk>
Wed, 5 Jul 2017 19:05:14 +0000 (12:05 -0700)
committerTom Denham <tom@tomdee.co.uk>
Tue, 11 Jul 2017 20:57:49 +0000 (13:57 -0700)
Copied from containernetworking/cni

The only difference is that the release archives also include the the
word "plugin"

RELEASING.md [new file with mode: 0644]
scripts/release.sh [new file with mode: 0755]

diff --git a/RELEASING.md b/RELEASING.md
new file mode 100644 (file)
index 0000000..ebb1e31
--- /dev/null
@@ -0,0 +1,35 @@
+# Release process
+
+## Resulting artifacts
+Creating a new release produces the following artifacts:
+
+- Binaries (stored in the `release-<TAG>` directory) :
+  - `cni-plugins-<PLATFORM>-<VERSION>.tgz` binaries
+  - `cni-plugins-<VERSION>.tgz` binary (copy of amd64 platform binary)
+  - `sha1`, `sha256` and `sha512` files for the above files.
+
+## Preparing for a release
+1. Releases are performed by maintainers and should usually be discussed and planned at a maintainer meeting.
+  - Choose the version number. It should be prefixed with `v`, e.g. `v1.2.3`
+  - Take a quick scan through the PRs and issues to make sure there isn't anything crucial that _must_ be in the next release.
+  - Create a draft of the release note
+  - Discuss the level of testing that's needed and create a test plan if sensible
+  - Check what version of `go` is used in the build container, updating it if there's a new stable release.
+  - Update the vendor directory and Godeps to pin to the corresponding containernetworking/cni release. Create a PR, makes sure it passes CI and get it merged.
+
+## Creating the release artifacts
+1. Make sure you are on the master branch and don't have any local uncommitted changes.
+1. Create a signed tag for the release `git tag -s $VERSION` (Ensure that GPG keys are created and added to GitHub)
+1. Run the release script from the root of the repository
+  - `scripts/release.sh`
+  - The script requires Docker and ensures that a consistent environment is used.
+  - The artifacts will now be present in the `release-<TAG>` directory.
+1. Test these binaries according to the test plan.
+
+## Publishing the release
+1. Push the tag to git `git push origin <TAG>`
+1. Create a release on Github, using the tag which was just pushed.
+1. Attach all the artifacts from the release directory.
+1. Add the release note to the release.
+1. Announce the release on at least the CNI mailing, IRC and Slack.
+
diff --git a/scripts/release.sh b/scripts/release.sh
new file mode 100755 (executable)
index 0000000..35d1aa7
--- /dev/null
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+set -xe
+
+SRC_DIR="${SRC_DIR:-$PWD}"
+BUILDFLAGS="-a --ldflags '-extldflags \"-static\"'"
+
+TAG=$(git describe --tags --dirty)
+RELEASE_DIR=release-${TAG}
+
+OUTPUT_DIR=bin
+
+# Always clean first
+rm -Rf ${SRC_DIR}/${RELEASE_DIR}
+mkdir -p ${SRC_DIR}/${RELEASE_DIR}
+
+docker run -i -v ${SRC_DIR}:/opt/src --rm golang:1.8-alpine \
+/bin/sh -xe -c "\
+    apk --no-cache add bash tar;
+    cd /opt/src; umask 0022;
+    for arch in amd64 arm arm64 ppc64le s390x; do \
+        CGO_ENABLED=0 GOARCH=\$arch ./build.sh ${BUILDFLAGS}; \
+        for format in tgz; do \
+            FILENAME=cni-plugins-\$arch-${TAG}.\$format; \
+            FILEPATH=${RELEASE_DIR}/\$FILENAME; \
+            tar -C ${OUTPUT_DIR} --owner=0 --group=0 -caf \$FILEPATH .; \
+            if [ \"\$arch\" == \"amd64\" ]; then \
+                cp \$FILEPATH ${RELEASE_DIR}/cni-${TAG}.\$format; \
+            fi; \
+        done; \
+    done;
+    cd ${RELEASE_DIR};
+      for f in *.tgz; do sha1sum \$f > \$f.sha1; done;
+      for f in *.tgz; do sha256sum \$f > \$f.sha256; done;
+      for f in *.tgz; do sha512sum \$f > \$f.sha512; done;
+    cd ..
+    chown -R ${UID} ${OUTPUT_DIR} ${RELEASE_DIR}"