publish.sh 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #!/usr/bin/env bash
  2. #
  3. # Cross-arch docker publish helper script
  4. # Needs docker in version >18.02 due to usage of manifests
  5. #
  6. # Copyright: SPDX-License-Identifier: GPL-3.0-or-later
  7. #
  8. # Author : Pavlos Emm. Katsoulakis (paul@netdata.cloud)
  9. set -e
  10. if [ "${BASH_VERSINFO[0]}" -lt "4" ]; then
  11. echo "This mechanism currently can only run on BASH version 4 and above"
  12. exit 1
  13. fi
  14. WORKDIR="$(mktemp -d)" # Temporary folder, removed after script is done
  15. VERSION="$1"
  16. declare -A ARCH_MAP
  17. ARCH_MAP=(["i386"]="386" ["amd64"]="amd64" ["armhf"]="arm" ["aarch64"]="arm64")
  18. DEVEL_ARCHS=(amd64)
  19. ARCHS="${!ARCH_MAP[@]}"
  20. DOCKER_CMD="docker --config ${WORKDIR}"
  21. GIT_MAIL=${GIT_MAIL:-"bot@netdata.cloud"}
  22. GIT_USER=${GIT_USER:-"netdatabot"}
  23. if [ -z ${REPOSITORY} ]; then
  24. REPOSITORY="${TRAVIS_REPO_SLUG}"
  25. if [ -z ${REPOSITORY} ]; then
  26. echo "REPOSITORY not set, publish cannot proceed"
  27. exit 1
  28. else
  29. echo "REPOSITORY was not detected, attempted to use TRAVIS_REPO_SLUG setting: ${TRAVIS_REPO_SLUG}"
  30. fi
  31. fi
  32. # When development mode is set, build on DEVEL_ARCHS
  33. if [ ! -z ${DEVEL+x} ]; then
  34. declare -a ARCHS=(${DEVEL_ARCHS[@]})
  35. fi
  36. # Ensure there is a version, the most appropriate one
  37. if [ "${VERSION}" == "" ]; then
  38. VERSION=$(git tag --points-at)
  39. if [ "${VERSION}" == "" ]; then
  40. VERSION="latest"
  41. fi
  42. fi
  43. MANIFEST_LIST="${REPOSITORY}:${VERSION}"
  44. # There is no reason to continue if we cannot log in to docker hub
  45. if [ -z ${DOCKER_USERNAME+x} ] || [ -z ${DOCKER_PWD+x} ]; then
  46. echo "No docker hub username or password found, aborting without publishing"
  47. exit 1
  48. fi
  49. # If we are not in netdata git repo, at the top level directory, fail
  50. TOP_LEVEL=$(basename "$(git rev-parse --show-toplevel)")
  51. CWD=$(git rev-parse --show-cdup)
  52. if [ ! -z $CWD ] || [ ! "${TOP_LEVEL}" == "netdata" ]; then
  53. echo "Run as ./packaging/docker/$(basename "$0") from top level directory of netdata git repository"
  54. echo "Docker build process aborted"
  55. exit 1
  56. fi
  57. echo "Docker image publishing in progress.."
  58. echo "Version : ${VERSION}"
  59. echo "Repository : ${REPOSITORY}"
  60. echo "Architectures : ${ARCHS[*]}"
  61. echo "Manifest list : ${MANIFEST_LIST}"
  62. # Create temporary docker CLI config with experimental features enabled (manifests v2 need it)
  63. echo '{"experimental":"enabled"}' > "${WORKDIR}"/config.json
  64. # Login to docker hub to allow futher operations
  65. echo "$DOCKER_PWD" | $DOCKER_CMD login -u "$DOCKER_USERNAME" --password-stdin
  66. # Push images to registry
  67. for ARCH in ${ARCHS[@]}; do
  68. TAG="${MANIFEST_LIST}-${ARCH}"
  69. echo "Publishing image ${TAG}.."
  70. $DOCKER_CMD push "${TAG}" &
  71. echo "Image ${TAG} published succesfully!"
  72. done
  73. echo "Waiting for images publishing to complete"
  74. wait
  75. # Recreate docker manifest list
  76. echo "Creating manifest list.."
  77. $DOCKER_CMD manifest create --amend "${MANIFEST_LIST}" \
  78. "${MANIFEST_LIST}-i386" \
  79. "${MANIFEST_LIST}-armhf" \
  80. "${MANIFEST_LIST}-aarch64" \
  81. "${MANIFEST_LIST}-amd64"
  82. # Annotate manifest with CPU architecture information
  83. echo "Executing manifest annotate.."
  84. for ARCH in ${ARCHS[@]}; do
  85. TAG="${MANIFEST_LIST}-${ARCH}"
  86. echo "Annotating manifest for $ARCH, with TAG: ${TAG} (Manifest list: ${MANIFEST_LIST})"
  87. $DOCKER_CMD manifest annotate "${MANIFEST_LIST}" "${TAG}" --os linux --arch "${ARCH_MAP[$ARCH]}"
  88. done
  89. # Push manifest to docker hub
  90. echo "Pushing manifest list to docker.."
  91. $DOCKER_CMD manifest push -p "${MANIFEST_LIST}"
  92. # Show current manifest (debugging purpose only)
  93. echo "Evaluating manifest list entry"
  94. $DOCKER_CMD manifest inspect "${MANIFEST_LIST}"
  95. # Cleanup
  96. rm -r "${WORKDIR}"
  97. echo "Docker publishing process completed!"