build.sh 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #!/bin/bash
  2. set -eo pipefail
  3. image_name=$1
  4. org_name=$2
  5. push=0
  6. if [[ $3 == "--push" ]]; then
  7. push=1
  8. fi
  9. tag_suffix=$4
  10. echo "Building: $image_name"
  11. tags=()
  12. OPENHANDS_BUILD_VERSION="dev"
  13. cache_tag_base="buildcache"
  14. cache_tag="$cache_tag_base"
  15. if [[ -n $GITHUB_SHA ]]; then
  16. git_hash=$(git rev-parse --short "$GITHUB_SHA")
  17. tags+=("$git_hash")
  18. tags+=("$GITHUB_SHA")
  19. fi
  20. if [[ -n $GITHUB_REF_NAME ]]; then
  21. # check if ref name is a version number
  22. if [[ $GITHUB_REF_NAME =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  23. major_version=$(echo "$GITHUB_REF_NAME" | cut -d. -f1)
  24. minor_version=$(echo "$GITHUB_REF_NAME" | cut -d. -f1,2)
  25. tags+=("$major_version" "$minor_version")
  26. tags+=("latest")
  27. fi
  28. sanitized_ref_name=$(echo "$GITHUB_REF_NAME" | sed 's/[^a-zA-Z0-9.-]\+/-/g')
  29. OPENHANDS_BUILD_VERSION=$sanitized_ref_name
  30. sanitized_ref_name=$(echo "$sanitized_ref_name" | tr '[:upper:]' '[:lower:]') # lower case is required in tagging
  31. tags+=("$sanitized_ref_name")
  32. cache_tag+="-${sanitized_ref_name}"
  33. fi
  34. if [[ -n $tag_suffix ]]; then
  35. cache_tag+="-${tag_suffix}"
  36. for i in "${!tags[@]}"; do
  37. tags[$i]="${tags[$i]}-$tag_suffix"
  38. done
  39. fi
  40. echo "Tags: ${tags[@]}"
  41. if [[ "$image_name" == "openhands" ]]; then
  42. dir="./containers/app"
  43. elif [[ "$image_name" == "runtime" ]]; then
  44. dir="./containers/runtime"
  45. else
  46. dir="./containers/$image_name"
  47. fi
  48. if [[ (! -f "$dir/Dockerfile") && "$image_name" != "runtime" ]]; then
  49. # Allow runtime to be built without a Dockerfile
  50. echo "No Dockerfile found"
  51. exit 1
  52. fi
  53. if [[ ! -f "$dir/config.sh" ]]; then
  54. echo "No config.sh found for Dockerfile"
  55. exit 1
  56. fi
  57. source "$dir/config.sh"
  58. if [[ -n "$org_name" ]]; then
  59. DOCKER_ORG="$org_name"
  60. fi
  61. # If $DOCKER_IMAGE_HASH_TAG is set, add it to the tags
  62. if [[ -n "$DOCKER_IMAGE_HASH_TAG" ]]; then
  63. tags+=("$DOCKER_IMAGE_HASH_TAG")
  64. fi
  65. # If $DOCKER_IMAGE_TAG is set, add it to the tags
  66. if [[ -n "$DOCKER_IMAGE_TAG" ]]; then
  67. tags+=("$DOCKER_IMAGE_TAG")
  68. fi
  69. DOCKER_REPOSITORY="$DOCKER_REGISTRY/$DOCKER_ORG/$DOCKER_IMAGE"
  70. DOCKER_REPOSITORY=${DOCKER_REPOSITORY,,} # lowercase
  71. echo "Repo: $DOCKER_REPOSITORY"
  72. echo "Base dir: $DOCKER_BASE_DIR"
  73. args=""
  74. for tag in "${tags[@]}"; do
  75. args+=" -t $DOCKER_REPOSITORY:$tag"
  76. done
  77. if [[ $push -eq 1 ]]; then
  78. args+=" --push"
  79. args+=" --cache-to=type=registry,ref=$DOCKER_REPOSITORY:$cache_tag,mode=max"
  80. fi
  81. echo "Args: $args"
  82. docker buildx build \
  83. $args \
  84. --build-arg OPENHANDS_BUILD_VERSION="$OPENHANDS_BUILD_VERSION" \
  85. --cache-from=type=registry,ref=$DOCKER_REPOSITORY:$cache_tag \
  86. --cache-from=type=registry,ref=$DOCKER_REPOSITORY:$cache_tag_base-main \
  87. --platform linux/amd64,linux/arm64 \
  88. --provenance=false \
  89. -f "$dir/Dockerfile" \
  90. "$DOCKER_BASE_DIR"