mirror of
https://github.com/blackboxprogramming/BlackRoad-Operating-System.git
synced 2026-03-17 05:57:21 -05:00
119 lines
3.8 KiB
YAML
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
|