name: "Синхронизация Wiki" on: workflow_dispatch: inputs: ref: description: "Branch or tag to run wiki sync from" required: false default: "master" push: branches: - master paths: - 'wiki/**' jobs: sync-wiki: name: "Синхронизация Wiki" runs-on: native steps: # ── Получение исходного кода (без actions/checkout) ──────────────── - name: "Получение исходного кода" shell: bash env: GIT_TOKEN: ${{ secrets.GIT_TOKEN }} run: | set -e SERVER="${{ github.server_url }}" REPO="${{ github.repository }}" HOST="${SERVER#https://}" HOST="${HOST#http://}" redact() { local token="$1" if [ -n "${token}" ]; then grep -F -v "${token}" || true else cat fi } echo ">>> Клонирование ${REPO}..." if [ -d ".src-repo" ]; then rm -rf .src-repo fi if [ -n "${GIT_TOKEN}" ]; then if [ "${HOST}" = "github.com" ]; then CLONE_URL="https://x-access-token:${GIT_TOKEN}@${HOST}/${REPO}.git" else CLONE_URL="https://${GIT_TOKEN}@${HOST}/${REPO}.git" fi else CLONE_URL="${SERVER}/${REPO}.git" fi git clone --depth 1 "${CLONE_URL}" .src-repo 2>&1 | redact "${GIT_TOKEN}" echo ">>> Исходный код получен: $(cd .src-repo && git log --oneline -1)" - name: "Проверка папки wiki/" shell: bash run: | if [ ! -d ".src-repo/wiki" ]; then echo "Папка wiki/ не найдена — синхронизация не требуется." exit 0 fi echo ">>> Найдено файлов wiki: $(find .src-repo/wiki -type f | wc -l)" - name: "Синхронизация wiki в DFGit Wiki" shell: bash env: GIT_TOKEN: ${{ secrets.GIT_TOKEN }} run: | set -e redact() { local token="$1" if [ -n "${token}" ]; then grep -F -v "${token}" || true else cat fi } if [ -z "${GIT_TOKEN}" ]; then echo "GIT_TOKEN не задан. Добавьте секрет в настройках: Settings -> Secrets -> Actions." echo "Пропуск синхронизации wiki без ошибки." exit 0 fi SERVER="${{ github.server_url }}" REPO="${{ github.repository }}" HOST="${SERVER#https://}" HOST="${HOST#http://}" WIKI_REPO_URL="${SERVER}/${REPO}.wiki.git" if [ "${HOST}" = "github.com" ]; then AUTH_WIKI_REPO_URL="https://x-access-token:${GIT_TOKEN}@${HOST}/${REPO}.wiki.git" else AUTH_WIKI_REPO_URL="https://oauth2:${GIT_TOKEN}@${HOST}/${REPO}.wiki.git" fi echo ">>> Клонируем wiki-репозиторий..." if ! git clone --depth 1 "${AUTH_WIKI_REPO_URL}" .wiki-repo 2>&1 | redact "${GIT_TOKEN}"; then echo "Wiki-репозиторий недоступен или ещё не инициализирован: ${WIKI_REPO_URL}" echo "Пропуск синхронизации без ошибки." exit 0 fi # rsync или резервный вариант через cp if command -v rsync &>/dev/null; then rsync -a --delete --exclude '.git/' .src-repo/wiki/ .wiki-repo/ else # Удаляем старые файлы (кроме .git) и копируем новые find .wiki-repo -mindepth 1 -not -path '.wiki-repo/.git/*' -not -name '.git' -delete 2>/dev/null || true cp -a .src-repo/wiki/* .wiki-repo/ fi cd .wiki-repo git add -A if git diff --cached --quiet; then echo ">>> Изменений в wiki нет — пуш не требуется." exit 0 fi git config user.name "dfgit-actions[bot]" git config user.email "dfgit-actions@local" DEFAULT_BRANCH=$(git remote show origin 2>/dev/null | sed -n '/HEAD branch/s/.*: //p') if [ -z "${DEFAULT_BRANCH}" ]; then DEFAULT_BRANCH="master" fi git commit -m "docs(wiki): синхронизация из master @ ${{ github.sha }}" git push origin "HEAD:${DEFAULT_BRANCH}" 2>&1 | redact "${GIT_TOKEN}" echo ">>> Wiki синхронизирована в ветку ${DEFAULT_BRANCH}."