new idea part #4 #23
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 Deploy to AWS | ||
on: | ||
push: | ||
branches: | ||
- main | ||
jobs: | ||
build-and-deploy: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Checkout code | ||
uses: actions/checkout@v2 | ||
- name: Set up Docker Buildx | ||
uses: docker/setup-buildx-action@v1 | ||
- name: Log in to Docker Hub | ||
uses: docker/login-action@v1 | ||
with: | ||
username: ${{ secrets.DOCKER_HUB_USERNAME }} | ||
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} | ||
- name: Build and push Docker image of Flask app | ||
uses: docker/build-push-action@v2 | ||
with: | ||
context: . | ||
file: ./flask.Dockerfile | ||
push: true | ||
tags: ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest | ||
build-args: | | ||
FLASK_KEY=${{ secrets.FLASK_KEY }} | ||
SPOTIFY_CLIENT_ID=${{ secrets.SPOTIFY_CLIENT_ID }} | ||
SPOTIFY_SECRET_ID=${{ secrets.SPOTIFY_SECRET_ID }} | ||
ENVIRONMENT=${{ secrets.ENVIRONMENT }} | ||
- name: Set up AWS CLI | ||
uses: aws-actions/configure-aws-credentials@v1 | ||
with: | ||
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | ||
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | ||
aws-region: ${{ secrets.AWS_REGION }} | ||
- name: Retrieve EC2 instance IPs | ||
id: get_instances_ips | ||
run: | | ||
aws ec2 describe-instances --filters "Name=tag:Name,Values=ec2-1" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].PublicIpAddress" --output text > ec2_instance_ip_1.txt | ||
echo "EC2_1_IP=$(cat ec2_instance_ip_1.txt)" >> $GITHUB_ENV | ||
aws ec2 describe-instances --filters "Name=tag:Name,Values=ec2-2" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].PublicIpAddress" --output text > ec2_instance_ip_2.txt | ||
echo "EC2_2_IP=$(cat ec2_instance_ip_2.txt)" >> $GITHUB_ENV | ||
aws ec2 describe-instances --filters "Name=tag:Name,Values=ec2-3" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].PublicIpAddress" --output text > ec2_instance_ip_3.txt | ||
echo "EC2_3_IP=$(cat ec2_instance_ip_3.txt)" >> $GITHUB_ENV | ||
- name: Create .ssh directory | ||
run: mkdir -p /home/runner/.ssh | ||
- name: Create SSH key file | ||
run: echo "${{ secrets.SSH_PRIVATE_KEY }}" > /home/runner/.ssh/id_rsa | ||
- name: Set SSH key permissions | ||
run: chmod 600 /home/runner/.ssh/id_rsa | ||
- name: Update EC2 with new Docker image | ||
run: | | ||
ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_1_IP }} << 'EOF' | ||
docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest | ||
docker stop my-container || true | ||
docker rm my-container || true | ||
docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest | ||
EOF | ||
ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_2_IP }} << 'EOF' | ||
docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest | ||
docker stop my-container || true | ||
docker rm my-container || true | ||
docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest | ||
EOF | ||
ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_3_IP }} << 'EOF' | ||
docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest | ||
docker stop my-container || true | ||
docker rm my-container || true | ||
docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest | ||
EOF | ||
- name: Make shell script template for updating autoscaling instances | ||
run: | | ||
Check failure on line 85 in .github/workflows/deploy-to-ec2.yml
|
||
echo "${{secret.SHELL_SCRIPT_TEMPLATE}}" > update_instance.sh | ||
cat update_instance.sh | ||
- name: Retrieve Autoscaling EC2 server IPs | ||
id: get_autoscaling_instances_ips | ||
run: | | ||
aws autoscaling describe-auto-scaling-instances --query "AutoScalingInstances[*].InstanceId" --output text > autoscaling_instance_ids.txt | ||
aws ec2 describe-instances --instance-ids $(cat autoscaling_instance_ids.txt) --query "Reservations[*].Instances[*].PublicIpAddress" --output text > autoscaling_instance_ips.txt | ||
cat autoscaling_instance_ips.txt | ||
- name: Update Autoscaling EC2 with new Docker image | ||
run: | | ||
cat autoscaling_instance_ips.txt | ||
env: | ||
AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }} | ||
AWS_REGION: ${{ secrets.AWS_REGION }} | ||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} | ||
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | ||
DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }} |