3-snapshot-github-repositories-popularity-score #197
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: 3-snapshot-github-repositories-popularity-score | |
| # Save a snapshot of the referenced GitHub repositories popularity score (number of stars + number of watchers) to a dedicated JSON file | |
| # Workflow triggered when the README workflow completes successfully on main - but can also be triggered manually without input parameters | |
| on: | |
| workflow_dispatch: | |
| workflow_run: | |
| workflows: | |
| - 2-update-readme-with-github-repositories-details | |
| types: | |
| - completed | |
| permissions: | |
| contents: write | |
| # Concurrency configuration for the current workflow - Keep only the latest workflow queued for the considered group | |
| concurrency: | |
| group: snapshot-github-repositories-popularity-score | |
| cancel-in-progress: true | |
| jobs: | |
| snapshot-github-repositories-popularity-score: | |
| runs-on: ubuntu-latest | |
| if: ${{ github.event_name == 'workflow_dispatch' || (github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.head_branch == 'main') }} | |
| concurrency: | |
| group: main-repository-writers | |
| cancel-in-progress: false | |
| env: | |
| RUNNER_DEBUG: 1 | |
| DATA_SNAPSHOT_METADATA_FILE_PATH: Data/GitHubRepositoriesPopularityScoresSnapshotMetadata.json | |
| steps: | |
| # Action used to checkout the main branch in the current repository | |
| # Community action: https://github.com/actions/checkout | |
| - name: Checkout | |
| uses: actions/checkout@v7 | |
| with: | |
| ref: main | |
| fetch-depth: 0 | |
| # Set a current date environment variable in the following format: YYYYMMDD | |
| - name: Set current date as env variable | |
| id: current_date | |
| run: echo "NOW=$(date +'%Y%m%d')" >> $env:GITHUB_OUTPUT | |
| shell: pwsh | |
| # Set the name of the current day in the week as a variable | |
| - name: Set the name of the current day in the week as env variable | |
| id: current_day_in_the_week | |
| run: echo "DAY=$(date +'%A')" >> $env:GITHUB_OUTPUT | |
| shell: pwsh | |
| # If the current day in the week is Monday, take a snapshot of the popularity score of the referenced GitHub repositories - For the tests we will configure the step for the next day (Thursday) | |
| - name: Take a snapshot of the popularity score of the referenced GitHub repositories | |
| if: ${{ steps.current_day_in_the_week.outputs.DAY == 'Monday' }} | |
| run: | | |
| Write-Host "/********************************************************************************/" | |
| Write-Host "Install required modules" | |
| Import-Module .\Scripts\Export-GitHubRepositoriesPopularityScore.ps1 -Force | |
| Write-Host "/********************************************************************************/" | |
| Write-Host "Take a snapshot of the popularity score of the referenced GitHub repositories" | |
| $results = Export-GitHubRepositoriesPopularityScore ` | |
| -InputFilePath "${{ vars.DATA_FILE_PATH }}" ` | |
| -OutputFilePath "${{ vars.DATA_SNAPSHOT_FILE_PATH }}" ` | |
| -MetadataOutputFilePath ".\$env:DATA_SNAPSHOT_METADATA_FILE_PATH" | |
| shell: pwsh | |
| # Push the changes in the current repository | |
| - name: Push changes | |
| run: | | |
| git config --global user.name 'action@github.com' | |
| git config --global user.email 'GitHub Action' | |
| git add -- "${{ vars.DATA_SNAPSHOT_FILE_PATH }}" "$env:DATA_SNAPSHOT_METADATA_FILE_PATH" | |
| git diff --cached --quiet | |
| $gitDiffExitCode = $LASTEXITCODE | |
| if ($gitDiffExitCode -eq 0) { | |
| Write-Host "No popularity snapshot changes to commit." | |
| if ($env:GITHUB_STEP_SUMMARY) { | |
| @( | |
| "### Push changes" | |
| "" | |
| "- Snapshot files were unchanged, so commit and push were skipped." | |
| ) | Add-Content -Path $env:GITHUB_STEP_SUMMARY | |
| } | |
| exit 0 | |
| } | |
| if ($gitDiffExitCode -ne 1) { | |
| throw "Unable to check staged snapshot changes. git diff exited with code $gitDiffExitCode." | |
| } | |
| git commit -m "GitHub repositories popularity score updated - ${{ steps.current_date.outputs.NOW }}.${{ github.run_number }}" | |
| $pushSucceeded = $false | |
| $usedRetry = $false | |
| for ($attempt = 1; $attempt -le 2; $attempt++) { | |
| $pushOutput = & git -c http.extraheader="AUTHORIZATION: Bearer ${{ secrets.GITHUB_TOKEN }}" push origin HEAD:main 2>&1 | |
| $pushExitCode = $LASTEXITCODE | |
| $pushOutput | ForEach-Object { Write-Host $_ } | |
| if ($pushExitCode -eq 0) { | |
| $pushSucceeded = $true | |
| break | |
| } | |
| $isFastForwardConflict = ($pushOutput | Out-String) -match 'fetch first|non-fast-forward|failed to push some refs' | |
| if ($attempt -eq 2 -or -not $isFastForwardConflict) { | |
| throw "Unable to push snapshot changes. git push exited with code $pushExitCode." | |
| } | |
| $usedRetry = $true | |
| Write-Warning "Remote main moved during push attempt $attempt. Fetching origin/main, rebasing, and retrying once." | |
| if ($env:GITHUB_STEP_SUMMARY) { | |
| @( | |
| "### Push retry" | |
| "" | |
| "- Push attempt $attempt was rejected because `main` moved." | |
| "- Fetching `origin/main`, rebasing the snapshot commit, and retrying once." | |
| ) | Add-Content -Path $env:GITHUB_STEP_SUMMARY | |
| } | |
| & git fetch origin main 2>&1 | ForEach-Object { Write-Host $_ } | |
| if ($LASTEXITCODE -ne 0) { | |
| throw "Unable to fetch origin/main before retrying the snapshot push." | |
| } | |
| & git rebase origin/main 2>&1 | ForEach-Object { Write-Host $_ } | |
| if ($LASTEXITCODE -ne 0) { | |
| & git rebase --abort 2>&1 | ForEach-Object { Write-Host $_ } | |
| throw "Unable to rebase snapshot changes onto origin/main before retrying the push." | |
| } | |
| } | |
| if (-not $pushSucceeded) { | |
| throw "Unable to push snapshot changes after retrying." | |
| } | |
| if ($usedRetry -and $env:GITHUB_STEP_SUMMARY) { | |
| @( | |
| "- The retry path completed successfully and the rebased snapshot commit was pushed to `main`." | |
| ) | Add-Content -Path $env:GITHUB_STEP_SUMMARY | |
| } | |
| shell: pwsh |