Publish image for 05-assistive-chatbot #51
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
clear_images: | |
description: 'Delete previous images in AWS Lightsail' | |
required: true | |
type: boolean | |
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 | |
# https://medium.com/@lukhee/automating-aws-lightsail-deployments-with-github-actions-53c73c9a1c1f | |
- 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: "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: Clear Container Images | |
if: ${{ always() && inputs.clear_images == 'true' }} | |
shell: bash | |
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: "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_REGISTRY: ${{ steps.login-ecr.outputs.registry }} | |
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" | |
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 }}" |