diff --git a/.github/workflows/ghcr.yml b/.github/workflows/ghcr.yml index 77743a2e02..75129e75fb 100644 --- a/.github/workflows/ghcr.yml +++ b/.github/workflows/ghcr.yml @@ -6,14 +6,14 @@ on: workflow_dispatch: inputs: reason: - description: 'Why manual trigger?' - required: false + description: 'Reason for manual trigger' + required: true default: '' jobs: ghcr_build_and_push: runs-on: ubuntu-latest - if: github.event_name == 'push' + if: github.event_name == 'push' || github.event.inputs.reason != '' steps: - name: checkout @@ -35,11 +35,25 @@ jobs: DOCKER_BUILD_ORG=$(echo "${{ github.repository }}" | tr '[A-Z]' '[a-z]' | cut -d '/' -f 1) # Find directories containing Dockerfile but not containing .dockerfileignore while IFS= read -r dockerfile_dir; do + # Check if .dockerfileignore exists in the directory - if [ ! -f "$dockerfile_dir/.dockerfileignore" ]; then - # Change directory and execute 'make all' - pushd "$dockerfile_dir" > /dev/null - make all DOCKER_BUILD_ORG=$DOCKER_BUILD_ORG - popd > /dev/null + if [ -f "$dockerfile_dir/.dockerfileignore" ]; then + echo "$dockerfile_dir/.dockerfileignore exists, skipping build and push" + continue fi + + # Check if image was already exist in ghcr.io + pushd "$dockerfile_dir" > /dev/null + FULL_IMAGE=$(make get-full-image DOCKER_BUILD_ORG=$DOCKER_BUILD_ORG) + popd > /dev/null + EXISTS=$(docker manifest inspect "$FULL_IMAGE" > /dev/null 2>&1 && echo "true" || echo "false") + if [ "$EXISTS" == "true" ]; then + echo "Image $FULL_IMAGE already exists in ghcr.io, skipping build and push" + continue + fi + + # Build and push the image to ghcr.io + pushd "$dockerfile_dir" > /dev/null + make all DOCKER_BUILD_ORG=$DOCKER_BUILD_ORG + popd > /dev/null done < <(find . -type f -name Dockerfile -exec dirname {} \; | sort -u) diff --git a/evaluation/SWE-bench/Makefile b/evaluation/SWE-bench/Makefile index f40f11824d..1d72f8f46f 100644 --- a/evaluation/SWE-bench/Makefile +++ b/evaluation/SWE-bench/Makefile @@ -1,10 +1,16 @@ DOCKER_BUILD_REGISTRY=ghcr.io DOCKER_BUILD_ORG=opendevin DOCKER_BUILD_REPO=eval-swe-bench -DOCKER_BUILD_TAG=v0.1 +DOCKER_BUILD_TAG=v0.1.0 FULL_IMAGE=$(DOCKER_BUILD_REGISTRY)/$(DOCKER_BUILD_ORG)/$(DOCKER_BUILD_REPO):$(DOCKER_BUILD_TAG) + LATEST_FULL_IMAGE=$(DOCKER_BUILD_REGISTRY)/$(DOCKER_BUILD_ORG)/$(DOCKER_BUILD_REPO):latest +MAJOR_VERSION=$(shell echo $(DOCKER_BUILD_TAG) | cut -d. -f1) +MAJOR_FULL_IMAGE=$(DOCKER_BUILD_REGISTRY)/$(DOCKER_BUILD_ORG)/$(DOCKER_BUILD_REPO):$(MAJOR_VERSION) +MINOR_VERSION=$(shell echo $(DOCKER_BUILD_TAG) | cut -d. -f1,2) +MINOR_FULL_IMAGE=$(DOCKER_BUILD_REGISTRY)/$(DOCKER_BUILD_ORG)/$(DOCKER_BUILD_REPO):$(MINOR_VERSION) + # normally, for local build testing or development. use cross platform build for sharing images to others. build: docker build -f Dockerfile -t ${FULL_IMAGE} -t ${LATEST_FULL_IMAGE} . @@ -19,4 +25,7 @@ test: # cross platform build, you may need to manually stop the buildx(buildkit) container all: docker buildx build --platform linux/amd64,linux/arm64 \ - -t ${FULL_IMAGE} -t ${LATEST_FULL_IMAGE} --push -f Dockerfile . \ No newline at end of file + -t ${FULL_IMAGE} -t ${LATEST_FULL_IMAGE} -t ${MINOR_FULL_IMAGE} --push -f Dockerfile . + +get-full-image: + @echo ${FULL_IMAGE} diff --git a/opendevin/sandbox/Makefile b/opendevin/sandbox/Makefile index 9d82aed0a9..0ead3c3228 100644 --- a/opendevin/sandbox/Makefile +++ b/opendevin/sandbox/Makefile @@ -1,10 +1,16 @@ DOCKER_BUILD_REGISTRY=ghcr.io DOCKER_BUILD_ORG=opendevin DOCKER_BUILD_REPO=sandbox -DOCKER_BUILD_TAG=v0.1 +DOCKER_BUILD_TAG=v0.1.0 FULL_IMAGE=$(DOCKER_BUILD_REGISTRY)/$(DOCKER_BUILD_ORG)/$(DOCKER_BUILD_REPO):$(DOCKER_BUILD_TAG) + LATEST_FULL_IMAGE=$(DOCKER_BUILD_REGISTRY)/$(DOCKER_BUILD_ORG)/$(DOCKER_BUILD_REPO):latest +MAJOR_VERSION=$(shell echo $(DOCKER_BUILD_TAG) | cut -d. -f1) +MAJOR_FULL_IMAGE=$(DOCKER_BUILD_REGISTRY)/$(DOCKER_BUILD_ORG)/$(DOCKER_BUILD_REPO):$(MAJOR_VERSION) +MINOR_VERSION=$(shell echo $(DOCKER_BUILD_TAG) | cut -d. -f1,2) +MINOR_FULL_IMAGE=$(DOCKER_BUILD_REGISTRY)/$(DOCKER_BUILD_ORG)/$(DOCKER_BUILD_REPO):$(MINOR_VERSION) + # normally, for local build testing or development. use cross platform build for sharing images to others. build: docker build -f Dockerfile -t ${FULL_IMAGE} -t ${LATEST_FULL_IMAGE} . @@ -19,4 +25,7 @@ test: # cross platform build, you may need to manually stop the buildx(buildkit) container all: docker buildx build --platform linux/amd64,linux/arm64 \ - -t ${FULL_IMAGE} -t ${LATEST_FULL_IMAGE} --push -f Dockerfile . + -t ${FULL_IMAGE} -t ${LATEST_FULL_IMAGE} -t ${MINOR_FULL_IMAGE}--push -f Dockerfile . + +get-full-image: + @echo ${FULL_IMAGE}