Update init.yml

This commit is contained in:
2025-12-16 15:53:18 -06:00
parent 62f61073c7
commit e334246abd

View File

@@ -26,17 +26,25 @@ permissions:
jobs: jobs:
init: init:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Validate admin token is present - name: Preflight validation
shell: bash shell: bash
run: | run: |
set -euo pipefail set -euo pipefail
if [ -z "${{ secrets.MOKO_ADMIN_TOKEN }}" ]; then if [ -z "${{ secrets.MOKO_ADMIN_TOKEN }}" ]; then
echo "ERROR: Missing secret MOKO_ADMIN_TOKEN." echo "ERROR: Missing secret MOKO_ADMIN_TOKEN."
echo "Action required: Add it at repo scope: Settings -> Secrets and variables -> Actions -> New repository secret."
exit 1 exit 1
fi fi
- name: Create environment and set variables if [ -z "${{ github.api_url }}" ] || [ -z "${{ github.server_url }}" ]; then
echo "ERROR: Missing GitHub runtime context (github.api_url or github.server_url)."
exit 1
fi
- name: Create environment and set variables (robust)
env: env:
GH_TOKEN: ${{ secrets.MOKO_ADMIN_TOKEN }} GH_TOKEN: ${{ secrets.MOKO_ADMIN_TOKEN }}
ENV_NAME: ${{ github.event.inputs.environment_name }} ENV_NAME: ${{ github.event.inputs.environment_name }}
@@ -47,45 +55,85 @@ jobs:
SERVER_URL: ${{ github.server_url }} SERVER_URL: ${{ github.server_url }}
OWNER: ${{ github.repository_owner }} OWNER: ${{ github.repository_owner }}
REPO: ${{ github.event.repository.name }} REPO: ${{ github.event.repository.name }}
RUN_ID: ${{ github.run_id }}
shell: bash shell: bash
run: | run: |
set -euo pipefail set -euo pipefail
die() {
echo "ERROR: $1" >&2
exit 1
}
require() {
local name="$1"
local val="$2"
if [ -z "${val}" ]; then
die "Missing required value: ${name}"
fi
}
# Do not echo GH_TOKEN
require "GH_TOKEN" "${GH_TOKEN}"
require "ENV_NAME" "${ENV_NAME}"
require "API_URL" "${API_URL}"
require "SERVER_URL" "${SERVER_URL}"
require "OWNER" "${OWNER}"
require "REPO" "${REPO}"
# Determine which repo hosts updates.xml
if [ -n "${UPDATE_XML_REPO_INPUT}" ]; then if [ -n "${UPDATE_XML_REPO_INPUT}" ]; then
UPDATE_XML_REPO="${UPDATE_XML_REPO_INPUT}" UPDATE_XML_REPO="${UPDATE_XML_REPO_INPUT}"
else else
UPDATE_XML_REPO="${OWNER}/${REPO}" UPDATE_XML_REPO="${OWNER}/${REPO}"
fi fi
require "UPDATE_XML_BRANCH" "${UPDATE_XML_BRANCH}"
require "UPDATE_XML_PATH" "${UPDATE_XML_PATH}"
# Construct the canonical file URL that downstream workflows parse
UPDATESERVER_FILE_URL="${SERVER_URL}/${UPDATE_XML_REPO}/blob/${UPDATE_XML_BRANCH}/${UPDATE_XML_PATH}" UPDATESERVER_FILE_URL="${SERVER_URL}/${UPDATE_XML_REPO}/blob/${UPDATE_XML_BRANCH}/${UPDATE_XML_PATH}"
echo "Target environment: ${ENV_NAME}" echo "Target environment: ${ENV_NAME}"
echo "Variable UPDATESERVER_FILE_URL: ${UPDATESERVER_FILE_URL}" echo "Variable UPDATESERVER_FILE_URL: ${UPDATESERVER_FILE_URL}"
echo "Creating or updating environment..." # Lightweight JSON escaper for the variable payload
curl -sS -f -X PUT \ json_escape() {
-H "Accept: application/vnd.github+json" \ python - << 'PY'
-H "Authorization: Bearer ${GH_TOKEN}" \ import json, os, sys
-H "X-GitHub-Api-Version: 2022-11-28" \ print(json.dumps(sys.stdin.read())[1:-1])
"${API_URL}/repos/${OWNER}/${REPO}/environments/${ENV_NAME}" \ PY
-d '{}' \ }
-o /tmp/env_response.json
echo "Environment API response:" # API caller that captures status and body for auditability
cat /tmp/env_response.json || true api_call() {
echo "" local method="$1"
local url="$2"
local data_file="$3" # optional path to JSON file
local out_file="$4"
echo "Creating or updating environment variable..." local args=(
curl -sS -f -X PUT \ -sS
-H "Accept: application/vnd.github+json" \ -o "${out_file}"
-H "Authorization: Bearer ${GH_TOKEN}" \ -w "%{http_code}"
-H "X-GitHub-Api-Version: 2022-11-28" \ -X "${method}"
"${API_URL}/repos/${OWNER}/${REPO}/environments/${ENV_NAME}/variables/UPDATESERVER_FILE_URL" \ -H "Accept: application/vnd.github+json"
-d "{\"name\":\"UPDATESERVER_FILE_URL\",\"value\":\"${UPDATESERVER_FILE_URL}\"}" \ -H "Authorization: Bearer ${GH_TOKEN}"
-o /tmp/var_response.json -H "X-GitHub-Api-Version: 2022-11-28"
)
echo "Variable API response:" if [ -n "${data_file}" ]; then
cat /tmp/var_response.json || true args+=( -H "Content-Type: application/json" --data-binary "@${data_file}" )
echo "" fi
echo "Applied: ${ENV_NAME}.UPDATESERVER_FILE_URL" curl "${args[@]}" "${url}"
}
print_hint_for_403() {
echo ""
echo "403 troubleshooting checklist:"
echo "- Token resource owner must be the organization that owns the repo."
echo "- Token must be approved by the org if fine grained token approvals are enabled."
echo "- Token must have Administration read/write for environments."
echo "- Token must have Actions read/write for environment variables."
echo "- If org uses SSO, token must be SSO-authorized."