Skip to content

Cloud Demo App Update Only #96

Cloud Demo App Update Only

Cloud Demo App Update Only #96

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