{"id":51055792,"url":"https://github.com/chenasraf/workflows","last_synced_at":"2026-06-22T21:01:11.081Z","repository":{"id":334115460,"uuid":"1140107424","full_name":"chenasraf/workflows","owner":"chenasraf","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-17T20:23:18.000Z","size":34,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-26T00:29:07.834Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Makefile","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/chenasraf.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2026-01-22T20:50:16.000Z","updated_at":"2026-05-17T20:23:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/chenasraf/workflows","commit_stats":null,"previous_names":["chenasraf/workflows"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/chenasraf/workflows","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenasraf%2Fworkflows","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenasraf%2Fworkflows/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenasraf%2Fworkflows/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenasraf%2Fworkflows/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chenasraf","download_url":"https://codeload.github.com/chenasraf/workflows/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenasraf%2Fworkflows/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34665261,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","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":[],"created_at":"2026-06-22T21:01:10.128Z","updated_at":"2026-06-22T21:01:11.067Z","avatar_url":"https://github.com/chenasraf.png","language":"Makefile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Reusable GitHub Workflows\n\nA collection of reusable GitHub Actions workflows.\n\n## Table of Contents\n\n- [Workflows](#workflows)\n  - [Go Release](#go-release-go-releaseyml)\n  - [Manual Homebrew Release](#manual-homebrew-release-manual-homebrew-releaseyml)\n  - [Release Please + Fastlane Changelog](#release-please--fastlane-changelog-release-please-fastlane-changelogyml)\n- [Nextcloud Workflows](#nextcloud-workflows)\n  - [PHPUnit MySQL](#phpunit-mysql-nextcloud-phpunit-mysqlyml)\n  - [PHPUnit PostgreSQL](#phpunit-postgresql-nextcloud-phpunit-pgsqlyml)\n  - [PHPUnit Incremental Migration](#phpunit-incremental-migration-nextcloud-phpunit-incrementalyml)\n  - [Psalm Static Analysis](#psalm-static-analysis-nextcloud-psalmyml)\n  - [PHP Lint](#php-lint-nextcloud-lint-phpyml)\n  - [PHP-CS-Fixer](#php-cs-fixer-nextcloud-lint-php-csyml)\n  - [ESLint](#eslint-nextcloud-lint-eslintyml)\n  - [OpenAPI Lint](#openapi-lint-nextcloud-lint-openapiyml)\n  - [AppInfo XML Lint](#appinfo-xml-lint-nextcloud-lint-appinfo-xmlyml)\n  - [NPM Build](#npm-build-nextcloud-build-npmyml)\n  - [Vitest](#vitest-nextcloud-vitestyml)\n  - [Block Unconventional Commits](#block-unconventional-commits-nextcloud-block-unconventional-commitsyml)\n- [License](#license)\n\n## Workflows\n\n### Go Release (`go-release.yml`)\n\nA complete CI/CD workflow for Go projects that handles testing, cross-platform builds, releases, and\nHomebrew tap updates.\n\n#### Features\n\n- Runs tests with configurable test command\n- Cross-platform builds (Linux, macOS, Windows)\n- Automated releases via [release-please](https://github.com/googleapis/release-please)\n- Automatic Homebrew tap updates via repository dispatch\n\n#### Usage\n\n```yaml\nname: Release\n\non:\n  push:\n    branches: [master]\n  pull_request:\n    branches: [master]\n\njobs:\n  release:\n    uses: chenasraf/workflows/.github/workflows/go-release.yml@master\n    with:\n      name: my-cli\n      go-version: '1.24'\n      platforms: '[\"linux/amd64\", \"darwin/arm64\"]'\n      main-branch: main\n      homebrew-tap-repo: myorg/homebrew-tap\n    secrets:\n      REPO_DISPATCH_PAT: ${{ secrets.REPO_DISPATCH_PAT }}\n```\n\n#### Inputs\n\n| Input               | Description                                          | Required | Default                                                            |\n| ------------------- | ---------------------------------------------------- | -------- | ------------------------------------------------------------------ |\n| `name`              | Binary/project name                                  | Yes      | -                                                                  |\n| `go-version`        | Go version to use                                    | No       | `1.24`                                                             |\n| `platforms`         | JSON array of platforms to build                     | No       | `[\"linux/amd64\", \"darwin/amd64\", \"darwin/arm64\", \"windows/amd64\"]` |\n| `package`           | Go package path (empty for root)                     | No       | `\"\"`                                                               |\n| `compress`          | Compress build artifacts                             | No       | `true`                                                             |\n| `test-command`      | Test command to run                                  | No       | `go test -v ./...`                                                 |\n| `skip-tests`        | Skip running tests                                   | No       | `false`                                                            |\n| `main-branch`       | Main branch name for releases                        | No       | `master`                                                           |\n| `homebrew-tap-repo` | Homebrew tap repo for dispatch (leave empty to skip) | No       | ``                                                                 |\n\n#### Secrets\n\n| Secret              | Description                              | Required |\n| ------------------- | ---------------------------------------- | -------- |\n| `REPO_DISPATCH_PAT` | PAT for dispatching to homebrew tap repo | No       |\n\n---\n\n### Manual Homebrew Release (`manual-homebrew-release.yml`)\n\nManually triggers a Homebrew tap update for the latest release. Useful when you need to re-trigger a Homebrew formula update without creating a new release.\n\n#### Features\n\n- Fetches the latest release tag and body from the repository\n- Sends a repository dispatch event to your Homebrew tap repo\n- Works with any Homebrew tap that listens for `trigger-from-release` events with payload: `{ tag, repo, body }`\n\n#### Usage\n\n```yaml\nname: Manual Homebrew Release\n\non:\n  workflow_dispatch:\n\njobs:\n  homebrew:\n    uses: chenasraf/workflows/.github/workflows/manual-homebrew-release.yml@master\n    with:\n      homebrew-tap-repo: myorg/homebrew-tap\n    secrets:\n      REPO_DISPATCH_PAT: ${{ secrets.REPO_DISPATCH_PAT }}\n```\n\n#### Inputs\n\n| Input               | Description                                      | Required | Default |\n| ------------------- | ------------------------------------------------ | -------- | ------- |\n| `homebrew-tap-repo` | Homebrew tap repo to dispatch to (e.g., owner/homebrew-tap) | Yes      | -       |\n\n#### Secrets\n\n| Secret              | Description                              | Required |\n| ------------------- | ---------------------------------------- | -------- |\n| `REPO_DISPATCH_PAT` | PAT for dispatching to homebrew tap repo | Yes      |\n\n---\n\n### Release Please + Fastlane Changelog (`release-please-fastlane-changelog.yml`)\n\nRuns [release-please](https://github.com/googleapis/release-please), then when a release PR is\ncreated or updated, extracts the changelog for the current version from `CHANGELOG.md`, formats it\nfor the Play Store (stripped of markdown links, commit hashes, etc.), truncates to the 500-char\nlimit, and writes it to one or more fastlane metadata directories. The changelog is amended into\nrelease-please's commit so the tagged release includes the file.\n\n#### Features\n\n- Runs release-please with configurable release type\n- Extracts version-specific notes from `CHANGELOG.md`\n- Strips commit links, reformats bullets, removes markdown headers\n- Truncates to Play Store's 500-char limit with a configurable trailer\n- Writes to multiple output directories (e.g. Android + iOS fastlane metadata)\n- Amends the release-please commit (no extra commits in the PR)\n- Forwards `release_created`, `tag_name`, and `version` outputs\n\n#### Usage\n\n```yaml\nname: CI/CD\n\non:\n  push:\n    branches: [master]\n\njobs:\n  release-please:\n    uses: chenasraf/workflows/.github/workflows/release-please-fastlane-changelog.yml@master\n    with:\n      release-type: dart\n```\n\nWith multiple output directories (Android + iOS):\n\n```yaml\njobs:\n  release-please:\n    uses: chenasraf/workflows/.github/workflows/release-please-fastlane-changelog.yml@master\n    with:\n      release-type: dart\n      fastlane-changelog-dirs: |\n        fastlane/metadata/android/en-US/changelogs\n        fastlane/metadata/ios/en-US/changelogs\n\n  build:\n    needs: release-please\n    if: ${{ needs.release-please.outputs.release_created }}\n    # ...\n```\n\n#### Inputs\n\n| Input                      | Description                                                        | Required | Default                                          |\n| -------------------------- | ------------------------------------------------------------------ | -------- | ------------------------------------------------ |\n| `release-type`             | Release Please release type (`dart`, `node`, `python`, `go`, etc.) | Yes      | -                                                |\n| `version-file`             | File containing the version string                                 | No       | `pubspec.yaml`                                   |\n| `changelog-file`           | Path to the CHANGELOG.md file                                      | No       | `CHANGELOG.md`                                   |\n| `fastlane-changelog-dirs`  | Newline-separated list of output directories                       | No       | `fastlane/metadata/android/en-US/changelogs`     |\n| `max-length`               | Maximum changelog length in characters                             | No       | `500`                                            |\n| `truncation-trailer`       | Text appended when the changelog is truncated                      | No       | `\\n\\n… see full notes on GitHub.`                |\n\n#### Secrets\n\n| Secret  | Description                                        | Required |\n| ------- | -------------------------------------------------- | -------- |\n| `token` | GitHub token for release-please (defaults to `GITHUB_TOKEN`) | No       |\n\n#### Outputs\n\n| Output            | Description                  |\n| ----------------- | ---------------------------- |\n| `release_created` | Whether a release was created |\n| `tag_name`        | The release tag name          |\n| `version`         | The release version           |\n\n---\n\n## Nextcloud Workflows\n\nReusable workflows for Nextcloud app development. These workflows include automatic path filtering to skip unnecessary runs when irrelevant files change.\n\n### PHPUnit MySQL (`nextcloud-phpunit-mysql.yml`)\n\nRuns PHPUnit tests with MySQL database.\n\n```yaml\njobs:\n  phpunit:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-phpunit-mysql.yml@nextcloud-latest\n    with:\n      php-versions-min: '8.1'\n      php-versions-max: '8.4'\n      mysql-version: '8.0'\n      path-filters: |\n        - 'lib/**'\n        - 'tests/**'\n        - 'composer.json'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `php-versions-min` | Minimum PHP version | No | `8.2` |\n| `php-versions-max` | Maximum PHP version | No | `8.3` |\n| `mysql-version` | MySQL version | No | `8.4` |\n| `php-extensions` | PHP extensions to install | No | _(common extensions)_ |\n| `path-filters` | Paths to trigger on (YAML list) | No | _(lib, tests, etc.)_ |\n\n### PHPUnit PostgreSQL (`nextcloud-phpunit-pgsql.yml`)\n\nRuns PHPUnit tests with PostgreSQL database.\n\n```yaml\njobs:\n  phpunit:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-phpunit-pgsql.yml@nextcloud-latest\n    with:\n      php-version: '8.2'\n      path-filters: |\n        - 'lib/**'\n        - 'tests/**'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `php-version` | PHP version | No | `8.3` |\n| `php-extensions` | PHP extensions to install | No | _(common extensions)_ |\n| `path-filters` | Paths to trigger on (YAML list) | No | _(lib, tests, etc.)_ |\n\n### PHPUnit Incremental Migration (`nextcloud-phpunit-incremental.yml`)\n\nTests database migrations by upgrading from a baseline version.\n\n```yaml\njobs:\n  incremental:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-phpunit-incremental.yml@nextcloud-latest\n    with:\n      baseline-version: v1.0.0\n      php-version: '8.2'\n      validation-query: 'SELECT COUNT(*) FROM oc_myapp_users'\n      path-filters: |\n        - 'lib/Migration/**'\n        - 'appinfo/info.xml'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `baseline-version` | Git tag/ref to upgrade from | Yes | - |\n| `php-version` | PHP version | No | `8.3` |\n| `php-extensions-mysql` | PHP extensions for MySQL tests | No | _(common extensions)_ |\n| `php-extensions-pgsql` | PHP extensions for PostgreSQL tests | No | _(common extensions)_ |\n| `validation-query` | SQL query to validate migration | No | _(empty)_ |\n| `path-filters` | Paths to trigger on (YAML list) | No | _(lib, tests, etc.)_ |\n\n### Psalm Static Analysis (`nextcloud-psalm.yml`)\n\nRuns Psalm static analysis across supported Nextcloud versions.\n\n```yaml\njobs:\n  psalm:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-psalm.yml@nextcloud-latest\n    with:\n      psalm-command: 'composer run psalm -- --show-info=true'\n      path-filters: |\n        - 'lib/**/*.php'\n        - 'psalm.xml'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `psalm-command` | Command to run Psalm | No | `composer run psalm` |\n| `php-extensions` | PHP extensions to install | No | _(common extensions)_ |\n| `path-filters` | Paths to trigger on (YAML list) | No | `**.php`, `psalm.xml` |\n\n### PHP Lint (`nextcloud-lint-php.yml`)\n\nRuns PHP syntax linting across supported PHP versions.\n\n```yaml\njobs:\n  lint:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-lint-php.yml@nextcloud-latest\n    with:\n      lint-command: 'composer run lint -- --colors'\n      path-filters: |\n        - 'lib/**/*.php'\n        - 'appinfo/**/*.php'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `lint-command` | Command to run lint | No | `composer run lint` |\n| `php-extensions` | PHP extensions to install | No | _(common extensions)_ |\n| `path-filters` | Paths to trigger on (YAML list) | No | `**.php` |\n\n### PHP-CS-Fixer (`nextcloud-lint-php-cs.yml`)\n\nChecks PHP code style with PHP-CS-Fixer.\n\n```yaml\njobs:\n  cs:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-lint-php-cs.yml@nextcloud-latest\n    with:\n      cs-check-command: 'vendor/bin/php-cs-fixer fix --dry-run --diff'\n      path-filters: |\n        - 'lib/**/*.php'\n        - 'tests/**/*.php'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `cs-check-command` | Command to check code style | No | `composer run cs:check` |\n| `php-extensions` | PHP extensions to install | No | _(common extensions)_ |\n| `path-filters` | Paths to trigger on (YAML list) | No | `**.php`, `.php-cs-fixer.dist.php` |\n\n### ESLint (`nextcloud-lint-eslint.yml`)\n\nRuns ESLint on frontend code.\n\n```yaml\njobs:\n  eslint:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-lint-eslint.yml@nextcloud-latest\n    with:\n      lint-command: 'pnpm lint --max-warnings 0'\n      path-filters: |\n        - 'src/**/*.ts'\n        - 'src/**/*.vue'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `lint-command` | Command to run lint | No | `pnpm lint` |\n| `path-filters` | Paths to trigger on (YAML list) | No | `src/**`, `*.ts`, `*.js`, etc. |\n\n### OpenAPI Lint (`nextcloud-lint-openapi.yml`)\n\nValidates OpenAPI spec is up to date.\n\n```yaml\njobs:\n  openapi:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-lint-openapi.yml@nextcloud-latest\n    with:\n      openapi-command: 'composer run generate-openapi'\n      typescript-types-pattern: 'src/api/types/*.ts'\n      path-filters: |\n        - 'lib/Controller/**/*.php'\n        - 'openapi.json'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `openapi-command` | Command to regenerate OpenAPI | No | `composer run openapi` |\n| `typescript-types-pattern` | Glob for TypeScript types | No | `src/types/openapi/openapi*.ts` |\n| `path-filters` | Paths to trigger on (YAML list) | No | `lib/**/*.php`, `openapi.json` |\n\n### AppInfo XML Lint (`nextcloud-lint-appinfo-xml.yml`)\n\nValidates `appinfo/info.xml` against schema.\n\n```yaml\njobs:\n  xml:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-lint-appinfo-xml.yml@nextcloud-latest\n    with:\n      xml-file: './custom/path/info.xml'\n      path-filters: |\n        - 'custom/path/info.xml'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `xml-file` | Path to the info.xml file | No | `./appinfo/info.xml` |\n| `schema-url` | URL to XML schema | No | _(Nextcloud schema)_ |\n| `path-filters` | Paths to trigger on (YAML list) | No | `appinfo/info.xml` |\n\n### NPM Build (`nextcloud-build-npm.yml`)\n\nBuilds frontend assets with pnpm.\n\n```yaml\njobs:\n  build:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-build-npm.yml@nextcloud-latest\n    with:\n      build-command: 'pnpm build:prod'\n      path-filters: |\n        - 'src/**'\n        - 'package.json'\n        - 'pnpm-lock.yaml'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `build-command` | Command to run build | No | `pnpm build` |\n| `path-filters` | Paths to trigger on (YAML list) | No | `src/**`, `*.json`, etc. |\n\n### Vitest (`nextcloud-vitest.yml`)\n\nRuns Vitest frontend tests.\n\n```yaml\njobs:\n  vitest:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-vitest.yml@nextcloud-latest\n    with:\n      node-version: '20'\n      test-command: 'pnpm vitest run --coverage'\n      path-filters: |\n        - 'src/**'\n        - 'tests/**'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `node-version` | Node.js version to use | No | `22` |\n| `test-command` | Command to run tests | No | `pnpm test:run` |\n| `path-filters` | Paths to trigger on (YAML list) | No | `src/**`, `*.ts`, etc. |\n\n### Block Unconventional Commits (`nextcloud-block-unconventional-commits.yml`)\n\nBlocks commits that don't follow conventional commit format.\n\n```yaml\njobs:\n  commits:\n    uses: chenasraf/workflows/.github/workflows/nextcloud-block-unconventional-commits.yml@nextcloud-latest\n    with:\n      allowed-types: 'feat,fix,docs,chore,refactor'\n```\n\n| Input | Description | Required | Default |\n|-------|-------------|----------|---------|\n| `allowed-types` | Comma-separated list of allowed commit types | No | _(feat, fix, docs, etc.)_ |\n\n---\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenasraf%2Fworkflows","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchenasraf%2Fworkflows","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenasraf%2Fworkflows/lists"}