Skip to content

Publish image for 05-assistive-chatbot #49

Publish image for 05-assistive-chatbot

Publish image for 05-assistive-chatbot #49

Workflow file for this run

name: "Build and push Docker image"
run-name: "Publish image for ${{inputs.dockerfile_folder}}"
on:
workflow_dispatch:
inputs:
dockerfile_folder:
description: 'Folder containing Dockerfile to build'
required: true
type: choice
options:
- '05-assistive-chatbot'
- '02-household-queries'
service_name:
description: 'Name of target AWS service. Leave blank if unsure.'
type: choice
options:
- ''
- 'chatbot-chainlit-svc'
- 'secure-chatbot-svc'
build_image:
description: "Build and push image"
required: true
type: boolean
default: 'true'
deploy_image:
description: "Deploy image"
required: true
type: boolean
default: 'false'
image_tag:
description: 'Tag/Version of the image to push'
required: true
type: string
env:
IMAGE_NAME: localimage
jobs:
publish-image:
runs-on: ubuntu-latest
steps:
- name: Check inputs
id: check_inputs
run: |
service_name="${{ inputs.service_name }}"
if [ "${service_name}" = "" ]; then
case "${{ inputs.dockerfile_folder }}" in
'02-household-queries') service_name='secure-chatbot-svc';;
'05-assistive-chatbot') service_name='chatbot-chainlit-svc';;
*) echo "Unknown dockerfile_folder: '${dockerfile_folder}'"; exit 2;;
esac
fi
echo "service_name=$service_name" >> $GITHUB_OUTPUT
case "${service_name}" in
# The image_tag is specific to the `*-svc` service
'secure-chatbot-svc') image_tag='0.01';;
'chatbot-chainlit-svc') image_tag='chatbot-chainlit';;
*) echo "Unknown service_name: '${service_name}'"; exit 3;;
esac
echo "image_tag=$image_tag" >> $GITHUB_OUTPUT
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: us-east-1
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
mask-aws-account-id: true
# TODO: secure credentials: https://github.com/aws-actions/amazon-ecr-login?tab=readme-ov-file#ecr-private
# https://github.com/docker/login-action?tab=readme-ov-file#aws-elastic-container-registry-ecr
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
with:
mask-password: true
- name: "Checkout source code"
if: inputs.build_image
uses: actions/checkout@v4
- name: "Build image"
if: inputs.build_image
run: |
cd ${{ inputs.dockerfile_folder }}
# TODO: make this more easily editable and secure
# The DOT_ENV_FILE_CONTENTS contains LITERAL_API_KEY, OPENAI_API_KEY, RETRIEVE_K, LLM_MODEL_NAME, SUMMARIZER_LLM_MODEL_NAME
echo "${{secrets.DOT_ENV_FILE_CONTENTS}}" > .env
docker build -t "$IMAGE_NAME" --build-arg GURU_CARDS_URL="https://docs.google.com/uc?export=download&id=${{ secrets.GURU_CARDS_URL_ID }}" .
- name: "Login to GitHub Container Registry"
uses: docker/[email protected]
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: "Publish image to GHCR using tags '${{ inputs.image_tag }}'"
if: inputs.build_image
env:
# Target path where the image will be pushed, i.e., to GHCR for the current repo
GHCR_PATH: "ghcr.io/${{ github.repository }}/${{ steps.check_inputs.outputs.service_name }}"
run: |
echo "# Publishing image ${{ steps.check_inputs.outputs.service_name }}:${{ inputs.image_tag }} to ${{ env.GHCR_PATH }}"
docker tag "$IMAGE_NAME" "${{ env.GHCR_PATH }}:${{ inputs.image_tag }}"
docker push "${{ env.GHCR_PATH }}:${{ inputs.image_tag }}"
- name: "Publish image to AWS ECR'"
id: publish_image
if: inputs.build_image
env:
ECR_PATH: ${{ steps.login-ecr.outputs.registry }}/${{ secrets.ECR_REPO }}
run: |
image_tag="${{ steps.check_inputs.outputs.image_tag }}"
echo "# Publishing image ${image_tag} to $ECR_PATH"
docker tag "$IMAGE_NAME" "$ECR_PATH:${image_tag}"
docker push "$ECR_PATH:${image_tag}"
- name: "Update AWS Service"
if: inputs.deploy_image
env:
CLUSTER_NAME: genai-experiments
run: |
aws ecs update-service --force-new-deployment --cluster "$CLUSTER_NAME" --service "${{ steps.check_inputs.outputs.service_name }}"