Skip to content

v0.3.21-hotfix1

v0.3.21-hotfix1 #498

Workflow file for this run

name: '[cd]docker images'
on:
release:
types:
- published
env:
OKD_PROJECT: siibra-api
OKD_PROD_ENDPOINT: https://okd.hbp.eu:443
OKD_DEV_ENDPOINT: https://okd-dev.hbp.eu:443
OKD_PROD_SECRET: ${{ secrets.OKD_PROD_SECRET }}
OKD_DEV_SECRET: ${{ secrets.OKD_DEV_SECRET }}
DOCKER_REGISTRY: 'docker-registry.ebrains.eu/siibra/'
DOCKER_IMG: 'siibra-api'
jobs:
build-docker-img:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- flavor: 'all'
dockerfile: 'Dockerfile'
tag_suffix: ''
- flavor: 'worker'
dockerfile: 'worker.dockerfile'
tag_suffix: '-worker'
- flavor: 'server'
dockerfile: 'server.dockerfile'
tag_suffix: '-server'
- flavor: 'worker'
dockerfile: 'worker-v4.dockerfile'
tag_suffix: '-worker-v4'
steps:
- name: "Sanity check github.ref"
run: echo GITHUB_REF - $GITHUB_REF - github.ref - ${{ github.ref }}
- uses: actions/checkout@v4
- name: "Build docker image"
run: |
GIT_HASH=$(git rev-parse --short HEAD)
cached_image=${{ env.DOCKER_REGISTRY }}${{ env.DOCKER_IMG }}:latest${{ matrix.tag_suffix }}
echo "Pulling $cached_image to populate cached layers."
docker pull $cached_image || true
docker build --build-arg GIT_HASH=$GIT_HASH -t siibra-api-tmp-img -f ${{ matrix.dockerfile }} .
- name: "Tag and Push (rc)"
if: ${{ contains(github.ref, 'rc') }}
run: |
TAG_BASE=rc
NEW_TAG=${{ env.DOCKER_REGISTRY }}${{ env.DOCKER_IMG }}:${TAG_BASE}${{ matrix.tag_suffix }}
docker tag siibra-api-tmp-img ${NEW_TAG}
echo "Login to docker registry"
docker login \
-u '${{ secrets.EBRAINS_DOCKER_REG_USER }}' \
-p '${{ secrets.EBRAINS_DOCKER_REG_TOKEN }}' \
docker-registry.ebrains.eu
docker push $NEW_TAG
- name: "Tag and Push (release)"
if : ${{ (github.event_name == 'release') && !contains(github.ref, 'rc') }}
run: |
echo "Login to docker registry"
docker login \
-u '${{ secrets.EBRAINS_DOCKER_REG_USER }}' \
-p '${{ secrets.EBRAINS_DOCKER_REG_TOKEN }}' \
docker-registry.ebrains.eu
VERSION=$(cat VERSION)
while [[ "$VERSION" == *"."* ]]
do
if [[ "$BREAK" == "0" ]]
then
echo "Fuse broke!"
exit 1
fi
VERSIONED_DOCKERTAG=${{ env.DOCKER_REGISTRY }}${{ env.DOCKER_IMG }}:${VERSION}${{ matrix.tag_suffix }}
echo "tagging and pushing $VERSIONED_DOCKERTAG"
docker tag siibra-api-tmp-img $VERSIONED_DOCKERTAG
docker push $VERSIONED_DOCKERTAG
echo "Push successful... Incrementing version & break"
VERSION=$(echo $VERSION | sed -e 's/\.\w*$//g')
BREAK=$(( "$BREAK" - 1 ))
done
echo "Done"
setup-envvar:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.set-env-var.outputs.version }}
needs: build-docker-img
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: 'Setting env var'
id: set-env-var
run: |
version=$(cat VERSION)
if [[ -z "$version" ]]
then
echo "Version population failed: $version"
exit 1
fi
echo version=$version >> $GITHUB_OUTPUT
# deploy-rc-on-data-validation:
# needs:
# - build-docker-img
# if: ${{ github.event_name == 'push' }}
# runs-on: self-hosted
# steps:
# - run: |
# /bin/bash -c "cd /softwares/software && ./restart.sh"
# rc
rm-cache-rc-at-helm:
needs: setup-envvar
if: ${{ github.event_name == 'release' && contains(github.ref, 'rc') }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/workflows/composite-set-k8s-cred
with:
secrets: ${{ secrets.KUBECONFIG }}
- run: |
prod_server_pod=$(kubectl get pod | grep server | grep prod | awk '{print $1}')
echo exec on $prod_server_pod
kubectl exec $prod_server_pod -- rm -rf /siibra-api-volume/${{ needs.setup-envvar.outputs.version }}-rc/*
REDIS_POD=$(kubectl get pod -l app=cache-redis | grep Running | awk '{print $1}')
echo kubectl exec $REDIS_POD -- /bin/ash -c 'redis-cli --scan --pattern "*\[${{ needs.setup-envvar.outputs.version }}\]*" | while IFS= read -r line; do redis-cli del "$line"; done'
kubectl exec $REDIS_POD -- /bin/ash -c 'redis-cli --scan --pattern "*\[${{ needs.setup-envvar.outputs.version }}\]*" | while IFS= read -r line; do redis-cli del "$line"; done'
warmup-rc-at-helm:
needs:
- setup-envvar
- rm-cache-rc-at-helm
runs-on: ubuntu-latest
strategy:
fail-fast: true
max-parallel: 1
matrix:
include:
- yml-file: .helm/adhoc/warm-cache.yaml
podname: warmup-pod
- yml-file: .helm/adhoc/warm-cache-v4.yaml
podname: warmup-pod-v4
steps:
- uses: actions/checkout@v4
- uses: ./.github/workflows/composite-set-k8s-cred
with:
secrets: ${{ secrets.KUBECONFIG }}
- timeout-minutes: 120 # should not take more than 2h to warmup cache
run: |
# Delete pod at the beginning of the workflow
# This is so that logs can be inspected
kubectl delete pod/${{ matrix.podname }} || echo "Pod pod/${{ matrix.podname }} not found."
# TODO Flaky
# see .helm/siibra-api/templates/_helpers.tpl how siibra-api.cache-dir is defined
WARM_CACHE_YML=$(SIIBRA_CACHEDIR=/siibra-api-volume/${{ needs.setup-envvar.outputs.version }}-rc/ envsubst < ${{ matrix.yml-file }})
echo -e "WARM_CACHE_YML: \n$WARM_CACHE_YML"
echo "$WARM_CACHE_YML" | kubectl apply -f -
while true
do
sleep 10
POD_PHASE=$(kubectl get pod ${{ matrix.podname }} -o json | jq -r '.status.phase')
echo Possible phases: Pending, Running, Succeeded, Failed, Unknown
echo Found phase: $POD_PHASE
if [[ "$POD_PHASE" == "Failed" ]] || [[ "$POD_PHASE" == "Unknown" ]]
then
exit 1
fi
if [[ "$POD_PHASE" == "Succeeded" ]]
then
exit 0
fi
done
deploy-rc-worker-via-helm:
needs:
- warmup-rc-at-helm
- setup-envvar
strategy:
fail-fast: false
matrix:
queue: ["core", "features", "compounds"]
resource: ["low"]
exclude:
- queue: "compounds"
resource: "low"
include:
- queue: "compounds"
resource: 'high'
if: ${{ github.event_name == 'release' && contains(github.ref, 'rc') }}
uses: ./.github/workflows/deploy-worker-helm-v4.yml
with:
DEPLOYMENT_NAME: rc-worker-${{ matrix.queue }}
HELM_FILE: .helm/siibra-api-v4-worker
FALVOR: rc
QUEUE: ${{ needs.setup-envvar.outputs.version }}.rc.${{ matrix.queue }}
IMAGE_TAG: rc-worker
RESOURCE: ${{ matrix.resource }}
PULL_POLICY: Always
secrets:
KUBECONFIG: ${{ secrets.KUBECONFIG }}
deploy-rc-worker-v4-via-helm:
needs:
- warmup-rc-at-helm
- setup-envvar
if: ${{ github.event_name == 'release' && contains(github.ref, 'rc') }}
uses: ./.github/workflows/deploy-worker-helm-v4.yml
with:
DEPLOYMENT_NAME: rc-worker-v4
HELM_FILE: .helm/siibra-api-v4-worker
FALVOR: rc
QUEUE: ""
IMAGE_TAG: rc-worker-v4
WORKER_PATH: ""
PULL_POLICY: Always
secrets:
KUBECONFIG: ${{ secrets.KUBECONFIG }}
deploy-rc-server-via-helm:
needs:
- warmup-rc-at-helm
- setup-envvar
if: ${{ github.event_name == 'release' && contains(github.ref, 'rc') }}
uses: ./.github/workflows/deploy-server-helm-v4.yml
with:
DEPLOYMENT_NAME: rc-server
FALVOR: rc
IMAGE_TAG: rc-server
PULL_POLICY: Always
secrets:
KUBECONFIG: ${{ secrets.KUBECONFIG }}
# prod
# copy-by-helm:
# needs: setup-envvar
# if: ${{ github.event_name == 'release' && !contains(github.ref, 'rc') }}
# runs-on: ubuntu-latest
# timeout-minutes: 15 # should not take more than 15 minutes to copy cache
# steps:
# - uses: actions/checkout@v4
# - uses: ./.github/workflows/composite-set-k8s-cred
# with:
# secrets: ${{ secrets.KUBECONFIG }}
# - name: 'set FROM_DIR TO_DIR'
# run: |
# VERSION=${{ needs.setup-envvar.outputs.version }}
# # TODO use label exclusively in the future
# POD=$(kubectl get pod -l role=server -l app-flavor=rc -o json | jq -r '.items[0].metadata.name')
# echo POD: $POD
# cache_str=$(kubectl exec $POD -- env | grep SIIBRA_CACHEDIR)
# FROM_DIR=${cache_str//SIIBRA_CACHEDIR=/}
# TO_DIR=${FROM_DIR//-rc/}
# POD_NAME=copy-cache
# echo FROM_DIR: $FROM_DIR, TO_DIR: $TO_DIR, POD_NAME: $POD_NAME
# echo "FROM_DIR=$FROM_DIR" >> $GITHUB_ENV
# echo "TO_DIR=$TO_DIR" >> $GITHUB_ENV
# echo "POD_NAME=$POD_NAME" >> $GITHUB_ENV
# - name: 'start container'
# run: |
# # delete pod before workflow, so that logs can be inspected
# kubectl delete pod/$POD_NAME || echo "Pod pod/$POD_NAME not found."
# FROM_DIR=$FROM_DIR TO_DIR=$TO_DIR envsubst < .helm/adhoc/copy-cache.yaml | kubectl apply -f -
# - name: 'Ensure copy completes'
# run: |
# while true
# do
# sleep 10
# POD_PHASE=$(kubectl get pod $POD_NAME -o json | jq -r '.status.phase')
# echo Possible phases: Pending, Running, Succeeded, Failed, Unknown
# echo Found phase: $POD_PHASE
# if [[ "$POD_PHASE" == "Failed" ]] || [[ "$POD_PHASE" == "Unknown" ]]
# then
# exit 1
# fi
# if [[ "$POD_PHASE" == "Succeeded" ]]
# then
# exit 0
# fi
# done
# deploy-prod-via-helm:
# needs: copy-by-helm
# if: ${{ github.event_name == 'release' && !contains(github.ref, 'rc') }}
# uses: ./.github/workflows/deploy-helm.yml
# with:
# DEPLOYMENT_NAME: prod
# secrets:
# KUBECONFIG: ${{ secrets.KUBECONFIG }}