J'ai un script d'action YamL Github, qui consiste sur trois emplois. Le script nocturne doit vérifier s'il y a des commissions d'utilisateurs (qui ne provenaient pas d'un travail automatique), puis effectuez la version de la version nocturne et déploiez la construction dans l'environnement de test.
Je me lance d'utiliser un seul point où je pouvais sauter l'exécution de l'ensemble de la seconde et troisième emplois s'il n'y a pas de commits récents dans les référentiels autres que les autocommensions.
Pour autant que je sache, je devrais échouer sur le script de sauter des actions supplémentaires ou de définir la condition if
à chaque étape de chaque travail que j'ai, ce qui n'a pas l'air concis.
J'ai essayé de mettre la condition if
condition sur le travail lui-même, mais cela ne fonctionne pas. Le travail exécute même si la valeur de condition if
est fausse. Existe-t-il une solution meilleure ou élégante à l'échec du travail si le référentiel est rassis?
name: Nightly script
on:
workflow_dispatch:
schedule:
- cron: "0 1 * * *"
jobs:
check-if-there-are-commits:
runs-on: ubuntu-latest
outputs:
alive: ${{ steps.check.outputs.alive }}
steps:
### Activity check
### uses GitHub API to check last non-automagic commit in repository
### if it's older than a week, all other steps are skipped
- name: Activity check
id: "check"
run: |
curl -sL -H "Authorization: bearer ${{secrets.REPO_BEARER_TOKEN}}" https://api.github.com/repos/$GITHUB_REPOSITORY/commits?sha=dev | jq -r '[.[] | select(.author.type != "Bot")][0]' > $HOME/commit.json
echo $GITHUB_REPOSITORY
echo $HOME
echo $(cat $HOME/commit.json)
date="$(jq -r '.commit.author.date' $HOME/commit.json)"
echo "Date: $date"
timestamp=$(date --utc -d "$date" +%s)
echo "Timestamp: $timestamp"
echo "Current date: $(date --utc +%s)"
echo "Difference between the current date and time of the last commit: $(( ( $(date --utc +%s) - $timestamp ) ))"
days=$(( ( $(date --utc +%s) - $timestamp ) / 86400 ))
echo "Days: $days"
alive=0
echo "Date: $date"
echo "timestamp: $timestamp"
echo "days: $days"
if [ $days -lt 1 ]; then
echo Repository active : $days days
alive=1
else
echo "[WARNING] Repository not updated : event<${{ github.event_name }}> not allowed to modify stale repository"
fi
echo "Alive? $alive"
if [ $alive -eq 1 ]; then
echo "REPO_ALIVE=true" >> $GITHUB_ENV
echo "::set-output name=alive::true"
else
echo "REPO_ALIVE=false" >> $GITHUB_ENV
echo "::set-output name=alive::false"
fi
echo "REPO_ACTIVITY=$days" >> $
echo "::set-output name=days::$days"
release:
needs: check-if-there-are-commits
if: ${{needs.check-if-there-are-commits.outputs.alive}} == 'true'
runs-on: ubuntu-latest
steps:
- name: "Verify"
run: |
echo "Alive? ${{needs.check-if-there-are-commits.outputs.alive}}"
alive=${{needs.check-if-there-are-commits.outputs.alive}}
if [ $alive == "true" ]; then
echo "Alive"
else
echo "Dead"
exit 1;
fi
- name: Next step
if: ${{needs.check-if-there-are-commits.outputs.alive}} == 'true'
run: |
...
#- other steps...
deploy:
needs: [check-if-there-are-commits, release]
if: ${{needs.check-if-there-are-commits.outputs.alive}} == 'true'
runs-on: ubuntu-latest
steps:
#- other steps
Selon la - Documentation :
Lorsque vous utilisez des expressions dans un si conditionnel, vous pouvez omettre la syntaxe d'expression ($ {{}}) car GitHub évalue automatiquement le si conditionné comme une expression, à moins que l'expression ne contienne aucun opérateur. Si l'expression contient des opérateurs, l'expression doit être contenue dans le cadre de $ {{}} pour le marquer explicitement pour évaluation.
Cela signifie que votre si doit être défini comme suit:
if: ${{ needs.check-if-there-are-commits.outputs.alive == 'true' }}