{"id":22682180,"url":"https://github.com/andry81-devops/gh-action--accum-gh-stats","last_synced_at":"2025-07-24T06:05:18.741Z","repository":{"id":55198078,"uuid":"430229548","full_name":"andry81-devops/gh-action--accum-gh-stats","owner":"andry81-devops","description":"GitHub composite action to request and accumulate a repository clones and/or views statistic. • :page_with_curl: https://github.com/andry81-stats/gh-action--accum-gh-stats--gh-stats :page_with_curl:","archived":false,"fork":false,"pushed_at":"2025-02-03T02:39:23.000Z","size":56,"stargazers_count":5,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-29T17:02:03.476Z","etag":null,"topics":["action","clones","clones-badge","composite-action","github","github-action","github-statistic","insights","traffic","views","views-badge"],"latest_commit_sha":null,"homepage":"https://github.com/andry81-devops/github-accum-stats","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andry81-devops.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.txt","contributing":null,"funding":".github/FUNDING.yml","license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":["https://github.com/andry81/donate"]}},"created_at":"2021-11-20T23:15:55.000Z","updated_at":"2025-02-03T02:39:27.000Z","dependencies_parsed_at":"2024-12-09T20:26:41.524Z","dependency_job_id":"deba5f85-b243-419a-be24-54bb43d1bd73","html_url":"https://github.com/andry81-devops/gh-action--accum-gh-stats","commit_stats":{"total_commits":62,"total_committers":1,"mean_commits":62.0,"dds":0.0,"last_synced_commit":"9ac3522b24878b5c05cf897aace4fff1b6c03474"},"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/andry81-devops/gh-action--accum-gh-stats","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andry81-devops%2Fgh-action--accum-gh-stats","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andry81-devops%2Fgh-action--accum-gh-stats/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andry81-devops%2Fgh-action--accum-gh-stats/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andry81-devops%2Fgh-action--accum-gh-stats/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andry81-devops","download_url":"https://codeload.github.com/andry81-devops/gh-action--accum-gh-stats/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andry81-devops%2Fgh-action--accum-gh-stats/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266801421,"owners_count":23986371,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-24T02:00:09.469Z","response_time":99,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["action","clones","clones-badge","composite-action","github","github-action","github-statistic","insights","traffic","views","views-badge"],"created_at":"2024-12-09T20:25:35.041Z","updated_at":"2025-07-24T06:05:18.707Z","avatar_url":"https://github.com/andry81-devops.png","language":null,"funding_links":["https://github.com/andry81/donate"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\r\n  \u003ca href=\"#\"\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/metrics/shields-repo-size.svg\" valign=\"middle\" alt=\"GitHub repo size in bytes\" /\u003e\u003c/a\u003e\r\n\u003c!-- -- \u003e\r\n• \u003ca href=\"#\"\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/metrics/shields-code-size.svg\" valign=\"middle\" alt=\"code size in bytes\" /\u003e\u003c/a\u003e\r\n\u003c!-- --\u003e\r\n• \u003ca href=\"https://github.com/XAMPPRocky/tokei\"\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/metrics/tokei-lines-of-code.svg\" valign=\"middle\" alt=\"lines of code by tokei.rs\" /\u003e\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n\u003cp align=\"center\"\u003e\r\n  \u003ca href=\"https://github.com/andry81-stats/gh-action--accum-gh-stats--gh-stats/commits/master/traffic/views\"\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/traffic/views/all.svg\" valign=\"middle\" alt=\"GitHub views|any|total\" /\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/traffic/views/all-14d.svg\" valign=\"middle\" alt=\"GitHub views|any|14d\" /\u003e\u003c/a\u003e\r\n• \u003ca href=\"https://github.com/andry81-stats/gh-action--accum-gh-stats--gh-stats/commits/master/traffic/views\"\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/traffic/views/unq.svg\" valign=\"middle\" alt=\"GitHub views|unique per day|total\" /\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/traffic/views/unq-14d.svg\" valign=\"middle\" alt=\"GitHub views|unique per day|14d\" /\u003e\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n\u003cp align=\"center\"\u003e\r\n  \u003ca href=\"https://github.com/andry81-stats/gh-action--accum-gh-stats--gh-stats/commits/master/traffic/clones\"\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/traffic/clones/all.svg\" valign=\"middle\" alt=\"GitHub clones|any|total\" /\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/traffic/clones/all-14d.svg\" valign=\"middle\" alt=\"GitHub clones|any|14d\" /\u003e\u003c/a\u003e\r\n• \u003ca href=\"https://github.com/andry81-stats/gh-action--accum-gh-stats--gh-stats/commits/master/traffic/clones\"\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/traffic/clones/unq.svg\" valign=\"middle\" alt=\"GitHub clones|unique per day|total\" /\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/traffic/clones/unq-14d.svg\" valign=\"middle\" alt=\"GitHub clones|unique per day|14d\" /\u003e\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n\u003cp align=\"center\"\u003e\r\n  \u003ca href=\"https://github.com/andry81-devops/gh-action--accum-gh-stats/commits\"\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/metrics/commits-since-latest.svg\" valign=\"middle\" alt=\"GitHub commits since latest version\" /\u003e\u003c/a\u003e\r\n  \u003ca href=\"https://github.com/andry81-devops/gh-action--accum-gh-stats/releases\"\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/metrics/latest-release-name.svg\" valign=\"middle\" alt=\"latest release name\" /\u003e\u003c/a\u003e\r\n• \u003ca href=\"https://github.com/andry81-devops/gh-action--accum-gh-stats/releases\"\u003e\r\n    \u003cimg src=\"https://github.com/andry81-cache/andry81-devops--gh-content-cache/raw/master/repo/andry81-devops/gh-action--accum-gh-stats/badges/metrics/github-all-releases.svg\" valign=\"middle\" alt=\"GitHub all releases\" /\u003e\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n\u003cp align=\"center\"\u003e\r\n  \u003ca href=\"https://github.com/andry81/donate\"\u003e\u003cimg src=\"https://github.com/andry81-cache/gh-content-static-cache/raw/master/common/badges/donate/donate.svg\" valign=\"middle\" alt=\"donate\" /\u003e\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n---\r\n\r\n\u003cp align=\"center\"\u003e\r\n  \u003ca href=\"https://github.com/andry81-devops/gh-action--accum-gh-stats/tree/HEAD/userlog.md\"\u003eUserlog\u003c/a\u003e\r\n• \u003ca href=\"https://github.com/andry81-devops/gh-action--accum-gh-stats/tree/HEAD/changelog.txt\"\u003eChangelog\u003c/a\u003e\r\n• \u003ca href=\"#dependencies\"\u003eDependencies\u003c/a\u003e\r\n• \u003ca href=\"#known-issues\"\u003eKnown issues\u003c/a\u003e\r\n• \u003ca href=\"#copyright-and-license\"\u003e\u003cimg src=\"https://github.com/andry81-cache/gh-content-static-cache/raw/master/common/badges/license/mit-license.svg\" valign=\"middle\" alt=\"copyright and license\" /\u003e\u0026nbsp;Copyright and License\u003c/a\u003e\r\n\u003c/p\u003e\r\n\r\n\u003ch4 align=\"center\"\u003eGitHub composite action to request and accumulate a repository clones and/or views statistic.\u003c/h4\u003e\r\n\r\nTutorial to use with: https://github.com/andry81-devops/github-accum-stats\r\n\r\nAll tutorials: https://github.com/andry81/index#tutorials\r\n\r\n##\r\n\r\n# gh-action--accum-gh-stats@master\r\n\r\n## Features:\r\n\r\n* Repository to track and repository to store traffic statistic can be different, and you may directly point the statistic as commits list:\r\n  `https://github.com/{{REPO_OWNER}}/{{REPO}}--gh-stats/commits/master/traffic/clones` or\r\n  `https://github.com/{{REPO_OWNER}}/{{REPO}}--gh-stats/commits/master/traffic/views`\r\n\r\n* Workflow is used [accum-stats.sh](https://github.com/andry81-devops/gh-workflow/tree/HEAD/bash/github/accum-stats.sh) bash script to accumulate traffic statistic\r\n\r\n* The script accumulates statistic both into a single file and into a set of files grouped by year and allocated per day:\r\n  `traffic/clones/by_year/YYYY/YYYY-MM-DD.json` or\r\n  `traffic/views/by_year/YYYY/YYYY-MM-DD.json`\r\n\r\n* The script does compensate statistic interpolation issue (from inner GitHub resolution like per hour basis into per day basis) for the last records by calculation of the min and max values per day fluctuation and does use the maximum value instead of an interpolated value for all being removed outdated records (after 14'th day).\r\n\r\n* The script does detect residual changes in the `latest.json` file has generated by the github to avoid excessive commits while a day with empty or has no effect changes except those changes which is a removal of outdated records (after 14'th day).\r\n\r\n\r\n## Functionality of the script:\r\n\r\n* `CONTINUE_ON_INVALID_INPUT=1`, `CONTINUE_ON_EMPTY_CHANGES=1`, `CONTINUE_ON_RESIDUAL_CHANGES=1`:\r\n  Treats invalid input, empty changes or unexpected/residual changes as not an error as by default.\r\n\r\n* `ENABLE_GENERATE_CHANGELOG_FILE=1`, `CHANGELOG_FILE=\".../changelog.txt\"`:\r\n  Generates a textual changelog file with notes about changes per commit including the changes absence in case of skipped errors.\r\n\r\n* `ENABLE_COMMIT_MESSAGE_DATE_WITH_TIME=1`:\r\n  Inserts the time string in format `HH:MMZ` additionally after the date in each commit message (by default inserts only a date for shorter commit messages).\r\n\r\n* `ENABLE_COMMIT_MESSAGE_DATE_TIME_WITH_LAST_CHANGED_DATE_OFFSET=1`:\r\n  Inserts the last changed date offset string additionally after the datetime in each commit message in format `-DDT` to note the closest changed date.\r\n\r\n* `ENABLE_COMMIT_MESSAGE_WITH_WORKFLOW_RUN_NUMBER=1`:\r\n  Inserts the workflow run number after date/time prefix in each commit message (by default does not insert for shorter commit messages).\r\n\r\n* `ENABLE_GITHUB_ACTIONS_RUN_URL_PRINT_TO_CHANGELOG=1`:\r\n  Prints GitHub Actions Run URL (with or without workflow run number) into the changelog file to reference the log on the GitHub from the changelog file.\r\n\r\n* `ENABLE_REPO_STATS_COMMITS_URL_PRINT_TO_CHANGELOG=1`:\r\n  Prints Statistic Output Repository commit URL into the changelog file to reference the commit from being committed changelog file.\r\n\r\n  \u003e [!NOTE]\r\n  \u003e The actual hash of the commit can not be know on the moment of the commit. So instead of the commit hash, an approximate date of the commit is used (~ +5 min ahead) in format of:\r\n  \u003e `https://github.com/{{REPO_OWNER}}/{{REPO}}--gh-stats/commits?branch={{BRANCH}}\u0026time_zone=utc\u0026until=YYYY-MM-DD`\r\n\r\n# USAGE\r\n\r\n\u003e [!WARNING]\r\n\u003e You must replace all placeholder into respective values:\r\n\r\n* `{{REPO_OWNER}}` -\u003e repository owner\r\n* `{{REPO}}` -\u003e your repository\r\n* `{{BRANCH}}` -\u003e your repository branch or reference\r\n\r\n## Examples:\r\n\r\n\u003ca name=\"accum-gh-clone-stats-yml\"\u003e`.github/workflows/accum-gh-clone-stats.yml`\u003c/a\u003e:\r\n\r\n```yml\r\nname: GitHub clones counter for 14 days at every 8 hours and clones accumulator\r\n\r\non:\r\n  schedule:\r\n    - cron: \"0 */8 * * *\"\r\n  # Allows you to run this workflow manually from the Actions tab\r\n  workflow_dispatch:\r\n\r\njobs:\r\n  accum-gh-clone-stats:\r\n    runs-on: ubuntu-latest\r\n\r\n    steps:\r\n      - uses: {{REPO_OWNER}}/gh-action--accum-gh-stats@master\r\n        with:\r\n          deps_repo_owner:          {{REPO_OWNER}}\r\n          deps_repo_branch:         master\r\n          deps_repo_read_token:     ${{ github.token }}\r\n\r\n          stat_repo_owner:          {{REPO_OWNER}}\r\n          stat_repo:                {{REPO}}\r\n          stat_entity:              clones\r\n          stat_repo_read_token:     ${{ secrets.READ_STATS_TOKEN }}\r\n          stats_list_key:           clones\r\n\r\n          #commit_msg_entity:        cl\r\n\r\n          curl_flags: \u003e-\r\n            -H 'Cache-Control: no-cache'\r\n\r\n          output_repo_owner:        {{REPO_OWNER}}\r\n          output_repo:              {{REPO}}--gh-stats\r\n          output_repo_branch:       master\r\n          output_repo_dir:          traffic/clones\r\n          output_repo_write_token:  ${{ secrets.WRITE_STATS_TOKEN }}\r\n\r\n          flags: \u003e-\r\n            ENABLE_PRINT_INITIAL_ENV_INTO_STDOUT=1\r\n\r\n          env: \u003e-\r\n            ENABLE_GENERATE_CHANGELOG_FILE=1\r\n            ENABLE_COMMIT_MESSAGE_DATE_WITH_TIME=1                            # insert the time string in format `HH:MMZ` additionally after the date in each commit message\r\n            ENABLE_COMMIT_MESSAGE_DATE_TIME_WITH_LAST_CHANGED_DATE_OFFSET=1   # insert datetime suffix as offset to the last changed date in format `-DDT` to note the closest changed date\r\n            ENABLE_COMMIT_MESSAGE_WITH_WORKFLOW_RUN_NUMBER=1                  # insert the workflow run number after date/time prefix in each commit message\r\n            ENABLE_GITHUB_ACTIONS_RUN_URL_PRINT_TO_CHANGELOG=1\r\n            ENABLE_REPO_STATS_COMMITS_URL_PRINT_TO_CHANGELOG=1\r\n          #  CONTINUE_ON_INVALID_INPUT=1\r\n          #  CONTINUE_ON_EMPTY_CHANGES=1\r\n          #  CONTINUE_ON_RESIDUAL_CHANGES=1\r\n          #  CHANGELOG_FILE=changelog.txt\r\n```\r\n\r\n\u003ca name=\"accum-gh-view-stats-yml\"\u003e`.github/workflows/accum-gh-view-stats.yml`\u003c/a\u003e:\r\n\r\n```yml\r\nname: GitHub views counter for 14 days at every 8 hours and views accumulator\r\n\r\non:\r\n  schedule:\r\n    - cron: \"0 */8 * * *\"\r\n  # Allows you to run this workflow manually from the Actions tab\r\n  workflow_dispatch:\r\n\r\njobs:\r\n  accum-gh-view-stats:\r\n    runs-on: ubuntu-latest\r\n\r\n    steps:\r\n      - uses: {{REPO_OWNER}}/gh-action--accum-gh-stats@master\r\n        with:\r\n          deps_repo_owner:          {{REPO_OWNER}}\r\n          deps_repo_branch:         master\r\n          deps_repo_read_token:     ${{ github.token }}\r\n\r\n          stat_repo_owner:          {{REPO_OWNER}}\r\n          stat_repo:                {{REPO}}\r\n          stat_entity:              views\r\n          stat_repo_read_token:     ${{ secrets.READ_STATS_TOKEN }}\r\n          stats_list_key:           views\r\n\r\n          #commit_msg_entity:        vi\r\n\r\n          curl_flags: \u003e-\r\n            -H 'Cache-Control: no-cache'\r\n\r\n          output_repo_owner:        {{REPO_OWNER}}\r\n          output_repo:              {{REPO}}--gh-stats\r\n          output_repo_branch:       master\r\n          output_repo_dir:          traffic/views\r\n          output_repo_write_token:  ${{ secrets.WRITE_STATS_TOKEN }}\r\n\r\n          flags: \u003e-\r\n            ENABLE_PRINT_INITIAL_ENV_INTO_STDOUT=1\r\n\r\n          env: \u003e-\r\n            ENABLE_GENERATE_CHANGELOG_FILE=1\r\n            ENABLE_COMMIT_MESSAGE_DATE_WITH_TIME=1                            # insert the time string in format `HH:MMZ` additionally after the date in each commit message\r\n            ENABLE_COMMIT_MESSAGE_DATE_TIME_WITH_LAST_CHANGED_DATE_OFFSET=1   # insert datetime suffix as offset to the last changed date in format `-DDT` to note the closest changed date\r\n            ENABLE_COMMIT_MESSAGE_WITH_WORKFLOW_RUN_NUMBER=1                  # insert the workflow run number after date/time prefix in each commit message\r\n            ENABLE_GITHUB_ACTIONS_RUN_URL_PRINT_TO_CHANGELOG=1\r\n            ENABLE_REPO_STATS_COMMITS_URL_PRINT_TO_CHANGELOG=1\r\n          #  CONTINUE_ON_INVALID_INPUT=1\r\n          #  CONTINUE_ON_EMPTY_CHANGES=1\r\n          #  CONTINUE_ON_RESIDUAL_CHANGES=1\r\n          #  CHANGELOG_FILE=changelog.txt\r\n```\r\n\r\n\u003e [!NOTE]\r\n\u003e You can use `secrets.READ_STATS_TOKEN` instead of `secrets.WRITE_STATS_TOKEN` as long as both repositories under the same repository owner.\r\n\r\n\u003e [!WARNING]\r\n\u003e You must use different values for `deps_repo_owner`, `stat_repo_owner` and `output_repo_owner` if respective repositories actually under different repository owners.\r\n\r\n\u003e [!NOTE]\r\n\u003e See \u003ca href=\"https://github.com/andry81-devops/github-accum-stats#reuse\"\u003eREUSE\u003c/a\u003e section for details if you have multiple repositories and want to store all GitHub workflow scripts (`.github/workflows/*.yml`) in a single repository.\r\n\r\n## Dependencies\r\n\r\n* https://github.com/andry81-devops/gh-workflow\r\n\r\n## Known Issues\r\n\r\nhttps://github.com/andry81-devops/gh-known-issues#known-issues\r\n\r\n## Last known issues updates\r\n\r\nhttps://github.com/andry81-devops/gh-known-issues#last-known-issues-updates\r\n\r\n## Copyright and License\r\n\r\nCode and documentation copyright 2021 Andrey Dibrov. Code released under [MIT License](https://github.com/andry81-devops/gh-action--accum-gh-stats/tree/HEAD/license.txt)\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandry81-devops%2Fgh-action--accum-gh-stats","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandry81-devops%2Fgh-action--accum-gh-stats","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandry81-devops%2Fgh-action--accum-gh-stats/lists"}