diff --git a/.travis.yml b/.travis.yml index 5920c86..0850b00 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,8 @@ install: - make lint - "./test.exp" - make lint # rerun lint to see if output is different with .env in place + - echo "docker_repo=$docker_repo" >> .env + - echo "DOCKERREADME=yes" >> .env # add DOCKERREADME env var so that make publish also updates readme files on docker hub - travis_retry make build-all script: - make test-ci diff --git a/.travis/docker-hub-helper.sh b/.travis/docker-hub-helper.sh new file mode 100755 index 0000000..5b20046 --- /dev/null +++ b/.travis/docker-hub-helper.sh @@ -0,0 +1,95 @@ +#!/bin/bash +# bash .travis/docker-hub-helper.sh base + +set -euo pipefail +IFS=$'\n\t' + +# this is a kind of ugly hack to be able to source the env file +# this is sadly needed since postfix in https://github.com/tomav/docker-mailserver/ cannot deal with quoted values +tmpfile=$(mktemp /tmp/kopano-docker-env.XXXXXX) +cp ./.env "$tmpfile" +sed -i '/LDAP_QUERY_FILTER/s/^/#/g' "$tmpfile" +sed -i '/SASLAUTHD_LDAP_FILTER/s/^/#/g' "$tmpfile" +# shellcheck disable=SC1090 +source "$tmpfile" + +docker_repo=${docker_repo:-zokradonh} +docker_login=${docker_login:-""} +docker_pwd=${docker_pwd:-""} + +if [ -z "$docker_login" ]; then + docker_login="$(<~/.docker-account-user)" +fi + +if [ -z "$docker_pwd" ]; then + docker_pwd="$(<~/.docker-account-pwd)" +fi + +image=${1:-""} +if [ -z "$image" ]; then + echo "ERROR: You must specify an image to modify." + exit 1 +fi + +# below code is based on https://github.com/moikot/golang-dep/blob/aab3ea8462a19407544f1ce9daa11c3f0924394c/.travis/push.sh +# +# Pushes README.md content to Docker Hub. +# +# $1 - The image name. +# $2 - The JWT. +# +# Examples: +# +# push_readme "foo/bar" "token" +# +push_readme() { + declare -r image="${1}" + declare -r token="${2}" + declare -r readme="${3}" + + local code + code=$(jq -n --arg msg "$(<"${readme}")" \ + '{"registry":"registry-1.docker.io","full_description": $msg }' | \ + curl -s -o /dev/null -L -w "%{http_code}" \ + https://cloud.docker.com/v2/repositories/"${image}"/ \ + -d @- -X PATCH \ + -H "Content-Type: application/json" \ + -H "Authorization: JWT ${token}") + + if [[ "${code}" = "200" ]]; then + printf "Successfully pushed README to Docker Hub" + else + printf "Unable to push README to Docker Hub, response code: %s\n" "${code}" + exit 1 + fi + + local code + code=$(jq -n --arg msg "$(head -n 1 "${readme}" | cut -d' ' -f2-)" \ + '{"registry":"registry-1.docker.io","description": $msg }' | \ + curl -s -o /dev/null -L -w "%{http_code}" \ + https://cloud.docker.com/v2/repositories/"${image}"/ \ + -d @- -X PATCH \ + -H "Content-Type: application/json" \ + -H "Authorization: JWT ${token}") + + if [[ "${code}" = "200" ]]; then + printf "Successfully pushed description to Docker Hub" + else + printf "Unable to push description to Docker Hub, response code: %s\n" "${code}" + exit 1 + fi +} + +# Login into Docker repository +#echo "$docker_pwd" | docker login -u "$docker_login" --password-stdin + +token=$(curl -s -X POST \ +-H "Content-Type: application/json" \ +-d '{"username": "'"$docker_login"'", "password": "'"$docker_pwd"'"}' \ +https://hub.docker.com/v2/users/login/ | jq -r .token) + +push_readme "${docker_repo}"/kopano_"${image}" "${token}" "${image}"/README.md + +if [ -e "$tmpfile" ]; then + rm "$tmpfile" +fi diff --git a/Makefile b/Makefile index d1cc8e4..4135c24 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,8 @@ SHELL := /bin/bash # Use bash syntax # if not run in travis, get docker_login and _pwd from file ifndef TRAVIS docker_repo := zokradonh - docker_login := `cat ~/.docker-account-user` - docker_pwd := `cat ~/.docker-account-pwd` + docker_login := $(shell cat ~/.docker-account-user) + docker_pwd := $(shell cat ~/.docker-account-pwd) endif base_download_version := $(shell ./version.sh core) @@ -256,7 +256,7 @@ tag-zpush: # Docker publish repo-login: ## Login at hub.docker.com - @docker login -u $(docker_login) -p $(docker_pwd) + @echo $(docker_pwd) | docker login -u $(docker_login) --password-stdin .PHONY: publish publish: repo-login @@ -267,6 +267,9 @@ publish-container: ## Helper target to push a given image to a registry. Default @echo 'publish latest to $(docker_repo)/kopano_$(component)' docker push $(docker_repo)/kopano_$(component):${$(component)_version} docker push $(docker_repo)/kopano_$(component):latest +ifdef DOCKERREADME + .travis/docker-hub-helper.sh $(component) +endif publish-base: tag-base component=base make publish-container