name: Promote ready UAT questions to PRD on: workflow_dispatch: inputs: mode: description: "dry-run or apply" required: true default: dry-run confirmation: description: "Enter PROMOTE_TO_PRD when mode is apply" required: false default: "" concurrency: group: step3-question-promotion cancel-in-progress: false jobs: promote: runs-on: self-hosted steps: - name: Checkout production configuration uses: actions/checkout@v4 with: ref: production - name: Configure kubeconfig env: KUBECONFIG_CONTENT: ${{ secrets.KUBECONFIG }} run: | if [ -n "$KUBECONFIG_CONTENT" ]; then mkdir -p /tmp/kube printf '%s\n' "$KUBECONFIG_CONTENT" > /tmp/kube/config echo "KUBECONFIG=/tmp/kube/config" >> "$GITHUB_ENV" fi - name: Validate promotion request env: MODE: ${{ inputs.mode }} CONFIRMATION: ${{ inputs.confirmation }} run: | test "$MODE" = "dry-run" || test "$MODE" = "apply" if [ "$MODE" = "apply" ]; then test "$CONFIRMATION" = "PROMOTE_TO_PRD" fi - name: Configure question promotion credentials env: SOURCE_CONNECTION: ${{ secrets.UAT_MONGODB_CONNECTION_STRING }} TARGET_CONNECTION: ${{ secrets.PRD_MONGODB_CONNECTION_STRING }} run: | test -n "$SOURCE_CONNECTION" test -n "$TARGET_CONNECTION" kubectl create secret generic step3-question-promotion \ --from-literal=source-connection="$SOURCE_CONNECTION" \ --from-literal=target-connection="$TARGET_CONNECTION" \ --dry-run=client -o yaml | kubectl apply -n step3-prd -f - - name: Run ready-question promotion env: MODE: ${{ inputs.mode }} CONFIRMATION: ${{ inputs.confirmation }} run: | IMAGE="$(kubectl get deployment step3-api -n step3-prd -o jsonpath='{.spec.template.spec.containers[0].image}')" REVISION="${IMAGE##*:}" POD="question-promotion-${GITHUB_RUN_NUMBER}" APPLY_ARGS="" if [ "$MODE" = "apply" ]; then APPLY_ARGS="--apply --confirm $CONFIRMATION" fi cat <- dotnet QuestionsApi.dll promote-questions --source-database ranaze_step3_uat --target-database ranaze_step3_prd --operator "${GITHUB_ACTOR:-gitea-operator}" --build-revision "${REVISION}" ${APPLY_ARGS} env: - name: SOURCE_MONGODB_CONNECTION_STRING valueFrom: secretKeyRef: name: step3-question-promotion key: source-connection - name: TARGET_MONGODB_CONNECTION_STRING valueFrom: secretKeyRef: name: step3-question-promotion key: target-connection EOF for attempt in $(seq 1 120); do PHASE="$(kubectl get pod "$POD" -n step3-prd -o jsonpath='{.status.phase}')" if [ "$PHASE" = "Succeeded" ] || [ "$PHASE" = "Failed" ]; then break; fi sleep 2 done kubectl logs "$POD" -n step3-prd test "$(kubectl get pod "$POD" -n step3-prd -o jsonpath='{.status.phase}')" = "Succeeded" - name: Remove promotion credentials and pod if: always() run: | kubectl delete pod "question-promotion-${GITHUB_RUN_NUMBER}" -n step3-prd --ignore-not-found kubectl delete secret step3-question-promotion -n step3-prd --ignore-not-found