Skip to content

Publish image for 05-assistive-chatbot #52

Publish image for 05-assistive-chatbot

Publish image for 05-assistive-chatbot #52

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
delete_images:
description: 'Delete previous images in AWS Lightsail'
required: true
type: boolean
default: 'true'
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
image_tag="${{ inputs.image_tag }}"
if [ "${image_tag}" = "" ]; then
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
# https://medium.com/@lukhee/automating-aws-lightsail-deployments-with-github-actions-53c73c9a1c1f
- name: "Upgrade AWS CLI version and setup lightsailctl"
run: |
aws --version
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update
which aws
aws --version
sudo curl "https://s3.us-west-2.amazonaws.com/lightsailctl/latest/linux-amd64/lightsailctl" -o "/usr/local/bin/lightsailctl"
sudo chmod +x /usr/local/bin/lightsailctl
aws lightsail push-container-image help
- name: "Delete previous container images"
if: ${{ always() && inputs.delete_images == 'true' }}
run: |
AWS_IMAGES=$(aws lightsail get-container-images --region ${{ inputs.aws-region }} --service-name ${{ inputs.aws-lightsail-service }} --output text)
IMAGE_NAMES=$(echo $AWS_IMAGES | grep -Eo ':${{ inputs.aws-lightsail-service }}\.${{ inputs.image-name }}\.[0-9]+')
echo $IMAGE_NAMES
FIRST=0
while read LINE; do
if [ "$FIRST" -ne 0 ]; then
aws lightsail delete-container-image --region ${{ inputs.aws-region }} --service-name ${{ inputs.aws-lightsail-service }} --image $LINE;
fi
FIRST=1;
done <<< $IMAGE_NAMES
- 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: false && 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: "Publish image to Lightsail"
if: inputs.build_image
env:
AWS_REGION: us-east-1
IMAGE_TAG: "${{ steps.check_inputs.outputs.image_tag }}"
IMAGE_SHA_TAG: ${{ github.sha }}
ECR_PATH: ${{ steps.login-ecr.outputs.registry }}/${{ secrets.ECR_REPO }}
SERVICE_NAME: container-service-2
LABEL: firstLabel
run: |
echo "# Publishing image $SERVICE_NAME $IMAGE_TAG to $ECR_PATH"
echo docker tag "$IMAGE_NAME" "$ECR_PATH:latest"
docker tag "$IMAGE_NAME" "$ECR_PATH:latest"
docker tag "$IMAGE_NAME" "$ECR_PATH:$IMAGE_TAG" .
docker tag "$IMAGE_NAME" "$ECR_PATH:$IMAGE_SHA_TAG" .
# docker push "$ECR_PATH:latest"
# docker push "$ECR_PATH:$IMAGE_TAG"
# docker push "$ECR_PATH:$IMAGE_SHA_TAG"
aws lightsail push-container-image --region $AWS_REGION --service-name "$SERVICE_NAME" --label LABEL --image "$IMAGE_NAME"
- name: Deploy container on AWS Lightsail
env:
SERVICE_NAME: container-service-2
run: |
# aws lightsail create-container-service-deployment --region ${{ inputs.aws-region }} --cli-input-json '${{ inputs.aws-lightsail-service-config }}' > /dev/null
aws lightsail update-container-service --service-name "$SERVICE_NAME" --no-is-disabled
# - 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 }}"