Преглед изворни кода

ci: check if the image exists in ghcr.io to avoid repeat building and pushing (#283)

* ci: check if the image exists in ghcr.io to avoid repeat building and pushing.

* feat: add push MAJOR and MINOR version to ghcr.io
iFurySt пре 1 година
родитељ
комит
a08c82d35e
3 измењених фајлова са 44 додато и 12 уклоњено
  1. 22 8
      .github/workflows/ghcr.yml
  2. 11 2
      evaluation/SWE-bench/Makefile
  3. 11 2
      opendevin/sandbox/Makefile

+ 22 - 8
.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)

+ 11 - 2
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 .
+	-t ${FULL_IMAGE} -t ${LATEST_FULL_IMAGE} -t ${MINOR_FULL_IMAGE} --push -f Dockerfile .
+
+get-full-image:
+	@echo ${FULL_IMAGE}

+ 11 - 2
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}