Skip to content

Commit 5fd7e53

Browse files
committed
Wait for docker build workflow
1 parent 91c963f commit 5fd7e53

File tree

1 file changed

+59
-70
lines changed

1 file changed

+59
-70
lines changed

.github/actions/calculate-docker-image/action.yml

Lines changed: 59 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -76,67 +76,6 @@ runs:
7676
echo "docker-image=${DOCKER_REGISTRY}/${REPO_NAME}/${DOCKER_IMAGE_NAME}:${DOCKER_TAG}" >> "${GITHUB_OUTPUT}"
7777
fi
7878
79-
- name: Check if image should be built
80-
id: check-image
81-
shell: bash
82-
working-directory: ${{ inputs.working-directory }}
83-
if: ${{ steps.calculate-image.outputs.skip != 'true' && !inputs.always-rebuild }}
84-
env:
85-
DOCKER_BUILD_DIR: ${{ inputs.docker-build-dir }}
86-
BASE_REVISION: ${{ github.event.pull_request.base.sha || github.sha }}
87-
DOCKER_IMAGE: ${{ steps.calculate-image.outputs.docker-image }}
88-
DOCKER_TAG: ${{ steps.calculate-image.outputs.docker-tag }}
89-
DOCKER_REGISTRY: ${{ inputs.docker-registry }}
90-
run: |
91-
set +e
92-
set -x
93-
94-
login() {
95-
aws ecr get-login-password --region us-east-1 | docker login -u AWS --password-stdin "$1"
96-
}
97-
98-
retry () {
99-
$* || (sleep 1 && $*) || (sleep 2 && $*)
100-
}
101-
102-
retry login "${DOCKER_REGISTRY}"
103-
104-
# Check if image already exists, if it does then skip building it
105-
if docker manifest inspect "${DOCKER_IMAGE}"; then
106-
exit 0
107-
fi
108-
109-
# NB: This part requires a full checkout. Otherwise, the merge base will
110-
# be empty. The default action would be to continue rebuild the image
111-
if [[ "$BASE_REVISION" = "$(git rev-parse HEAD)" ]]; then
112-
# if we're on the base branch then use the parent commit
113-
MERGE_BASE=$(git rev-parse HEAD~)
114-
else
115-
# otherwise we're on a PR, so use the most recent base commit
116-
MERGE_BASE=$(git merge-base HEAD "$BASE_REVISION")
117-
fi
118-
119-
if [[ -z "${MERGE_BASE}" ]]; then
120-
echo "rebuild=true" >> "${GITHUB_OUTPUT}"
121-
122-
echo "Finding merge base only works with full checkout, please set fetch-depth to 0, continuing ..."
123-
exit 0
124-
fi
125-
126-
if ! git rev-parse "${MERGE_BASE}:${DOCKER_BUILD_DIR}"; then
127-
echo "Directory '${DOCKER_BUILD_DIR}' not found in commit $MERGE_BASE, you should rebase onto a more recent commit"
128-
exit 1
129-
fi
130-
131-
PREVIOUS_DOCKER_TAG=$(git rev-parse "${MERGE_BASE}:${DOCKER_BUILD_DIR}")
132-
# If no image exists but the hash is the same as the previous hash then we should error out here
133-
if [[ "${PREVIOUS_DOCKER_TAG}" == "${DOCKER_TAG}" ]]; then
134-
echo "WARNING: Something has gone wrong and the previous image isn't available for the merge-base of your branch"
135-
echo " Will re-build docker image to store in local cache, TTS may be longer"
136-
fi
137-
138-
echo "rebuild=true" >> "${GITHUB_OUTPUT}"
139-
14079
- name: Login to ECR
14180
if: ${{ steps.calculate-image.outputs.skip != 'true' && (inputs.always-rebuild || steps.check-image.outputs.rebuild) }}
14281
shell: bash
@@ -165,34 +104,84 @@ runs:
165104
set -eux
166105
aws secretsmanager get-secret-value --secret-id docker_hub_readonly_token | jq --raw-output '.SecretString' | jq -r .docker_hub_readonly_token | docker login --username pytorchbot --password-stdin
167106
168-
- name: Build docker image
169-
if: ${{ steps.calculate-image.outputs.skip != 'true' && (inputs.always-rebuild || steps.check-image.outputs.rebuild) }}
107+
- name: Check if image exists and build it if it doesnt
108+
id: check-and-build-image
109+
if: ${{ steps.calculate-image.outputs.skip != 'true' && inputs.always-rebuild }}
170110
env:
171111
REPO_NAME: ${{ github.event.repository.name }}
112+
BASE_REVISION: ${{ github.event.pull_request.base.sha || github.sha }}
113+
DOCKER_BUILD_DIR: ${{ inputs.docker-build-dir }}
114+
WORKING_DIRECTORY: ${{ inputs.working-directory }}
172115
DOCKER_IMAGE: ${{ steps.calculate-image.outputs.docker-image }}
116+
DOCKER_TAG: ${{ steps.calculate-image.outputs.docker-tag }}
173117
DOCKER_REGISTRY: ${{ inputs.docker-registry }}
174-
WORKING_DIRECTORY: ${{ inputs.working-directory }}/${{ inputs.docker-build-dir }}
175118
# NB: Retry here as this step frequently fails with network error downloading various stuffs
176119
uses: nick-fields/[email protected]
177120
with:
178121
shell: bash
179122
timeout_minutes: 90
180123
max_attempts: 3
181-
retry_wait_seconds: 90
124+
# NB: Wait for half an hour before retrying, this is used as a pooling mechanism to wait
125+
# for the docker build workflow to finish
126+
retry_wait_seconds: 1800
182127
command: |
183128
set -ex
184129
185-
# NB: Setting working directory on the step doesn't work with nick-fields/retry https://github.com/nick-fields/retry/issues/89
130+
build_image() {
131+
# NB: Setting working directory on the step doesn't work with nick-fields/retry https://github.com/nick-fields/retry/issues/89
132+
pushd "${WORKING_DIRECTORY}/${DOCKER_BUILD_DIR}"
133+
134+
IMAGE_NAME=$(echo ${DOCKER_IMAGE#"${DOCKER_REGISTRY}/${REPO_NAME}/"} | awk -F '[:,]' '{print $1}')
135+
# Build new image
136+
./build.sh "${IMAGE_NAME}" -t "${DOCKER_IMAGE}"
137+
138+
popd
139+
140+
echo "rebuild=true" >> "${GITHUB_OUTPUT}"
141+
# Reaching this part means that the image has been built successfully
142+
# so we can just exit from here
143+
exit 0
144+
}
145+
186146
pushd "${WORKING_DIRECTORY}"
187147
188-
IMAGE_NAME=$(echo ${DOCKER_IMAGE#"${DOCKER_REGISTRY}/${REPO_NAME}/"} | awk -F '[:,]' '{print $1}')
189-
# Build new image
190-
./build.sh "${IMAGE_NAME}" -t "${DOCKER_IMAGE}"
148+
# Check if image already exists, if it does then skip building it
149+
if docker manifest inspect "${DOCKER_IMAGE}"; then
150+
exit 0
151+
fi
152+
153+
# NB: This part requires a full checkout. Otherwise, the merge base will
154+
# be empty. The default action would be to continue rebuild the image
155+
if [[ "$BASE_REVISION" = "$(git rev-parse HEAD)" ]]; then
156+
# if we're on the base branch then use the parent commit
157+
MERGE_BASE=$(git rev-parse HEAD~)
158+
else
159+
# otherwise we're on a PR, so use the most recent base commit
160+
MERGE_BASE=$(git merge-base HEAD "$BASE_REVISION")
161+
fi
162+
163+
if [[ -z "${MERGE_BASE}" ]]; then
164+
echo "Finding merge base only works with full checkout, please set fetch-depth to 0, continuing ..."
165+
build_image
166+
fi
167+
168+
if ! git rev-parse "${MERGE_BASE}:${DOCKER_BUILD_DIR}"; then
169+
echo "Directory '${DOCKER_BUILD_DIR}' not found in commit $MERGE_BASE, you should rebase onto a more recent commit"
170+
exit 1
171+
fi
172+
173+
PREVIOUS_DOCKER_TAG=$(git rev-parse "${MERGE_BASE}:${DOCKER_BUILD_DIR}")
174+
# If no image exists but the hash is the same as the previous hash then we should error out here
175+
if [[ "${PREVIOUS_DOCKER_TAG}" == "${DOCKER_TAG}" ]]; then
176+
echo "WARNING: Something has gone wrong and the previous image isn't available for the merge-base of your branch"
177+
echo " Will re-build docker image to store in local cache, TTS may be longer"
178+
fi
179+
build_image
191180
192181
popd
193182
194183
- name: Push to ECR
195-
if: ${{ steps.calculate-image.outputs.skip != 'true' && (inputs.always-rebuild || steps.check-image.outputs.rebuild) }}
184+
if: ${{ steps.calculate-image.outputs.skip != 'true' && (inputs.always-rebuild || steps.check-and-build-image.outputs.rebuild) }}
196185
shell: bash
197186
working-directory: ${{ inputs.working-directory }}/${{ inputs.docker-build-dir }}
198187
env:

0 commit comments

Comments
 (0)