diff --git a/.github/workflows/star-history.yml b/.github/workflows/star-history.yml new file mode 100644 index 0000000..fe0bf94 --- /dev/null +++ b/.github/workflows/star-history.yml @@ -0,0 +1,124 @@ +name: Update Star History + +on: + schedule: + - cron: "17 */2 * * *" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: star-history + cancel-in-progress: true + +jobs: + render: + name: Render charts + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: read + steps: + - name: Check out repository + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + with: + persist-credentials: false + + - name: Verify Star History token + shell: bash + env: + STAR_HISTORY_TOKEN: ${{ secrets.STAR_HISTORY_TOKEN }} + run: | + if [ -z "${STAR_HISTORY_TOKEN}" ]; then + echo "STAR_HISTORY_TOKEN is not configured." >&2 + exit 1 + fi + + - name: Verify stargazers API access + shell: bash + env: + STAR_HISTORY_TOKEN: ${{ secrets.STAR_HISTORY_TOKEN }} + run: | + set -euo pipefail + status="$(curl --silent --show-error \ + --output "${RUNNER_TEMP}/stargazers-response.json" \ + --write-out '%{http_code}' \ + --header 'Accept: application/vnd.github.star+json' \ + --header "Authorization: Bearer ${STAR_HISTORY_TOKEN}" \ + --header 'X-GitHub-Api-Version: 2022-11-28' \ + "https://api.github.com/repos/${GITHUB_REPOSITORY}/stargazers?per_page=1")" + if [ "${status}" != '200' ]; then + echo "Stargazers API returned HTTP ${status}." >&2 + python3 -c 'import json,sys; data=json.load(open(sys.argv[1])); print(data.get("message", "Unknown GitHub API error"))' \ + "${RUNNER_TEMP}/stargazers-response.json" + exit 1 + fi + + - name: Render light and dark charts + uses: narayann7/star-history-action@c2061675dacbf6f35d116e556015b8905843387f # v1.0.4 + with: + repos: ${{ github.repository }} + output-dir: assets/star-history + token: ${{ secrets.STAR_HISTORY_TOKEN }} + themes: light,dark + update-readme: false + commit: false + + - name: Upload charts + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + with: + name: star-history-charts + path: | + assets/star-history/star-history-light.svg + assets/star-history/star-history-dark.svg + if-no-files-found: error + retention-days: 1 + + publish: + name: Publish charts + needs: render + runs-on: ubuntu-latest + timeout-minutes: 5 + permissions: + contents: write + steps: + - name: Check out repository + uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + + - name: Download charts + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 + with: + name: star-history-charts + path: ${{ runner.temp }}/star-history/assets/star-history + + - name: Validate generated files + shell: bash + run: | + set -euo pipefail + chart_dir="${RUNNER_TEMP}/star-history/assets/star-history" + test -s "${chart_dir}/star-history-light.svg" + test -s "${chart_dir}/star-history-dark.svg" + test "$(find "${chart_dir}" -type f | wc -l)" -eq 2 + test -z "$(find "${chart_dir}" -type l -print -quit)" + grep -q ' + + + + Star History Chart + +