{"id":15962430,"url":"https://github.com/crazy-max/.github","last_synced_at":"2026-05-10T18:26:46.336Z","repository":{"id":148250936,"uuid":"594496304","full_name":"crazy-max/.github","owner":"crazy-max","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-26T12:33:17.000Z","size":227,"stargazers_count":5,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-26T23:22:08.149Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/crazy-max.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"crazy-max","custom":"https://www.paypal.me/crazyws"}},"created_at":"2023-01-28T18:21:32.000Z","updated_at":"2026-03-26T11:49:53.000Z","dependencies_parsed_at":"2023-12-15T15:49:39.182Z","dependency_job_id":"871b0bfa-e09a-4af1-9ece-25e893a5625a","html_url":"https://github.com/crazy-max/.github","commit_stats":{"total_commits":43,"total_committers":3,"mean_commits":"14.333333333333334","dds":0.06976744186046513,"last_synced_commit":"ccae1c98f1237b5c19e4ef77ace44fa68b3bc7e4"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/crazy-max/.github","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crazy-max%2F.github","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crazy-max%2F.github/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crazy-max%2F.github/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crazy-max%2F.github/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crazy-max","download_url":"https://codeload.github.com/crazy-max/.github/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crazy-max%2F.github/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31306038,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T09:48:21.550Z","status":"ssl_error","status_checked_at":"2026-04-02T09:48:19.196Z","response_time":89,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2024-10-07T16:03:45.733Z","updated_at":"2026-05-10T18:26:46.314Z","avatar_url":"https://github.com/crazy-max.png","language":null,"funding_links":["https://github.com/sponsors/crazy-max","https://www.paypal.me/crazyws"],"categories":[],"sub_categories":[],"readme":"# `.github`\n\nThis repository acts as a fallback for all repositories under my `crazy-max`\nhandle that don't have an actual `.github` directory with issue templates and\nother community health files.\n\nIt also contains a collection of GitHub Actions and reusable workflows\nthat can be used in your own repositories.\n\n___\n\n* [Actions](#actions)\n  * [`container-logs-check`](#container-logs-check)\n  * [`docker-scout`](#docker-scout)\n  * [`gotest-annotations`](#gotest-annotations)\n  * [`install-k3s`](#install-k3s)\n* [Reusable workflows](#reusable-workflows)\n  * [`list-commits`](#list-commits)\n  * [`pr-assign-author`](#pr-assign-author)\n  * [`releases-json`](#releases-json)\n  * [`zizmor`](#zizmor)\n\n## Actions\n\n### `container-logs-check`\n\n[`container-logs-check` composite action](.github/actions/container-logs-check/action.yml)\nchecks for a string in a Docker container or Swarm service logs. This can be\nused as a _poor man's_ e2e testing helper for long-running Docker workloads.\n\n```yaml\nname: test\n\npermissions:\n  contents: read\n\non:\n  push:\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      -\n        name: Run container\n        run: |\n          docker run -d --name test crazymax/samba:4.18.2\n      -\n        name: Check container logs\n        uses: crazy-max/.github/.github/actions/container-logs-check@v1\n        with:\n          name: test\n          log_check: \" started.\"\n          timeout: 20\n```\n\nAction logs:\n\n```\nSetting timezone to UTC\nInitializing files and folders\nSetting global configuration\nCreating user foo/foo (1000:1000)\nAdded user foo.\nCreating user yyy/xxx (1100:1200)\nAdded user yyy.\nAdd global option: force user = foo\nAdd global option: force group = foo\nCreating share public\nCreating share share\nCreating share foo\n# Global parameters\n[global]\n  disable netbios = Yes\n  ...\n  strict locking = No\n  vfs objects = fruit streams_xattr\n  wide links = Yes\nsmbd version 4.18.2 started.\n🎉 Found \" started.\" in container logs\n```\n\nSwarm service example:\n\n```yaml\n      -\n        name: Check service logs\n        uses: crazy-max/.github/.github/actions/container-logs-check@v1\n        with:\n          name: swarm-cronjob\n          type: service\n          log_check: \"Number of cronjob tasks: 7\"\n          timeout: 120\n```\n\n### `docker-scout`\n\n[`docker-scout` composite action](.github/actions/docker-scout/action.yml) scans\nDocker images for vulnerabilities using [Docker Scout](https://github.com/docker/scout-cli).\n\n```yaml\nname: ci\n\npermissions:\n  contents: read\n\non:\n  push:\n\njobs:\n  scout:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      security-events: write\n    steps:\n      -\n        name: Scout\n        id: scout\n        uses: crazy-max/.github/.github/actions/docker-scout@v1\n        with:\n          format: sarif\n          image: alpine:latest\n      -\n        name: Upload SARIF report\n        uses: github/codeql-action/upload-sarif@v4\n        with:\n          sarif_file: ${{ steps.scout.outputs.result-file }}\n```\n\nYou can find the list of available inputs directly in [the action configuration](.github/actions/docker-scout/action.yml).\n\n### `gotest-annotations`\n\n[`gotest-annotations` composite action](.github/actions/gotest-annotations/action.yml)\ngenerates GitHub annotations for generated Go JSON test reports.\n\n```yaml\nname: ci\n\npermissions:\n  contents: read\n\non:\n  push:\n\njobs:\n  go:\n    runs-on: ubuntu-latest\n    steps:\n      -\n        name: Checkout\n        uses: actions/checkout@v6\n      -\n        name: Test\n        run: |\n          mkdir -p ./testreports\n          go test -coverprofile ./testreports/cover.out -json ./... \u003e ./testreports/test-report.json\n      -\n        name: Generate annotations\n        uses: crazy-max/.github/.github/actions/gotest-annotations@v1\n        with:\n          directory: ./testreports\n```\n\n### `install-k3s`\n\n[`install-k3s` composite action](.github/actions/install-k3s/action.yml)\ninstalls [k3s](https://k3s.io/) on a runner.\n\n```yaml\nname: ci\n\npermissions:\n  contents: read\n\non:\n  push:\n\njobs:\n  install-k3s:\n    runs-on: ubuntu-latest\n    steps:\n      -\n        name: Install k3s\n        uses: crazy-max/.github/.github/actions/install-k3s@v1\n        with:\n          version: v1.32.2+k3s1\n```\n\n## Reusable workflows\n\n### `list-commits`\n\n[`list-commits` reusable workflow](.github/workflows/releases-json.yml)\ngenerates a JSON matrix with the list of commits for a pull request.\n\n```yaml\nname: ci\n\npermissions:\n  contents: read\n\non:\n  push:\n  pull_request:\n\njobs:\n  list-commits:\n    uses: crazy-max/.github/.github/workflows/list-commits.yml@v1\n    with:\n      limit: 10\n\n  validate:\n    runs-on: ubuntu-latest\n    needs:\n      - list-commits\n    strategy:\n      fail-fast: false\n      matrix:\n        commit: ${{ fromJson(needs.list-commits.outputs.matrix) }}\n    steps:\n      -\n        name: Checkout\n        uses: actions/checkout@v6\n        with:\n          ref: ${{ matrix.commit }}\n```\n\n\u003e [!NOTE]\n\u003e `limit` input is optional and defaults to `0` (unlimited).\n\n### `pr-assign-author`\n\n[`pr-assign-author` reusable workflow](.github/workflows/pr-assign-author.yml)\nassigns the author of a pull request as an assignee.\n\n```yaml\nname: assign-author\n\npermissions:\n  contents: read\n\non:\n  pull_request_target:\n    types:\n      - opened\n      - reopened\n\njobs:\n  run:\n    uses: crazy-max/.github/.github/workflows/pr-assign-author.yml@v1\n    permissions:\n      contents: read\n      pull-requests: write\n```\n\n### `releases-json`\n\n[`releases-json` reusable workflow](.github/workflows/releases-json.yml)\ngenerates a JSON file with the list of releases for a given repository. Releases\ntags should ideally be [semver](https://semver.org/) compliant and should not\ncontain `latest` or `edge` tags that are handled internally by this action.\nNon-compliant tags are coerced when possible for version comparison, otherwise\nthey are skipped for `edge` resolution.\n\n```yaml\nname: ci\n\npermissions:\n  contents: read\n\non:\n  push:\n\njobs:\n  releases-json:\n    uses: crazy-max/.github/.github/workflows/releases-json.yml@v1\n    with:\n      repository: docker/buildx\n      artifact_name: buildx-releases-json\n      filename: buildx-releases.json\n\n  releases-json-check:\n    runs-on: ubuntu-latest\n    needs:\n      - releases-json\n    steps:\n      -\n        name: Download\n        uses: actions/download-artifact@v8\n        with:\n          name: buildx-releases-json\n          path: .\n      -\n        name: Check file\n        run: |\n          jq . buildx-releases.json\n```\n\nTypical usage is to generate and put this file on your repository if you don't\nwant to use the GitHub API to get the list of releases and therefore avoid\nhitting the rate limit (see [docker/buildx#1563](https://github.com/docker/buildx/pull/1563)\nfor more info).\n\nFor example on [crazy-max/ghaction-hugo](https://github.com/crazy-max/ghaction-hugo)\nrepo, I use this workflow to generate a JSON file with the list of Hugo releases\nand then use it in the action to check for latest and tagged releases:\n\n```js\nasync function getRelease(version) {\n  const url = `https://raw.githubusercontent.com/crazy-max/ghaction-hugo/master/.github/hugo-releases.json`;\n  const response = await fetch(url);\n  const releases = await response.json();\n  console.log(JSON.stringify(releases[version], null, 2));\n}\n\ngetRelease('latest');\n```\n\n```\n{\n  \"id\": 89231061,\n  \"tag_name\": \"v0.110.0\",\n  \"html_url\": \"https://github.com/gohugoio/hugo/releases/tag/v0.110.0\",\n  \"assets\": [\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_checksums.txt\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_darwin-universal.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_dragonfly-amd64.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_freebsd-amd64.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_Linux-64bit.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_linux-amd64.deb\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_linux-amd64.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_linux-arm.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_linux-arm64.deb\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_linux-arm64.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_netbsd-amd64.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_openbsd-amd64.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_windows-amd64.zip\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_0.110.0_windows-arm64.zip\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_extended_0.110.0_darwin-universal.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_extended_0.110.0_Linux-64bit.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_extended_0.110.0_linux-amd64.deb\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_extended_0.110.0_linux-amd64.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_extended_0.110.0_linux-arm64.deb\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_extended_0.110.0_linux-arm64.tar.gz\",\n    \"https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_extended_0.110.0_windows-amd64.zip\"\n  ]\n}\n```\n\n[This workflow runs](https://github.com/crazy-max/ghaction-hugo/blob/101b97bf572a55e490c065774f1aed175182dc6e/.github/workflows/hugo-releases-json.yml)\non push and schedule event, generates the JSON file and opens a pull request\nif it contains new releases, so it's kept in sync with [https://github.com/gohugoio/hugo](https://github.com/gohugoio/hugo).\n\n### `zizmor`\n\n[`zizmor` reusable workflow](.github/workflows/zizmor.yml) scans GitHub Actions\nworkflows in the repository with [Zizmor](https://github.com/zizmorcore/zizmor)\nand uploads the SARIF report to GitHub code scanning.\n\n```yaml\nname: ci\n\npermissions:\n  actions: read\n  contents: read\n\non:\n  push:\n  pull_request:\n\njobs:\n  zizmor:\n    uses: crazy-max/.github/.github/workflows/zizmor.yml@v1\n    permissions:\n      actions: read\n      contents: read\n      security-events: write\n    with:\n      min-severity: medium\n      min-confidence: medium\n      persona: pedantic\n      no-online-audits: true\n```\n\nHere are the main inputs for this reusable workflow:\n\n| Name                      | Type   | Default | Description                                                                   |\n|---------------------------|--------|---------|-------------------------------------------------------------------------------|\n| `path`                    | String | `.`     | Path passed to `zizmor` as the scan target.                                   |\n| `version`                 | String |         | Install a specific zizmor version.                                            |\n| `collect`                 | List   |         | Extra artifact collection modes passed as repeated `--collect=` flags.        |\n| `min-severity`            | String |         | Minimum severity to report.                                                   |\n| `min-confidence`          | String |         | Minimum confidence to report.                                                 |\n| `persona`                 | String |         | Zizmor persona to use for findings and output tuning.                         |\n| `offline`                 | Bool   | `false` | Disable network access for audits.                                            |\n| `no-online-audits`        | Bool   | `false` | Skip online audits while keeping the rest of the scan enabled.                |\n| `strict-collection`       | Bool   | `false` | Fail when artifact collection cannot be completed.                            |\n| `github-app-client-id`    | String |         | GitHub App client ID used to mint an installation token for online audits.    |\n| `github-app-owner`        | String |         | Optional owner whose installation should be used when creating the app token. |\n| `github-app-repositories` | String |         | Optional comma or newline-separated repository list for the app token scope.  |\n\nOptional secret:\n\n| Name                     | Description                                                |\n|--------------------------|------------------------------------------------------------|\n| `github-app-private-key` | GitHub App private key paired with `github-app-client-id`. |\n\nWhen GitHub App credentials are provided, the workflow creates an installation\ntoken with [`actions/create-github-app-token`](https://github.com/actions/create-github-app-token)\nand passes it to `zizmor` for online audits. Otherwise it falls back to the\ndefault `${{ github.token }}`.\n\nThis is useful when `zizmor` needs to resolve private actions or reusable\nworkflows during online audits. The app installation needs read access to the\nrepositories `zizmor` will inspect.\n\nExample with GitHub App authentication:\n\n```yaml\njobs:\n  zizmor:\n    uses: crazy-max/.github/.github/workflows/zizmor.yml@v1\n    permissions:\n      actions: read\n      contents: read\n      security-events: write\n    with:\n      github-app-client-id: ${{ vars.ZIZMOR_GITHUB_APP_CLIENT_ID }}\n      github-app-owner: ${{ github.repository_owner }}\n      github-app-repositories: |\n        private-actions\n        reusable-workflows\n    secrets:\n      github-app-private-key: ${{ secrets.ZIZMOR_GITHUB_APP_PRIVATE_KEY }}\n```\n\nYou can find the list of available inputs directly in [the reusable workflow](.github/workflows/zizmor.yml).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrazy-max%2F.github","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrazy-max%2F.github","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrazy-max%2F.github/lists"}