У меня есть файл main.yml, который вызывает другие рабочие процессы через workflow_call
. Имена вызываемых рабочих процессов называются workflow1
и workflow2
.
Если workflow2
вызывается после workflow1
, то workflow2
не выполняется. Если я их переключу, то workflow1
не получится.
Оба рабочих процесса работают нормально при вызове через workflow_dispatch
.
Оба рабочих процесса отправляются в репозиторий.
Код, который я использую для этого, идентичен в обоих рабочих процессах:
- name: Commit and push the changes
run: |
echo "Initial status:"
git status
git config --local user.email "[email protected]"
git config --local user.name "GitHub Action"
git add -A
echo "Status after git add:"
git status
git diff --cached --exit-code && exit 0 # Exit if no changes in the staging area
echo "Committing changes:"
git commit -m "chore: fetch content from various external sources"
echo "Pushing changes:"
git push
echo "Final status:"
git status
Второй рабочий процесс завершается сбоем:
Run echo "Initial status:"
Initial status:
On branch main
Your branch is up to date with 'origin/main'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: xxx.md
modified: yyy.md
modified: zzz.md
no changes added to commit (use "git add" and/or "git commit -a")
Status after git add:
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: xxx.md
modified: yyy.md
modified: zzz.md
diff --git a/xxx.md b/xxx.md etc etc
Насколько я понимаю, если у меня есть основной рабочий процесс, который вызывает два других рабочих процесса, все они выполняются на отдельном «бегуне», поэтому после того, как workflow1
выполняется и workflow2
получает свой собственный бегун, проверка репо должна работать?
Я попробовал различные предложения AI:
1: Запустите это в начале части git (не понимаю, почему это поможет, но я попробовал):
git fetch origin main
git reset --hard origin/main
2. Запустите это в начале части git (не понимаю, почему это поможет, но я попробовал):
git pull origin main
Я также пробовал поспать на несколько секунд между workflow1
и workflow2
, но это не помогло.
Что мне не хватает? Я потратил на это несколько часов и не продвинулся дальше.
===
Дополнение: под yml-скриптом вызывающего абонента и скриптом(ами) вызываемого абонента, отредактированным для простоты, где вы видите «***», эти звездочки являются заменой того, что я решил скрыть, то же самое для «xxx»:
основной.yml:
name: Import all and Deploy to GitHub Pages
on:
workflow_dispatch:
jobs:
workflow1:
uses: ./.github/workflows/workflow1.yml
secrets:
SECRET1: ${{ secrets.*** }}
SECRET2: ${{ secrets.*** }}
SECRET3: ${{ secrets.*** }}
workflow2:
needs: workflow1
uses: ./.github/workflows/workflow2.yml
secrets:
SECRET1: ${{ secrets.*** }}
SECRET2: ${{ secrets.*** }}
SECRET3: ${{ secrets.*** }}
рабочий процесс 1 (и рабочий процесс 2, они по сути одинаковы):
# Summary: This GitHub Actions workflow fetches content from various external sources, updates a glossary, and deploys changes to GitHub Pages.
name: workflow1
on:
workflow_dispatch:
workflow_call:
secrets:
SECRET1:
required: true
SECRET2:
required: true
SECRET3:
required: true
jobs:
deploy:
name: Import external glossaries
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 19
cache: npm
- name: Install dependencies
run: npm ci
##############################
- name: Import external glossaries
env:
SECRET1: ${{ secrets.*** }}
SECRET2: ${{ secrets.*** }}
SECRET3: ${{ secrets.*** }}
run: sh xxx/xxx/xxx/main.sh
##############################
##############################
- name: Commit and push the changes
run: |
echo "Initial status:"
git status
git config --local user.email "[email protected]"
git config --local user.name "GitHub Action"
git add -A
echo "Status after git add:"
git status
git diff --cached --exit-code && exit 0 # Exit if no changes in the staging area
echo "Committing changes:"
git commit -m "chore: fetch content from various external sources"
echo "Pushing changes:"
git push
echo "Final status:"
git status
##############################
Покажите, пожалуйста, как вы вызываете рабочий процесс1 и рабочий процесс2.
@GuiFalourd Я добавил запрошенную информацию в конце сообщения после «===». Надеюсь, это поможет.
@DeltaGeorge Я добавил запрошенную информацию в конце сообщения после «===». Надеюсь, это поможет.
Мне удалось воспроизвести это неинтуитивное поведение и обнаружить две проблемы:
Родительский рабочий процесс не имеет разрешения на отправку данных в репозиторий, поэтому вызванные рабочие процессы получают то же разрешение только для чтения, что и родительский рабочий процесс. Разрешение на запись должно быть дано явно.
рабочий процесс2 не может отправить, так как глава базовой ветки продвинулся вперед благодаря отправке рабочего процесса1. Несмотря на то, что рабочий процесс2 проверяет репозиторий после завершения рабочего процесса1, он все равно получает ту же позицию начала ветки, что и рабочий процесс1. Таким образом, рабочий процесс2 должен извлечь ветку, прежде чем вносить какие-либо изменения.
Следующие сокращенные рабочие процессы работают должным образом:
Родительский рабочий процесс:
name: workflow_main
on:
workflow_dispatch:
permissions:
contents: write
jobs:
workflow1:
uses: ./.github/workflows/workflow1.yaml
workflow2:
needs: workflow1
uses: ./.github/workflows/workflow2.yaml
Рабочий процесс2 (тот же, что и рабочий процесс1) — см. git pull:
name: workflow2
on:
workflow_dispatch:
workflow_call:
jobs:
deploy:
name: Import external glossaries
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Import external glossaries
run: |
git pull
echo $RANDOM > workflow2.txt
- name: Commit and push the changes
run: |
git config --local user.email "[email protected]"
git config --local user.name "GitHub Action"
git add .
git commit -m "chore: fetch content from various external sources"
git push
git status
Тестирование. Это может занять некоторое время.
Спасибо, Дельта Джордж!
Используете ли вы
actions/checkout
где-нибудь в своих рабочих процессах? Если да, то с какой настройкой?