Skip to content

Manually deploy hono api to hono-api-test env/namespace on microk8s #10

Manually deploy hono api to hono-api-test env/namespace on microk8s

Manually deploy hono api to hono-api-test env/namespace on microk8s #10

name: Manually deploy hono api to hono-api-test env/namespace on microk8s
on: workflow_dispatch # run manually
jobs:
check-changes:
runs-on: ubuntu-latest
outputs:
source_changes: ${{ steps.set_changes.outputs.source_changes }}
deployment_changes: ${{ steps.set_changes.outputs.deployment_changes }}
steps:
- name: Determine if this is a PR or a push to main
id: determine_context
run: |
echo "event name: ${{ github.event_name }}"
echo "git ref: ${{ github.ref }}"
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
if [[ "${{ github.ref }}" == "refs/heads/main" || "${{ github.ref }}" == "refs/heads/master" ]]; then
echo "context=main" >> $GITHUB_ENV
else
echo "context=pr" >> $GITHUB_ENV
fi
fi
# Conditionally checkout the code based on the context (PR or main branch)
- name: Checkout code for PR
if: env.context == 'pr'
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }} # Checkout the exact commit from the PR branch
fetch-depth: 3 # Fetch enough commit history to get the previous commits
- name: Checkout code for main branch
if: env.context == 'main'
uses: actions/checkout@v4
with:
fetch-depth: 3 # Fetch enough commit history to get the previous commits
- name: show git log
run: git log -5 --oneline
- name: Get the correct commits to compare
id: get_commits
run: |
# This is a push to main, compare HEAD (latest) and HEAD~1 (previous)
LATEST_COMMIT=$(git rev-parse HEAD)
PREV_COMMIT=$(git rev-parse HEAD~1)
echo "LATEST_COMMIT=$LATEST_COMMIT" >> $GITHUB_ENV
echo "PREV_COMMIT=$PREV_COMMIT" >> $GITHUB_ENV
# TODO: DEBUG
echo "sha head $(git rev-parse HEAD)"
echo "sha head^ $(git rev-parse HEAD^)"
echo "sha head~0 $(git rev-parse HEAD~0)"
echo "sha head~1 $(git rev-parse HEAD~1)"
echo 'pull request head sha: ${{ github.event.pull_request.head.sha }}'
- name: Check for changes in deployment or source code
run: |
# Debugging: Print the commits being compared
echo "Latest Commit: ${{ env.LATEST_COMMIT }}"
echo "Commit Before Latest: ${{ env.PREV_COMMIT }}"
- name: Check for changes in deployment or source code
id: set_changes
run: |
# Check if files in the deployment directory have changed
if git diff --name-only ${{ env.PREV_COMMIT }} ${{ env.LATEST_COMMIT }} | grep '^k8s-hono-api/'; then
echo "deployment_changes=true"
echo "deployment_changes=true" >> $GITHUB_OUTPUT
else
echo "deployment_changes=false"
echo "deployment_changes=false" >> $GITHUB_OUTPUT
fi
# Check if source code files have changed (apps/api, Dockerfile.api)
if git diff --name-only ${{ env.PREV_COMMIT }} ${{ env.LATEST_COMMIT }} | grep -E '^(apps/api/|Dockerfile.api)'; then
echo "source_changes=true"
echo "source_changes=true" >> $GITHUB_OUTPUT
else
echo "source_changes=false"
echo "source_changes=false" >> $GITHUB_OUTPUT
fi
deploy-test:
needs: check-changes
name: Deploy to hono api test
environment:
name: hono-api-test
runs-on: ubuntu-latest
if: needs.check-changes.outputs.deployment_changes =='true' || needs.check-changes.outputs.source_changes =='true'
steps:
- name: Kubectl tool installer
uses: Azure/setup-kubectl@v3
- name: Setup kubectl
env:
MICROK8S_CONFIG: ${{ secrets.MICROK8S_CONFIG }}
run: |
mkdir -p $HOME/.kube
echo "${MICROK8S_CONFIG}" | base64 --decode > $HOME/.kube/config
- name: Check kubectl get node
run: kubectl get nodes -o wide
- name: Check out code
uses: actions/checkout@v4
- name: Install jq
run: sudo apt-get update && sudo apt-get install -y jq
- name: Check for changes in deployment or source code
run: |
echo "deployment changes needs: ${{ needs.check-changes.outputs.deployment_changes }}"
echo "source changes needs: ${{ needs.check-changes.outputs.source_changes }}"
- name: deploy apply pods to hono-api-test env
env:
REGISTRY: ghcr.io
run: |
# Check if the namespace 'hono-api-test' is already created, if not, create it.
NAMESPACE=$(kubectl get namespaces -o jsonpath="{.items[?(@.metadata.name=='hono-api-test')].metadata.name}")
if [ -z "$NAMESPACE" ]; then
echo "Namespace $NAMESPACE does not exist. Creating namespace..."
kubectl apply -f k8s-hono-api/hono-api-test/namespace.yaml
else
echo "Namespace $NAMESPACE already exists. Skipping creation."
fi
function manage_kube_secret {
local secret_name=$1
local secret_key=$2
local secret_value=$3
local secret_type=${4:-generic}
if [ "$secret_name" == "regcred" ]; then
# Special handling for Github container registry secret
if ! kubectl -n hono-api-test get secret "$secret_name"; then
echo "Creating Github container registry secret $secret_name..."
kubectl -n hono-api-test create secret "$secret_type" "$secret_name" \
--docker-username=${{ github.actor }} \
--docker-password="$secret_value" \
--docker-server=${{ env.REGISTRY }}
else
echo "Checking if Github container registry secret $secret_name needs to be updated..."
existing_pass=$(kubectl -n hono-api-test get secret "$secret_name" --template='{{index .data ".dockerconfigjson" | base64decode}}' | jq -r '.auths["ghcr.io"].password')
if [[ "$existing_pass" != "$secret_value" ]]; then
echo "Updating Github registry secret $secret_name..."
kubectl -n hono-api-test delete secret "$secret_name"
kubectl -n hono-api-test create secret "$secret_type" "$secret_name" \
--docker-username=${{ github.actor }} \
--docker-password="$secret_value" \
--docker-server=${{ env.REGISTRY }}
else
echo "Github container registry secret $secret_name is up-to-date, no action required."
fi
fi
else
# General handling for other secrets using passed parameters
if ! kubectl -n hono-api-test get secret "$secret_name"; then
echo "Creating secret $secret_name..."
kubectl -n hono-api-test create secret "$secret_type" "$secret_name" --from-literal="$secret_key"="$secret_value"
else
echo "Checking if secret $secret_name needs to be updated..."
existing_value=$(kubectl -n hono-api-test get secret "$secret_name" --template="{{index .data \"$secret_key\" | base64decode}}")
if [[ "$existing_value" != "$secret_value" ]]; then
echo "Updating secret $secret_name..."
kubectl -n hono-api-test delete secret "$secret_name"
kubectl -n hono-api-test create secret "$secret_type" "$secret_name" --from-literal="$secret_key"="$secret_value"
else
echo "Secret $secret_name is up-to-date, no action required."
fi
fi
fi
}
# Handle secrets using the generic function
manage_kube_secret "regcred" ".dockerconfigjson" "${{ secrets.GHCR_PAT }}" "docker-registry"
manage_kube_secret "esapikeycred" "esApiKey" "${{ secrets.ES_APIKEY }}"
manage_kube_secret "esobserveapikeycred" "esObserveApiKey" "${{ secrets.OBSERVE_ES_APIKEY }}"
manage_kube_secret "apieswritetokencred" "apiEsWriteToken" "${{ secrets.API_ES_WRITE_TOKEN }}"
- name: deploy hono-api-test env if develoyment configuration changes
if: needs.check-changes.outputs.deployment_changes =='true'
run: |
# Deloy/update application
DEPLOYMENT_NAME="hono-api"
NAMESPACE="hono-api-test"
echo "Applying deployment $DEPLOYMENT_NAME for namespace $NAMESPACE ..."
kubectl apply -k k8s-hono-api/$NAMESPACE -n "$NAMESPACE"
# Always refresh deployment if source code changed
- name: Force Kubernetes to pull latest image if source code changed
if: needs.check-changes.outputs.source_changes =='true'
run: |
DEPLOYMENT_NAME="hono-api"
NAMESPACE="hono-api-test"
echo "Forcing Kubernetes to pull the latest image..."
kubectl patch deployment "$DEPLOYMENT_NAME" -n "$NAMESPACE" \
-p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"kubectl.kubernetes.io/restartedAt\":\"$(date +%s)\"}}}}}"
- name: Wait For Deployment To Start
run: sleep 10s
- name: Wait For Pods To Start
run: kubectl wait --for=condition=ready pod -l app=hono-api -n hono-api-test --timeout=10m