Files
blackroad-operating-system/.github/workflows/sync-core-api.yml
2025-11-19 15:37:20 -06:00

119 lines
3.8 KiB
YAML

name: Sync core-api to mirror
on:
push:
branches:
- main
paths:
- 'services/core-api/**'
- 'infra/github/sync-config.yml'
workflow_dispatch:
jobs:
sync:
runs-on: ubuntu-latest
env:
SERVICE_KEY: core-api
SYNC_CONFIG: infra/github/sync-config.yml
SYNC_TOKEN: ${{ secrets.BR_OS_SYNC_TOKEN }}
steps:
- name: Checkout monorepo
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Load service config
id: cfg
shell: bash
run: |
python - <<'PY'
import json, yaml, os
key = os.environ['SERVICE_KEY']
with open(os.environ['SYNC_CONFIG'], 'r') as f:
cfg = yaml.safe_load(f)
# service can live under services/apps/docs namespaces; search all
for section in ('services', 'apps', 'docs'):
if section in cfg and key in cfg[section]:
data = cfg[section][key]
break
else:
raise SystemExit(f"Service {key} not found in config")
for output_key, output_value in (
('monorepo_path', data['monorepo_path']),
('target_repo', data['target_repo']),
('target_branch', data.get('target_branch', 'main')),
('force_push', str(data.get('force_push', True)).lower()),
):
print(f"{output_key}={output_value}")
PY | tee /tmp/svc_env
while IFS='=' read -r name value; do
echo "$name=$value" >> "$GITHUB_OUTPUT"
done < /tmp/svc_env
- name: Export service directory
run: |
mkdir -p /tmp/export
rsync -av --delete "${{ steps.cfg.outputs.monorepo_path }}/" /tmp/export/
- name: Clone target repository
env:
TOKEN: ${{ env.SYNC_TOKEN }}
run: |
if [ -z "$TOKEN" ]; then
echo "BR_OS_SYNC_TOKEN is required" >&2
exit 1
fi
git clone "https://${TOKEN}@github.com/${{ steps.cfg.outputs.target_repo }}.git" /tmp/target
- name: Prepare mirror working tree
working-directory: /tmp/target
run: |
shopt -s dotglob
rm -rf -- * .[!.]* ..?*
shopt -u dotglob
mkdir -p .
rsync -av --delete /tmp/export/ ./
- name: Write sync status
working-directory: /tmp/target
run: |
cat <<'STATUS' > sync-status.md
# Sync Status
- Source repo: blackboxprogramming/BlackRoad-Operating-System
- Source path: ${{ steps.cfg.outputs.monorepo_path }}
- Source commit: ${{ github.sha }}
- Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
STATUS
- name: Commit changes
working-directory: /tmp/target
run: |
git status
if git status --porcelain | grep .; then
git config user.name "blackroad-os-bot"
git config user.email "blackroad-os-bot@users.noreply.github.com"
git add .
git commit -m "Sync from BlackRoad-Operating-System: ${{ env.SERVICE_KEY }} @ ${{ github.sha }}"
else
echo "No changes to sync"
echo "skip_push=true" >> $GITHUB_OUTPUT
fi
id: commit
- name: Push mirror
if: steps.commit.outputs.skip_push != 'true'
working-directory: /tmp/target
env:
FORCE_PUSH: ${{ steps.cfg.outputs.force_push }}
run: |
if [ "$FORCE_PUSH" = "true" ]; then
git push origin "HEAD:${{ steps.cfg.outputs.target_branch }}" --force
else
git pull --rebase origin "${{ steps.cfg.outputs.target_branch }}"
git push origin "HEAD:${{ steps.cfg.outputs.target_branch }}"
fi