diff --git a/build/make-release-notes.sh b/build/make-release-notes.sh new file mode 100755 index 00000000000..c8973a07347 --- /dev/null +++ b/build/make-release-notes.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Copyright 2015 Google Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Clean out the output directory on the docker host. +set -o errexit +set -o nounset +set -o pipefail + +function pop_dir { + popd > /dev/null +} + +KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. + +if [[ -z "${1:-}" ]]; then + echo "Usage: ${0} " + exit 1 +fi + +pushd . > /dev/null +trap 'pop_dir' INT TERM EXIT + +cd ${KUBE_ROOT}/contrib/release-notes +# TODO: vendor these dependencies, but using godep again will be annoying... +GOPATH=$PWD go get github.com/google/go-github/github +GOPATH=$PWD go get github.com/google/go-querystring/query +GOPATH=$PWD go build release-notes.go +./release-notes --last-release-pr=${1} + diff --git a/contrib/release-notes/README.md b/contrib/release-notes/README.md new file mode 100644 index 00000000000..ed52fb290af --- /dev/null +++ b/contrib/release-notes/README.md @@ -0,0 +1,7 @@ +## A simple tool that scrapes the github API to build a starting point for release notes. + +### Usage +```bash +${KUBERNETES_ROOT}/build/make-release-notes.sh +``` + diff --git a/contrib/release-notes/release-notes.go b/contrib/release-notes/release-notes.go new file mode 100644 index 00000000000..cd2be693647 --- /dev/null +++ b/contrib/release-notes/release-notes.go @@ -0,0 +1,73 @@ +/* +Copyright 2015 Google Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "bytes" + "flag" + "fmt" + "os" + + "github.com/google/go-github/github" +) + +var target = flag.Int("last-release-pr", 0, "The PR number of the last versioned release.") + +func main() { + flag.Parse() + // Automatically determine this from github. + if *target == 0 { + fmt.Printf("--last-release-pr is required.\n") + os.Exit(1) + } + + client := github.NewClient(nil) + + done := false + + opts := github.PullRequestListOptions{ + State: "closed", + Sort: "updated", + Direction: "desc", + ListOptions: github.ListOptions{ + Page: 0, + PerPage: 100, + }, + } + + buffer := &bytes.Buffer{} + for !done { + opts.Page++ + results, _, err := client.PullRequests.List("GoogleCloudPlatform", "kubernetes", &opts) + if err != nil { + fmt.Printf("Error contacting github: %v", err) + os.Exit(1) + } + for _, result := range results { + // Skip Closed but not Merged PRs + if result.MergedAt == nil { + continue + } + if *result.Number == *target { + done = true + break + } + fmt.Fprintf(buffer, " * %s #%d (%s)\n", *result.Title, *result.Number, *result.User.Login) + } + } + fmt.Printf("%s", buffer.Bytes()) +} diff --git a/docs/making-release-notes.md b/docs/making-release-notes.md new file mode 100644 index 00000000000..d7ee79ae6dc --- /dev/null +++ b/docs/making-release-notes.md @@ -0,0 +1,30 @@ +## Making release notes +This documents the process for making release notes for a release. + +### 1) Note the PR number of the previous release +Find the PR that was merged with the previous release. Remember this number +_TODO_: Figure out a way to record this somewhere to save the next release engineer time. + +### 2) Build the release-notes tool +```bash +${KUBERNETES_ROOT}/build/make-release-notes.sh +``` + +### 3) Trim the release notes +This generates a list of the entire set of PRs merged since the last release. It is likely long +and many PRs aren't worth mentioning. + +Open up ```candidate-notes.md``` in your favorite editor. + +Remove, regroup, organize to your hearts content. + + +### 4) Update CHANGELOG.md +With the final markdown all set, cut and paste it to the top of ```CHANGELOG.md``` + +### 5) Update the Release page + * Switch to the [releases](https://github.com/GoogleCloudPlatform/kubernetes/releases) page. + * Open up the release you are working on. + * Cut and paste the final markdown from above into the release notes + * Press Save. +