blob: a0575378ac1eefaf7a86e7d32ce493bf0dae7725 [file] [log] [blame]
Carlos Sanchez0f763d42017-02-06 10:55:11 +01001#!/bin/bash -eu
2
3# Publish any versions of the docker image not yet pushed to jenkinsci/jenkins
Carlos Sanchez7fd3f212017-02-15 08:53:31 +01004# Arguments:
5# -n dry run, do not build or publish images
Carlos Sanchez0f763d42017-02-06 10:55:11 +01006
7set -o pipefail
8
9sort-versions() {
10 if [ "$(uname)" == 'Darwin' ]; then
11 gsort --version-sort
12 else
13 sort --version-sort
14 fi
15}
16
17# Try tagging with and without -f to support all versions of docker
18docker-tag() {
19 local from="jenkinsci/jenkins:$1"
20 local to="jenkinsci/jenkins:$2"
21 local out
22 if out=$(docker tag -f "$from" "$to" 2>&1); then
23 echo "$out"
24 else
25 docker tag "$from" "$to"
26 fi
27}
28
Carlos Sanchez3ffc4e42017-02-06 13:20:44 +010029get-variant() {
Carlos Sanchezd43f4292017-02-06 13:50:34 +010030 local branch
Carlos Sancheze43b7f92017-02-06 14:12:03 +010031 branch=$(git show-ref | grep $(git rev-list -n 1 HEAD) | tail -1 | rev | cut -d/ -f 1 | rev)
Carlos Sanchezd43f4292017-02-06 13:50:34 +010032 if [ -z "$branch" ]; then
33 >&2 echo "Could not get the current branch name for commit, not in a branch?: $(git rev-list -n 1 HEAD)"
34 return 1
35 fi
Carlos Sanchez3ffc4e42017-02-06 13:20:44 +010036 case "$branch" in
37 master) echo "" ;;
38 *) echo "-${branch}" ;;
39 esac
40}
41
Carlos Sanchez881d1432017-02-15 10:02:16 +010042login-token() {
43 # could use jq .token
44 curl -q -sSL https://auth.docker.io/token\?service\=registry.docker.io\&scope\=repository:jenkinsci/jenkins:pull | grep -o '"token":"[^"]*"' | cut -d':' -f 2 | xargs echo
45}
46
47is-published() {
Carlos Sanchezef7d4ef2017-03-02 11:12:08 +053048 get-manifest "$1" &> /dev/null
Carlos Sanchez881d1432017-02-15 10:02:16 +010049}
50
51get-manifest() {
52 local tag=$1
53 curl -q -fsSL -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -H "Authorization: Bearer $TOKEN" "https://index.docker.io/v2/jenkinsci/jenkins/manifests/$tag"
54}
55
56get-digest() {
57 #get-manifest "$1" | jq .config.digest
58 get-manifest "$1" | grep -A 10 -o '"config".*' | grep digest | head -1 | cut -d':' -f 2,3 | xargs echo
59}
60
Carlos Sanchez0f763d42017-02-06 10:55:11 +010061get-latest-versions() {
62 curl -q -fsSL https://api.github.com/repos/jenkinsci/jenkins/tags?per_page=20 | grep '"name": "jenkins-' | egrep -o '[0-9]+(\.[0-9]+)+' | sort-versions | uniq
63}
64
65publish() {
66 local version=$1
Carlos Sanchez3ffc4e42017-02-06 13:20:44 +010067 local variant=$2
68 local tag="${version}${variant}"
Carlos Sanchez0f763d42017-02-06 10:55:11 +010069 local sha
70 local build_opts="--no-cache --pull"
71
72 sha=$(curl -q -fsSL "http://repo.jenkins-ci.org/simple/releases/org/jenkins-ci/main/jenkins-war/${version}/jenkins-war-${version}.war.sha1")
73
Carlos Sanchez7b8382f2017-02-06 12:00:52 +010074 docker build --build-arg "JENKINS_VERSION=$version" \
75 --build-arg "JENKINS_SHA=$sha" \
Carlos Sanchez3ffc4e42017-02-06 13:20:44 +010076 --tag "jenkinsci/jenkins:${tag}" ${build_opts} .
Carlos Sanchez0f763d42017-02-06 10:55:11 +010077
Carlos Sanchez3ffc4e42017-02-06 13:20:44 +010078 docker push "jenkinsci/jenkins:${tag}"
Carlos Sanchez4b0dcec2017-02-14 00:10:14 +010079}
80
Carlos Sanchez881d1432017-02-15 10:02:16 +010081tag-and-push() {
82 local source=$1
83 local target=$2
Carlos Sanchezef7d4ef2017-03-02 11:12:08 +053084 local digest_source; digest_source=$(get-digest ${tag1})
85 local digest_target; digest_target=$(get-digest ${tag2})
86 if [ "$digest_source" == "$digest_target" ]; then
87 echo "Images ${source} [$digest_source] and ${target} [$digest_target] are already the same, not updating tags"
Carlos Sanchezb108a532017-02-06 14:30:56 +010088 else
Carlos Sanchez881d1432017-02-15 10:02:16 +010089 echo "Creating tag ${target} pointing to ${source}"
Carlos Sanchez7fd3f212017-02-15 08:53:31 +010090 if [ ! "$dry_run" = true ]; then
Carlos Sanchez881d1432017-02-15 10:02:16 +010091 docker-tag "jenkinsci/jenkins:${source}" "jenkinsci/jenkins:${target}"
92 docker push "jenkinsci/jenkins:${source}"
Carlos Sanchez7fd3f212017-02-15 08:53:31 +010093 fi
Carlos Sanchezb108a532017-02-06 14:30:56 +010094 fi
Carlos Sanchez0f763d42017-02-06 10:55:11 +010095}
96
Carlos Sanchez881d1432017-02-15 10:02:16 +010097publish-latest() {
98 local version=$1
Carlos Sanchez4b0dcec2017-02-14 00:10:14 +010099 local variant=$2
Carlos Sanchez881d1432017-02-15 10:02:16 +0100100
101 # push latest (for master) or the name of the branch (for other branches)
102 if [ -z "${variant}" ]; then
103 tag-and-push "${version}${variant}" "latest"
104 else
105 tag-and-push "${version}${variant}" "${variant#-}"
Carlos Sanchez7fd3f212017-02-15 08:53:31 +0100106 fi
Carlos Sanchez4b0dcec2017-02-14 00:10:14 +0100107}
108
Carlos Sanchez881d1432017-02-15 10:02:16 +0100109publish-lts() {
110 local version=$1
111 local variant=$2
112 tag-and-push "${version}" "lts${variant}"
113}
114
Carlos Sanchez7fd3f212017-02-15 08:53:31 +0100115dry_run=false
116if [ "-n" == "${1:-}" ]; then
117 dry_run=true
118fi
119if [ "$dry_run" = true ]; then
120 echo "Dry run, will not build or publish images"
121fi
Carlos Sanchez4b0dcec2017-02-14 00:10:14 +0100122
Carlos Sanchez881d1432017-02-15 10:02:16 +0100123TOKEN=$(login-token)
124
Carlos Sanchez3ffc4e42017-02-06 13:20:44 +0100125variant=$(get-variant)
126
Carlos Sanchez881d1432017-02-15 10:02:16 +0100127lts_version=""
128version=""
Carlos Sanchez0f763d42017-02-06 10:55:11 +0100129for version in $(get-latest-versions); do
Carlos Sanchez881d1432017-02-15 10:02:16 +0100130 if is-published "$version$variant"; then
131 echo "Tag is already published: $version$variant"
Carlos Sanchez0f763d42017-02-06 10:55:11 +0100132 else
Carlos Sanchez881d1432017-02-15 10:02:16 +0100133 echo "Publishing version: $version$variant"
Carlos Sanchez7fd3f212017-02-15 08:53:31 +0100134 if [ ! "$dry_run" = true ]; then
135 publish "$version" "$variant"
136 fi
Carlos Sanchez0f763d42017-02-06 10:55:11 +0100137 fi
Carlos Sanchez4b0dcec2017-02-14 00:10:14 +0100138
139 # Update lts tag
140 if [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
Carlos Sanchez881d1432017-02-15 10:02:16 +0100141 lts_version="${version}"
Carlos Sanchez4b0dcec2017-02-14 00:10:14 +0100142 fi
Carlos Sanchez0f763d42017-02-06 10:55:11 +0100143done
144
Carlos Sanchez881d1432017-02-15 10:02:16 +0100145publish-latest "${version}" "${variant}"
146if [ -n "${lts_version}" ]; then
147 publish-lts "${lts_version}" "${variant}"
Carlos Sanchez4b0dcec2017-02-14 00:10:14 +0100148fi