رفع مشکل اجرا نشدن ورکفلو از داخل ورکفلوی دیگر در گیت هاب
فرض کنید که ما ورکفلویی در گیت های ایجاد کرده ایم که درون آن برای مثال قرار است تگی را ایجاد کنیم یا تغییری را در ریپازیتوری پوش کنیم که خود این کار باعث اجرای ورکفلوی دیگری بشود. در حالت عادی این کار باعث اجرای خودکار ورکفلوی دیگر نمی شود. دلیل این کار این است که به صورت پیش فرض در اکشن از GITHUB_TOKEN برای کار با ریپازیتوری استفاده می شود. برای مثال وقتی می خواهیم در ورکفلو کد را Checkout کنیم بوسیله این اکسس توکنی که خودکار ایجاد شده انجام می شود.
نکته مهم اینجاست که برای جلوگیری از اجرای بازگشتی ورکفلوها و ایجاد حلقه، رویدادهایی که با استفاده از این توکن ایجاد می شود باعث اجرای ورکفلوی جدید نمی شوند.
برای حل این مشکل باید یک Personal Access Token یا اکسس توکن شخصی با دسترسی مورد نظر (برای مثال پوش کردن کد) درست کنیم و بوسیله آن عملیات مورد نظر را انجام دهیم. می توانیم PAT تولید شده را در سکرت ها ذخیره کنیم و از آن در زمان Checkout کد استفاده کنیم.
- name: Check out the code
uses: actions/checkout@v3
with:
fetch-depth: 0
token: ${{ secrets.GH_PAT }}
در مثال بالا که PAT تولید شده در سکرت GH_PAT ذخیره شده است و در زمان checkout به جای GITHUB_TOKEN مورد استفاده قرار می گیرد.
حال اگر برای مثال در ادامه تگی را ایجاد کنیم و آن را پوش کنیم، این کار بوسیله PAT تولید شده ما انجام می شود.
- name: Create tag
run: |
git config user.name "ci-bot"
git config user.email "ci-bot@example.com"
git tag -a v1.0.0 -m "Release v1.0.0"
git push origin v1.0.0
و ورکفلوی زیر که در زمان پوش شدن تگ جدید باید اجرا شود نیز اجرا خواهد شد:
name: Build
on:
push:
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Log GitHub Context
run: |
echo "Event name: ${{ github.event_name }}"
echo "Reference: ${{ github.ref }}"
echo "Tag name: ${{ github.ref_name }}"
echo "Push details: ${{ toJson(github) }}"