diff --git a/Release.Jenkinsfile b/Release.Jenkinsfile index 76a990e0d..aa205c6c8 100644 --- a/Release.Jenkinsfile +++ b/Release.Jenkinsfile @@ -53,6 +53,19 @@ pipeline { } } } + stage('Generate Changelog') { + agent { + label 'linux' + } + steps { + checkout scm + withCredentials([string(credentialsId: 'github-compose-release-test-token', variable: 'GITHUB_TOKEN')]) { + sh "./script/release/generate_changelog.sh" + } + archiveArtifacts artifacts: 'CHANGELOG.md' + stash( name: "changelog", includes: 'CHANGELOG.md' ) + } + } stage('Package') { parallel { stage('macosx binary') { @@ -153,7 +166,7 @@ pipeline { unstash "bin-darwin" unstash "bin-linux" unstash "bin-win" - githubRelease("docker/compose") + githubRelease() } } } @@ -272,3 +285,29 @@ def pushRuntimeImage(baseImage) { } } } + +def githubRelease() { + withCredentials([string(credentialsId: 'github-compose-release-test-token', variable: 'GITHUB_TOKEN')]) { + def prerelease = !( env.TAG_NAME ==~ /v[0-9\.]+/ ) + def data = """{ + \"tag_name\": \"${env.TAG_NAME}\", + \"name\": \"${env.TAG_NAME}\", + \"draft\": true, + \"prerelease\": ${prerelease}, + \"body\" : \"${changelog}\" + """ + echo $data + + def url = "https://api.github.com/repos/docker/compose/releases" + def upload_url = sh(returnStdout: true, script: """ + curl -sSf -H 'Authorization: token ${GITHUB_TOKEN}' -H 'Accept: application/json' -H 'Content-type: application/json' -X POST -d '$data' $url") \\ + | jq '.upload_url | .[:rindex("{")]' + """) + sh(""" + for f in * ; do + curl -sf -H 'Authorization: token ${GITHUB_TOKEN}' -H 'Accept: application/json' -H 'Content-type: application/octet-stream' \\ + -X POST --data-binary @\$f ${upload_url}?name=\$f; + done + """) + } +} diff --git a/script/release/generate_changelog.sh b/script/release/generate_changelog.sh new file mode 100755 index 000000000..783e74400 --- /dev/null +++ b/script/release/generate_changelog.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +set -e +set -x + +## Usage : +## changelog PREVIOUS_TAG..HEAD + +# configure refs so we get pull-requests metadata +git config --add remote.origin.fetch +refs/pull/*/head:refs/remotes/origin/pull/* +git fetch origin + +RANGE=${1:-"$(git describe --tags --abbrev=0)..HEAD"} +echo "Generate changelog for range ${RANGE}" +echo + +pullrequests() { + for commit in $(git log ${RANGE} --format='format:%H'); do + # Get the oldest remotes/origin/pull/* branch to include this commit, i.e. the one to introduce it + git branch -a --sort=committerdate --contains $commit --list 'origin/pull/*' | head -1 | cut -d'/' -f4 + done +} + +changes=$(pullrequests | uniq) + +echo "pull requests merged within range:" +echo $changes + +echo '#Features' > CHANGELOG.md +for pr in $changes; do + curl -fs -H "Authorization: token ${GITHUB_TOKEN}" https://api.github.com/repos/docker/compose/pulls/${pr} \ + | jq -r ' select( .labels[].name | contains("kind/feature") ) | "* "+.title' >> CHANGELOG.md +done + +echo '#Bugs' >> CHANGELOG.md +for pr in $changes; do + curl -fs -H "Authorization: token ${GITHUB_TOKEN}" https://api.github.com/repos/docker/compose/pulls/${pr} \ + | jq -r ' select( .labels[].name | contains("kind/bug") ) | "* "+.title' >> CHANGELOG.md +done