name: Continuous Deployment Workflow on: push: paths: - "deployment.json" branches: - '*' branches-ignore: - main jobs: deploy: runs-on: ubuntu-latest steps: - name: Checkout Repository uses: actions/checkout@v3 - name: Parse Deployment JSON id: parse_deployment run: | deployment_json=$(cat deployment.json) echo "namespace=$(echo "$deployment_json" | jq -r '.namespace')" >> $GITHUB_ENV echo "name=$(echo "$deployment_json" | jq -r '.name')" >> $GITHUB_ENV echo "repoName=$(echo "$deployment_json" | jq -r '.repoName')" >> $GITHUB_ENV echo "branchName=$(echo "$deployment_json" | jq -r '.branchName')" >> $GITHUB_ENV echo "version=$(echo "$deployment_json" | jq -r '.version')" >> $GITHUB_ENV echo "shortVersion=\"$(echo "$deployment_json" | jq -r '.version' | cut -c1-10)\"" >> $GITHUB_ENV echo "secrets=$(echo "$deployment_json" | jq -r '.environment.secrets[]' | paste -sd ",")" >> $GITHUB_ENV # Updated echo "variables=$(echo "$deployment_json" | jq -r '.environment.variables[]' | paste -sd ",")" >> $GITHUB_ENV # Updated echo "resources=$(echo "$deployment_json" | jq -c '.resources')" >> $GITHUB_ENV - name: Generate values.yaml env: CI_USER: ${{ secrets.CI_USER }} CI_USER_TOKEN: ${{ secrets.CI_USER_TOKEN }} secrets: ${{ env.secrets }} variables: ${{ env.variables }} resources: ${{ env.resources }} namespace: ${{ env.namespace }} name: ${{ env.name }} repoName: ${{ env.repoName }} branchName: ${{ env.branchName }} version: ${{ env.version }} shortVersion: ${{ env.shortVersion }} run: | set -euo pipefail echo "namespace: $namespace" > values.yaml echo "name: $name" >> values.yaml echo "repoName: $repoName" >> values.yaml echo "branchName: $branchName" >> values.yaml echo "version: $version" >> values.yaml echo "shortVersion: $shortVersion" >> values.yaml echo "environment:" >> values.yaml # Process secrets echo " secrets:" >> values.yaml IFS=',' read -ra SECRET_NAMES <<< "$secrets" for secret_name in "${SECRET_NAMES[@]}"; do secret_value="${!secret_name}" echo " - name: $secret_name" >> values.yaml echo " value: \"$secret_value\"" >> values.yaml done # echo " - name: CI_USER" >> values.yaml # echo " value: \"$CI_USER\"" >> values.yaml # echo " - name: CI_USER_TOKEN" >> values.yaml # echo " value: \"$CI_USER_TOKEN\"" >> values.yaml # Process variables # echo " variables:" >> values.yaml # IFS=',' read -ra VARIABLE_NAMES <<< "$variables" # for variable_name in "${VARIABLE_NAMES[@]}"; do # variable_value="${!variable_name}" # Access the actual value dynamically # echo " - name: $variable_name" >> values.yaml # echo " value: \"$variable_value\"" >> values.yaml # done echo " variables:" >> values.yaml echo " - name: REPO_NAME" >> values.yaml echo " value: \"$repoName\"" >> values.yaml echo " - name: BRANCH_NAME" >> values.yaml echo " value: \"$branchName\"" >> values.yaml echo " - name: VERSION" >> values.yaml echo " value: \"$version\"" >> values.yaml echo " - name: NAMESPACE" >> values.yaml echo " value: \"$namespace\"" >> values.yaml echo " - name: FLOWX_ENGINE_ADDRESS" >> values.yaml echo " value: centurion-workflow-frontend.default.svc.cluster.local:7233" >> values.yaml # Process resources echo "resources:" >> values.yaml echo "$resources" | jq -r ' . as $root | " limits:\n cpu: \($root.limits.cpu)\n memory: \($root.limits.memory)\n requests:\n cpu: \($root.requests.cpu)\n memory: \($root.requests.memory)" ' >> values.yaml echo "Generated values.yaml:" cat values.yaml - name: Install Helm run: | if ! command -v helm >/dev/null 2>&1; then curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash fi - name: Ensure kubectl is Installed run: | if ! command -v kubectl >/dev/null 2>&1; then curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" chmod +x kubectl sudo mv kubectl /usr/local/bin/ fi - name: Set Up Kubeconfig run: | echo "${{ secrets.KUBECONFIG_CONTENT }}" > kubeconfig chmod 600 kubeconfig export KUBECONFIG=$(pwd)/kubeconfig kubectl config use-context ci-cd-user-context echo "KUBECONFIG=$(pwd)/kubeconfig" >> $GITHUB_ENV kubectl config view - name: Deploy with Helm env: CI_USER: ${{ secrets.CI_USER }} CI_USER_TOKEN: ${{ secrets.CI_USER_TOKEN }} namespace: ${{ env.namespace }} repoName: ${{ env.repoName }} branchName: ${{ env.branchName }} version: ${{ env.version }} run: | set -euo pipefail # Sanitize and construct the release name RELEASE_NAME=$(echo "${repoName}-${branchName}" | tr '_' '-' | tr '[:upper:]' '[:lower:]') # Ensure the release name meets Helm's naming conventions if ! echo "$RELEASE_NAME" | grep -Eq '^[a-z]([-a-z0-9]*[a-z0-9])?$'; then echo "Error: Release name '$RELEASE_NAME' is invalid." exit 1 fi # Login to the OCI registry echo "$CI_USER_TOKEN" | helm registry login centurion-version-control.default.svc.cluster.local:3000 \ --username "$CI_USER" --password-stdin --insecure pwd ls -l chmod 644 values.yaml yq eval values.yaml # Pull the chart from the OCI registry helm pull oci://centurion-version-control.default.svc.cluster.local:3000/centurion/helm/block-worker \ --version 0.1.4 \ --plain-http \ --untar # helm upgrade --install "$RELEASE_NAME" \ # ./block-worker \ # --version 0.1.4 \ # --namespace "$namespace" \ # --values values.yaml \ # --plain-http \ # --debug \ # --wait \ # --create-namespace # --timeout 300s { helm upgrade --install "$RELEASE_NAME" \ ./block-worker \ --version 0.1.4 \ --namespace "$namespace" \ --values values.yaml \ --set imageRegistry.server="version-control.mcard.hudsondata.ai" \ --set imageRegistry.username="$CI_USER" \ --set imageRegistry.password="$CI_USER_TOKEN" \ --debug \ --atomic \ --create-namespace \ --timeout 150s } || { echo "Deployment failed. Cleaning up..." helm uninstall "$RELEASE_NAME" -n "$namespace" --debug || true kubectl delete all --selector "app.kubernetes.io/instance=$RELEASE_NAME" -n "$namespace" || true exit 1 }