Skip to content

Deploy Lightsail Containers #9

Deploy Lightsail Containers

Deploy Lightsail Containers #9

name: Deploy Lightsail Containers
on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch:
inputs:
service_names:
description: "Comma-separated names of Lightsail services"
required: true
default: "diaspora-web-service,diaspora-action-provider"
container_names:
description: "Comma-separated names of Docker containers"
required: true
default: "diaspora-web-service-container,diaspora-action-provider-container"
dockerfile_paths:
description: "Comma-separated paths to Dockerfiles"
required: true
default: "web_service/Dockerfile,action_provider/Dockerfile"
jobs:
deploy-lightsail-containers:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- service_name: diaspora-web-service
container_name: diaspora-web-service-container
dockerfile_path: web_service/Dockerfile
- service_name: diaspora-action-provider
container_name: diaspora-action-provider-container
dockerfile_path: action_provider/Dockerfile
steps:
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Verify AWS credential
run: |
aws sts get-caller-identity
- name: Install AWS Lightsail plugin
run: |
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
- name: Checkout code
uses: actions/checkout@v4
- name: Build Docker container for AWS Lightsail
env:
SERVICE_NAME: ${{ matrix.service_name }}
CONTAINER_NAME: ${{ matrix.container_name }}
DOCKERFILE_PATH: ${{ matrix.dockerfile_path }}
run: |
echo "SERVICE NAME"
echo $SERVICE_NAME
echo "CONTAINER NAME"
echo $CONTAINER_NAME
echo "DOCKERFILE PATH"
echo $DOCKERFILE_PATH
docker build -t $CONTAINER_NAME -f $DOCKERFILE_PATH .
docker images
- name: Idempotently Create Lightsail container service
env:
SERVICE_NAME: ${{ matrix.service_name }}
continue-on-error: true
run: |
aws lightsail create-container-service --region us-east-1 --service-name $SERVICE_NAME --power small --scale 1
- name: Push Docker image to Lightsail and deploy
env:
SERVICE_NAME: ${{ matrix.service_name }}
CONTAINER_NAME: ${{ matrix.container_name }}
run: |
output=$(aws lightsail push-container-image --region us-east-1 --service-name $SERVICE_NAME --label $CONTAINER_NAME --image $CONTAINER_NAME)
image_name=$(echo "$output" | sed -n 's/.*Refer to this image as "\(.*\)" in deployments.*/\1/p')
echo "IMAGE NAME"
echo "$image_name"
containers=$(jq -n --arg image_name "$image_name" '{
"flask": {
"image": $image_name,
"ports": {
"8000": "HTTP"
}
}
}')
public_endpoint=$(jq -n '{
"containerName": "flask",
"containerPort": 8000
}')
aws lightsail create-container-service-deployment --region us-east-1 \
--service-name $SERVICE_NAME \
--containers "$containers" \
--public-endpoint "$public_endpoint"