Cloud Demo App Update Only #96
This file contains hidden or 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: Cloud Demo App Update Only | |
on: | |
workflow_dispatch: | |
inputs: | |
name: | |
description: 'Username' | |
required: true | |
env: | |
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY }} | |
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
AWS_REGION: us-east-1 | |
KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }} | |
ECR_REPOSITORY: ld-core-demo | |
KUBECTL_VERSION: "v1.23.0" | |
DEMO_NAMESPACE: ${{ github.event.inputs.name }} | |
LD_PROJECT_KEY: ${{ github.event.inputs.name }}-ld-demo | |
LD_API_KEY: ${{ secrets.LD_EAP_API_KEY }} | |
jobs: | |
provisioning_demo_environment: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v3 | |
- name: Set up Python | |
uses: actions/setup-python@v2 | |
with: | |
python-version: "3.9" | |
- name: Install LaunchDarkly CLI | |
run: | | |
npm install -g @launchdarkly/ldcli | |
ldcli config --set access-token ${{ secrets.LD_EAP_API_KEY }} | |
- name: Install dependencies | |
run: | | |
python -m pip install --upgrade pip | |
pip install -r ./.github/workflows/demo_provisioning_scripts/requirements.txt | |
sudo apt-get update && sudo apt-get install -y gettext-base | |
- name: Get LaunchDarkly Project | |
id: ld_project_setup | |
run: | | |
echo "Getting LaunchDarkly project for namespace: ${{ env.DEMO_NAMESPACE }}" | |
ldcli environments get --project ${{ env.LD_PROJECT_KEY }} --environment production -o json > ld_project.json | |
- name: Parse LaunchDarkly Project JSON | |
id: parse_ld_project | |
run: | | |
apiKey=$(jq -r '.apiKey' ld_project.json) | |
id=$(jq -r '._id' ld_project.json) | |
echo "LD_SDK_KEY=$apiKey" >> $GITHUB_ENV | |
echo "LD_CLIENT_KEY=$id" >> $GITHUB_ENV | |
- name: Create .env file for demo pod | |
run: | | |
touch ./.env.production | |
echo NEXT_PUBLIC_LD_CLIENT_KEY=${{ env.LD_CLIENT_KEY }} >> ./.env.production | |
echo LD_SDK_KEY=${{ env.LD_SDK_KEY }} >> ./.env.production | |
echo DB_URL=${{ secrets.DB_URL }} >> ./.env.production | |
echo LD_API_KEY=${{ env.LD_API_KEY }} >> ./.env.production | |
echo DESTINATIONENV=production >> ./.env.production | |
echo PROJECT_KEY=${{ env.LD_PROJECT_KEY }} >> ./.env.production | |
echo AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY }} >> ./.env.production | |
echo AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }} >> ./.env.production | |
echo NEXT_PUBLIC_PROJECT_KEY=${{ env.LD_PROJECT_KEY }} >> ./.env.production | |
- name: Login to Amazon ECR | |
id: login-ecr | |
uses: aws-actions/amazon-ecr-login@v1 | |
- name: Build, tag, and push image to Amazon ECR | |
env: | |
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} | |
ECR_REPOSITORY: ld-core-demo | |
run: | | |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:${{ env.DEMO_NAMESPACE }}-${{ github.run_id }} . | |
docker push $ECR_REGISTRY/$ECR_REPOSITORY:${{ env.DEMO_NAMESPACE }}-${{ github.run_id }} | |
- name: Update K8s Deploy File | |
run: python ./.github/workflows/update_k8s_deploy_file.py | |
env: | |
NAMESPACE: ${{ env.DEMO_NAMESPACE }} | |
URL: ${{ env.DEMO_NAMESPACE }}.launchdarklydemos.com | |
IMAGE: ${{ steps.login-ecr.outputs.registry }}/ld-core-demo:${{ env.DEMO_NAMESPACE }}-${{ github.run_id }} | |
- name: Check Namespace in Kubernetes | |
uses: kodermax/kubectl-aws-eks@master | |
with: | |
args: get namespace ${{ env.DEMO_NAMESPACE }} &>/dev/null && echo "namespace_exists=true" >> $GITHUB_ENV || echo "namespace_exists=false" >> $GITHUB_ENV | |
- name: Create Namespace In Kubernetes | |
if: env.namespace_exists == 'false' | |
uses: kodermax/kubectl-aws-eks@master | |
with: | |
args: create namespace ${{ env.DEMO_NAMESPACE }} | |
- name: Applying deploy file to Kubernetes | |
uses: kodermax/kubectl-aws-eks@master | |
with: | |
args: apply -f ./.github/workflows/deploy_files/deploy.yaml -n ${{ env.DEMO_NAMESPACE }} | |
- name: Configure AWS credentials | |
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: us-east-1 | |
- name: Get NGINX Ingress Controller Load Balancer Hostname | |
id: get-nginx-lb | |
uses: kodermax/kubectl-aws-eks@master | |
with: | |
args: get service -n ingress-nginx ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' > hostname.txt && echo "NGINX_LB_HOSTNAME=$(cat hostname.txt)" >> $GITHUB_ENV | |
- name: Refresh Route 53 CNAME Record for NGINX Ingress | |
run: | | |
echo "Fetching Hosted Zone ID for ${{ env.ROOT_DOMAIN }}" | |
HOSTED_ZONE_ID=$(aws route53 list-hosted-zones-by-name \ | |
--dns-name "${{ env.ROOT_DOMAIN }}." \ | |
--query "HostedZones[0].Id" \ | |
--output text) | |
RECORD_NAME="${{ env.DEMO_NAMESPACE }}.${{ env.ROOT_DOMAIN }}" | |
echo "Looking for existing record: $RECORD_NAME" | |
# Fetch matching records | |
MATCHED=$(aws route53 list-resource-record-sets \ | |
--hosted-zone-id "$HOSTED_ZONE_ID" \ | |
--query "ResourceRecordSets[?Name == '$RECORD_NAME.']" \ | |
--output json) | |
# Delete if found | |
if [[ "$MATCHED" != "[]" ]]; then | |
echo "Deleting existing records for $RECORD_NAME..." | |
echo "$MATCHED" | jq -c '.[]' | while read -r record; do | |
# Wrap in full change batch | |
echo "{ | |
\"Comment\": \"Deleting old record\", | |
\"Changes\": [ | |
{ | |
\"Action\": \"DELETE\", | |
\"ResourceRecordSet\": $record | |
} | |
] | |
}" > delete-record.json | |
aws route53 change-resource-record-sets \ | |
--hosted-zone-id "$HOSTED_ZONE_ID" \ | |
--change-batch file://delete-record.json | |
done | |
else | |
echo "No existing record found for $RECORD_NAME." | |
fi | |
echo "Creating CNAME record for $RECORD_NAME → ${{ env.NGINX_LB_HOSTNAME }}" | |
echo "{ | |
\"Comment\": \"Create CNAME for NGINX Ingress\", | |
\"Changes\": [ | |
{ | |
\"Action\": \"UPSERT\", | |
\"ResourceRecordSet\": { | |
\"Name\": \"$RECORD_NAME\", | |
\"Type\": \"CNAME\", | |
\"TTL\": 300, | |
\"ResourceRecords\": [ | |
{ | |
\"Value\": \"${{ env.NGINX_LB_HOSTNAME }}\" | |
} | |
] | |
} | |
} | |
] | |
}" > create-record.json | |
aws route53 change-resource-record-sets \ | |
--hosted-zone-id "$HOSTED_ZONE_ID" \ | |
--change-batch file://create-record.json | |
env: | |
AWS_REGION: us-east-1 | |
ROOT_DOMAIN: launchdarklydemos.com | |
DEMO_NAMESPACE: ${{ env.DEMO_NAMESPACE }} | |
NGINX_LB_HOSTNAME: ${{ env.NGINX_LB_HOSTNAME }} | |
- name: Delete the deploy file | |
run: rm -rf ./.github/workflows/deploy_files | |
- name: Remove .env file | |
run: rm ./.env.production |