You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
3.0 KiB

  1. #!/bin/bash
  2. #!-
  3. . /etc/shlib
  4. #!-
  5. DOCKER_UPDATE_PATH=${DOCKER_UPDATE_PATH:-/srv/docker-builder}
  6. KEEP_ONLY_PO="fr en de"
  7. include common
  8. include pretty
  9. ansi_color no
  10. usage="$exname COMPONENT MASTER_IMAGE_NAME BRANCH UPDATED_IMAGE_NAME"
  11. COMPONENT_NAME="$1"
  12. MASTER_IMAGE_NAME="$2"
  13. BRANCH="$3"
  14. UPDATED_IMAGE_NAME="$4"
  15. ## Note: we will need in the DOCKER_UPDATE_HOST:
  16. ## - git-sub
  17. ## should we check for aufs ?
  18. mkdir -p "$DOCKER_UPDATE_PATH"
  19. cd "$DOCKER_UPDATE_PATH"
  20. if ! [ -d "$COMPONENT_NAME" ]; then
  21. echo "ERROR: repository $DOCKER_UPDATE_PATH/$COMPONENT_NAME is not existent."
  22. echo "You should build it on this host prior to run this hook."
  23. echo "As a remainder: this host is supposed to keep the reference git that"
  24. echo "was used to built the master image."
  25. exit 1
  26. fi
  27. lock=$DOCKER_UPDATE_PATH/$COMPONENT_NAME.lock
  28. if [ -e "$lock" ]; then
  29. echo "Master is being updated."
  30. echo "Or '$lock' file was left dangling over."
  31. exit 1
  32. fi
  33. touch "$lock"
  34. ## This path is on the docker HOST !
  35. AUFS_APPLY_PATH=${AUFS_APPLY_PATH:-/opt/apps/aufs_apply/bin/aufs_apply}
  36. md5() {
  37. find "$@" -type f -exec md5sum {} \; 2>/dev/null | md5sum | cut -f 1 -d " "
  38. }
  39. clean_all() {
  40. cd /
  41. mountpoint "$tmpdir_root" 2>/dev/null && umount "$tmpdir_root"
  42. [ -d "$tmpdir_root" ] && rmdir "$tmpdir_root"
  43. [ -d "$tmpdir_changes" ] && rm -rf "$tmpdir_changes"
  44. rm "$lock"
  45. }
  46. tmpdir="$DOCKER_UPDATE_PATH"/tmp
  47. mkdir -p "$tmpdir"
  48. tmpdir_changes=$(mktemp -d $tmpdir/$COMPONENT_NAME.changes.XXXXXX)
  49. tmpdir_root=$(mktemp -d $tmpdir/$COMPONENT_NAME.root.XXXXXX)
  50. trap "clean_all" EXIT
  51. mount -t aufs -o br=$tmpdir_changes:$DOCKER_UPDATE_PATH/$COMPONENT_NAME -o udba=none none "$tmpdir_root"
  52. cd "$tmpdir_root"
  53. ## XXXvlab: We probably would need to:
  54. ## - fetch only the module concerned
  55. ## - fetch only the ref concerned
  56. Wrap -d "Update source code" <<EOF
  57. git fetch origin "$BRANCH"
  58. git checkout "$BRANCH"
  59. git reset --hard origin/$BRANCH
  60. #git reset --hard "origin/$BRANCH"
  61. git sub update
  62. EOF
  63. cd / &&
  64. umount "$tmpdir_root" &&
  65. rmdir "$tmpdir_root"
  66. if [ "$?" != 0 ]; then
  67. echo "Uh oh... could not umount aufs $tmpdir_root or delete it."
  68. exit 1
  69. fi
  70. cd "$tmpdir_changes"
  71. Wrap -d "Cleaning the change layer." <<EOF
  72. find . -name .git -type d -exec rm -rf {} \; -prune
  73. if [ "$KEEP_ONLY_PO" ]; then
  74. find_args=""
  75. for lang in $KEEP_ONLY_PO; do
  76. find_args="\$find_args -not -name \$lang.po"
  77. done
  78. find /opt/apps -name \*.po -type f \$find_args -delete
  79. fi
  80. EOF
  81. ## XXXvlab: if we produced it we shouldn't have to pull it
  82. #
  83. #echo "Pulling $MASTER_IMAGE_NAME"
  84. #docker pull "$MASTER_IMAGE_NAME" || exit 1
  85. docker tag "$MASTER_IMAGE_NAME" "$UPDATED_IMAGE_NAME"
  86. Elt "Updating $MASTER_IMAGE_NAME"
  87. print_info $(cat <<EOF | docker-update "$UPDATED_IMAGE_NAME" -v "$tmpdir_changes:/mnt/changes" -v "$AUFS_APPLY_PATH:/usr/bin/aufs_apply"
  88. ## Applying changes: $(cd "$tmpdir_changes" ; md5 ".")
  89. /usr/bin/aufs_apply /opt/apps/0k-oe /mnt/changes
  90. EOF
  91. )
  92. Feedback || exit 1
  93. Wrap -d "Push new $YELLOW$UPDATED_IMAGE_NAME$NORMAL to registry" docker push "$UPDATED_IMAGE_NAME"