cloudflare / wrangler-action

πŸ§™β€β™€οΈ easily deploy cloudflare workers applications using wrangler and github actions
Apache License 2.0
1.23k stars 157 forks source link

Error Installing Wrangler with pnpm #181

Open saviski opened 1 year ago

saviski commented 1 year ago

This error started happening in the latest version

πŸ“₯ Installing Wrangler
  Running command: pnpm add wrangler@3.5.1
  Error: Command failed: pnpm add wrangler@3.5.1
  Error: 🚨 Action failed
1000hz commented 1 year ago

It seems like this could be a result of pnpm not being available in the runner environment. Are you including https://github.com/pnpm/action-setup in an earlier step of your workflow before wrangler-action?

AdiRishi commented 1 year ago

I just ran into this myself. For me I think the special case was that I'm using the workingDirectory property

- name: Deploy apex-gateway
  uses: cloudflare/wrangler-action@v3
  with:
    accountId: ${{ secrets.CF_ACCOUNT_ID || secrets.CLOUDFLARE_ACCOUNT_ID }}
    apiToken: ${{ secrets.CF_API_TOKEN || secrets.CLOUDFLARE_API_TOKEN }}
    workingDirectory: 'workers/apex-gateway'
    command: 'deploy'

My suspicion is that it is looking for pnpm-lock.yaml which doesn't exist when running in the subdirectory. To be clear, this is running in a monorepo setup (using turborepo). The exact error message is

Run cloudflare/wrangler-action@v3.3.1
  with:
    accountId: ***
    apiToken: ***
    workingDirectory: workers/apex-gateway
    command: deploy
    quiet: false
  env:
    TURBO_TOKEN: ***
    TURBO_REMOTE_CACHE_SIGNATURE_KEY: ***
    TURBO_TEAM: team_tiptop
    TURBO_API: ***
    GITHUB_SHA: ***
    CLOUDFLARE_ACCOUNT_ID: ***
    CLOUDFLARE_API_TOKEN: ***
    NODE_ENV: production
    PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
πŸ“₯ Installing Wrangler
  Running command: npm i wrangler@3.5.1
  npm ERR! code EUNSUPPORTEDPROTOCOL
  Error: Command failed: npm i wrangler@3.5.1
  npm ERR! code EUNSUPPORTEDPROTOCOL
  npm ERR! Unsupported URL Type "workspace:": workspace:*

  npm ERR! A complete log of this run can be found in: /home/runner/.npm/_logs/2023-10-14T09_39_26_137Z-debug-0.log

  npm ERR! Unsupported URL Type "workspace:": workspace:*

  npm ERR! A complete log of this run can be found in: /home/runner/.npm/_logs/2023-10-14T09_39_26_137Z-debug-0.log
  Error: 🚨 Action failed
AdiRishi commented 1 year ago

Actually I'm now 100% sure that it's a bug because it's searching in the workingDirectory. We can see this in the wrangler-action codebase

function detectPackageManager(
    workingDirectory = ".",
): PackageManagerValue | null {
    if (existsSync(path.join(workingDirectory, "package-lock.json"))) {
        return "npm";
    }
    if (existsSync(path.join(workingDirectory, "yarn.lock"))) {
        return "yarn";
    }
    if (existsSync(path.join(workingDirectory, "pnpm-lock.yaml"))) {
        return "pnpm";
    }
    if (existsSync(path.join(workingDirectory, "bun.lockb"))) {
        return "bun";
    }
    return null;
}

This is likely a seperate issue to the one being reported, should I create a new issue report?

1000hz commented 1 year ago

@AdiRishi yes, please open a new issue for that

AdiRishi commented 1 year ago

@AdiRishi yes, please open a new issue for that

Done - https://github.com/cloudflare/wrangler-action/issues/198

thantos commented 1 year ago

It seems like this could be a result of pnpm not being available in the runner environment. Are you including https://github.com/pnpm/action-setup in an earlier step of your workflow before wrangler-action?

Ran into the same error and I am 100% installing pnpm

      - name: Set up pnpm
        uses: pnpm/action-setup@v2
        with:
          version: 8.6.2

      - name: do a bunch of things with pnpm

      - name: Deploy
        uses: cloudflare/wrangler-action@v3
        with:
          apiToken: ${{ secrets.CF_API_TOKEN }}
          accountId: ${{ secrets.CF_ACCOUNT_ID }}
          command: pages deploy ./packages/portal/out --project-name=${{ vars.CF_PROJECT_NAME }}
