Skip to content

Convert the action from a Docker container action to a JavaScript (node24) action now that CLI v5 is a native binary #321

Open

Description

@minijus

Is your feature request related to a problem? Please describe.

crowdin/github-action is a Docker container action (runs.using: docker, image: Dockerfile). The runner builds the image from crowdin/cli every time a job uses the action, which means:

  • It only runs on Linux runners with a Docker daemon. It doesn't work on macOS or Windows runners (macOS Runner Support #160).
  • On self-hosted runners in Kubernetes (Actions Runner Controller), it requires Docker-in-Docker. DinD needs privileged pods, which many organizations don't allow. ARC's Kubernetes container-hooks mode doesn't support container actions built from a Dockerfile.
  • Every run pulls crowdin/cli from Docker Hub and installs packages from Alpine apk mirrors. This is slow, can hit Docker Hub rate limits, and is hard to allow in restricted or air-gapped networks, where npm is typically already proxied (Artifactory, Nexus, etc.).
  • Files written into the workspace are owned by root (Run action as non root user #284).

Describe the solution you'd like

Crowdin CLI v5 no longer needs Java. @crowdin/cli now installs a prebuilt standalone binary through platform packages (@crowdin/cli-linux-x64, -linux-arm64, -darwin-x64, -darwin-arm64, -win32-x64, and musl variants). That removes the main reason for shipping the action as a container.

Proposal: rewrite the action as a JavaScript action (runs.using: node24) that:

  1. Installs the requested CLI version from npm, or downloads the release binary, caching it with @actions/tool-cache. Ideally it would also accept an optional input for an existing CLI on PATH or a custom npm registry.
  2. Ports entrypoint.sh to TypeScript using @actions/core, @actions/exec and Octokit. This replaces the bash, curl and jq steps for PR creation, labels, assignees and reviewers.
  3. Keeps the existing inputs and outputs so it's a drop-in replacement, released as a new major version (e.g. v4) so v3 users aren't affected.

Benefits:

  • Works on Linux, macOS, Windows, x64 and arm64 (resolves macOS Runner Support #160).
  • No Docker, DinD or privileged runners needed. Works with ARC in Kubernetes mode.
  • Faster startup, because there's no image build on every run.
  • Runs as the runner user, so there are no root-owned files (Run action as non root user #284).
  • Dependencies come only from npm, which is easy to mirror.

Describe alternatives you've considered

  • A composite action that runs npm i -g @crowdin/cli and then the existing entrypoint.sh. This is a smaller change, but it still depends on bash, git, curl, jq and gpg being on the runner, and it doesn't help Windows.
  • Calling the CLI directly in workflow steps instead of using the action. That loses the action's PR and branch handling, which is the main value of the action.
  • Publishing a prebuilt image and using docker://. This avoids the per-run build but still requires Docker or DinD.

Additional context

Related: #160 (macOS runner support), #167 (ARM, closed as a duplicate of #160), #284 (root-owned files).

Happy to help test a pre-release on self-hosted ARC runners.

🤖 Generated by Claude Opus 5.5 (claude-opus-5.5)

Activity

  1. andrii-bodnar commented on Oct 22, 2026

    @andrii-bodnar
    Member

    Hi @minijus, thanks for the suggestion!

    We've considered this before, and the benefits are real. We postponed it because of maintenance cost. The current action is easy to maintain because it doesn't depend on the Node runtime that GitHub Actions provides, so there are no forced node16 → node20 → node24 migrations. A JavaScript version would also mean rewriting entrypoint.sh (branches, commits, GPG signing, PRs, labels, reviewers) and making it behave the same on every OS and architecture. That kind of rewrite would likely bring new bugs that we can't predict yet.

    We'll keep this issue open and revisit it later. Thanks for offering to help test; we'll ping you if we start on it.

  2. minijus commented on Oct 26, 2026

    @minijus
    Author

    @andrii-bodnar I opened #322 to try out the approach proposed here. It converts the action to a node24 JavaScript action, installs the native CLI from the @crowdin/cli-<platform> npm packages into the tool cache, and ports entrypoint.sh to TypeScript. All existing inputs and outputs are kept.

    Could you take a look when you have time? If you agree with the direction, it might be worth publishing it as a v4 beta first (for example v4.0.0-beta.1), so people on macOS/Windows/arm64 or ARC runners can try it before a stable release. The behavior changes are listed in the PR description.

    So far only the PR title check has run. The test workflow, which runs the action on Linux, macOS and Windows, probably needs your approval since this is my first contribution here.

    🤖 Generated by Claude Opus 5.5 (claude-opus-5.5)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions