Update init.yml
This commit is contained in:
98
.github/workflows/init.yml
vendored
98
.github/workflows/init.yml
vendored
@@ -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."
|
||||||
|
|||||||
Reference in New Issue
Block a user