thantos commented 1 year ago

Here is the actual error (from running locally since you swallow the error :( )

ERR_PNPM_ADDING_TO_ROOT  Running this command will add the dependency to the workspace root, which might not be what you want - if you really meant it, make it explicit by running this command again with the -w flag (or --workspace-root). If you don't want to see this warning anymore, you may set the ignore-workspace-root-check setting to true.

Going to try with a working directory.

By the way, I already have it installed at the root, would be great if the action didn't need to do it again...

thantos commented 1 year ago

Which of course runs into this: https://github.com/cloudflare/wrangler-action/issues/198

This action doesn't work with pnpm workspaces.

thantos commented 1 year ago

Update: I was able to get by this with a hack

wranglerVersion: "* -w"

This uses the existing version of wrangler in the root pnpm and injects the -w needed to bypass the PNPM workspace root error.

enfipy commented 1 year ago

I was able to work around this issue with a pretty simple change, just by setting packageManager: pnpm near the workingDirectory property:

- uses: pnpm/action-setup@v2
  with:
    version: 8.9.0
- uses: cloudflare/wrangler-action@v3
  with:
    apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
    workingDirectory: ./<PATH_TO_PACKAGE>/
    environment: production
    packageManager: pnpm

The issue indeed is because of getPackageManager function tries to retrieve packageManager from detectPackageManager(workingDirectory), and when workingDirectory is a subdirectory of workspace (e.g. without pnpm-lock.yaml) - it results in an error. So explicitly setting packageManager: pnpm - solves this issue.

P.S: Also, I think it's a good idea to mention this in the docs or troubleshooting, as nowadays many projects use workspaces.

1000hz commented 1 year ago

@thantos thanks for investigating. It looks like there are two distinct problems here:

I'll keep this issue open to track the first problem. Installation error stdout being swallowed should be addressed by #171. I'll also open a new issue to track installing wrangler only when it's not already installed. (#199)

maxpetretta commented 1 year ago

Another solution to this issue here: https://github.com/cloudflare/wrangler-action/issues/198#issuecomment-1771357679

sam-goodwin commented 11 months ago

Update: I was able to get by this with a hack

wranglerVersion: "* -w"

This uses the existing version of wrangler in the root pnpm and injects the -w needed to bypass the PNPM workspace root error.

This workaround isn't working for me.

I have opened a PR with an attempt to fix this: https://github.com/cloudflare/wrangler-action/pull/207

@1000hz let me know if my approach is on the right track.

skf-funzt commented 6 months ago

Update: I was able to get by this with a hack

wranglerVersion: "* -w"

This uses the existing version of wrangler in the root pnpm and injects the -w needed to bypass the PNPM workspace root error.

Unfortunately, this solution lets the action fail with

πŸš€ Running Wrangler Commands
Error: Invalid Version: * -w
Error: 🚨 Action failed
Ambroos commented 6 months ago

For the workspace issue, an easy workaround is to just add a step right before wrangler-action:

- run: echo "ignore-workspace-root-check=true" >> .npmrc

If you don't have any other pnpm adds later there's no need to remove it in a workflow.

Ambroos commented 5 months ago

Since v3.6.0, released a few hours ago, the action will reuse an existing Wrangler installation. You can just pre-install your favourite wrangler version and this is no longer an issue: https://github.com/cloudflare/wrangler-action/releases/tag/v3.6.0

Update: the fix that fixed this in v3.6.0 was reverted in v3.6.1 because it had some breaking side effects if you use npm, but it's fine if you use pnpm. We pinned the action to v3.6.0 in our repo to keep the fix: uses: cloudflare/wrangler-action@v3.6.0

IanVS commented 3 months ago

Is anyone else here having this issue when setting packageManager: pnpm and also setting workingDirectory? https://github.com/cloudflare/workers-sdk/issues/6224

broisnischal commented 2 months ago

I am still having problem doing, but and what if I am using bun as the package manager?

stevefrench39 commented 2 months ago

Would --ignore-workspaces break other functionality? https://github.com/orgs/pnpm/discussions/4735#discussioncomment-2770033