firebase / firebase/firebase-tools

default project does not act as the default with aliases added

Open
#4,593 1 comment 0 reactions 1 assignee Claimed by @bkendall View on GitHub
api: core Needs: Attention type: bug
Dominant language
TypeScript
Stars
4.5k
Forks
1.3k
Avg merge
1d 12h
Merged PRs (30d)
84

Description

I recently added an alias so that I could pass a second .env variable when deploying my Cloud Functions, but I started getting the following error in my CI:

https://app.circleci.com/pipelines/github/dereekb/dbx-components/607/workflows/8b52bf87-f0c2-4f24-964a-bf9094d1d558/jobs/1359/parallel-runs/0/steps/0-105

As workaround, I now have to now specify --project=default. The work around seems fairly anti-pattern since I have to add --project=default to every `firebase` call that CI uses now.

https://github.com/dereekb/dbx-components/commit/9b7fd202f12ca303e171657b1d74ec7f4f6c0105

Is `default` not really actually a default?

My updated .firebaserc that causes this issue for reference:

```
{
"projects": {
"default": "dereekb-components",
"prod": "dereekb-components"
}
}
```

### [REQUIRED] Environment info

**firebase-tools: 10.9.2**

**Platform: macOS, Ubuntu (Docker node:16.14-bullseye) **

### [REQUIRED] Test case

Open a project with both a default and an alias. Try running a functions that targets a project:

`npx firebase hosting:channel:deploy test`

### [REQUIRED] Steps to reproduce

Add an alias to .firebaserc on a project that did not have one before that has CI or use Docker and does not use the --project parameters.

Outside of a Docker instance, you can do the above but clear with firebase use --clear.

`npx firebase hosting:channel:deploy test --debug`

```
Error: Failed to get Firebase project undefined. Please make sure the project exists and your account has permission to access it.
dereekb@dbMBP firebase-tools-default-issue % npx firebase hosting:channel:deploy test --debug
[2022-05-27T18:53:03.812Z] >>> [apiv2][query] GET https://firebase.googleapis.com/v1beta1/projects/undefined [none]
[2022-05-27T18:53:04.116Z] <<< [apiv2][status] GET https://firebase.googleapis.com/v1beta1/projects/undefined 403
[2022-05-27T18:53:04.117Z] <<< [apiv2][body] GET https://firebase.googleapis.com/v1beta1/projects/undefined {"error":{"code":403,"message":"The caller does not have permission","status":"PERMISSION_DENIED"}}
[2022-05-27T18:53:04.117Z] HTTP Error: 403, The caller does not have permission
[2022-05-27T18:53:04.223Z] FirebaseError: HTTP Error: 403, The caller does not have permission
at module.exports (/Users/dereekb/.nvm/versions/node/v16.13.2/lib/node_modules/firebase-tools/lib/responseToError.js:47:12)
at RetryOperation._fn (/Users/dereekb/.nvm/versions/node/v16.13.2/lib/node_modules/firebase-tools/lib/apiv2.js:286:39)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
```

If I remove "prod" project:

```
{
"projects": {
"default": "dereekb-components"
}
}
```

`npx firebase hosting:channel:deploy test --debug`

```
dereekb@dbMBP firebase-tools-default-issue % npx firebase hosting:channel:deploy test --debug
[2022-05-27T19:02:58.650Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"]
[2022-05-27T19:02:58.651Z] > authorizing via signed-in user (derek@hapiercreative.com)
[2022-05-27T19:02:58.651Z] [iam] checking project dereekb-components for permissions ["firebase.projects.get","firebasehosting.sites.update"]
[2022-05-27T19:02:58.652Z] >>> [apiv2][query] POST https://cloudresourcemanager.googleapis.com/v1/projects/dereekb-components:testIamPermissions [none]
[2022-05-27T19:02:58.652Z] >>> [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/dereekb-components:testIamPermissions {"permissions":["firebase.projects.get","firebasehosting.sites.update"]}
[2022-05-27T19:02:58.823Z] <<< [apiv2][status] POST https://cloudresourcemanager.googleapis.com/v1/projects/dereekb-components:testIamPermissions 200
[2022-05-27T19:02:58.823Z] <<< [apiv2][body] POST https://cloudresourcemanager.googleapis.com/v1/projects/dereekb-components:testIamPermissions {"permissions":["firebase.projects.get","firebasehosting.sites.update"]}
[2022-05-27T19:02:58.824Z] >>> [apiv2][query] GET https://firebase.googleapis.com/v1beta1/projects/dereekb-components [none]
[2022-05-27T19:02:59.049Z] <<< [apiv2][status] GET https://firebase.googleapis.com/v1beta1/projects/dereekb-components 200
[2022-05-27T19:02:59.050Z] <<< [apiv2][body] GET https://firebase.googleapis.com/v1beta1/projects/dereekb-components {"projectId":"dereekb-components","projectNumber":"124286307516","displayName":"dereekb-components","name":"projects/dereekb-components","resources":{"hostingSite":"dereekb-components","realtimeDatabaseInstance":"dereekb-components-default-rtdb","storageBucket":"dereekb-components.appspot.com","locationId":"us-central"},"state":"ACTIVE"}
[2022-05-27T19:02:59.052Z] >>> [apiv2][query] GET https://firebasehosting.googleapis.com/v1beta1/projects/dereekb-components/sites/dereekb-components/channels/test [none]
[2022-05-27T19:02:59.264Z] <<< [apiv2][status] GET https://firebasehosting.googleapis.com/v1beta1/projects/dereekb-components/sites/dereekb-components/channels/test 200
[2022-05-27T19:02:59.264Z] <<< [apiv2][body] GET https://firebasehosting.googleapis.com/v1beta1/projects/dereekb-components/sites/dereekb-components/channels/test {"name":"projects/dereekb-components/sites/dereekb-components/channels/test","url":"https://dereekb-components--test-e8t1ab7i.web.app","createTime":"2022-05-27T18:44:55.672453201Z","updateTime":"2022-05-27T18:44:55.672453201Z","retainedReleaseCount":10,"expireTime":"2022-06-03T18:44:55.672453201Z"}
[2022-05-27T19:02:59.264Z] [hosting] found existing channel for site dereekb-components {"name":"projects/dereekb-components/sites/dereekb-components/channels/test","url":"https://dereekb-components--test-e8t1ab7i.web.app","createTime":"2022-05-27T18:44:55.672453201Z","updateTime":"2022-05-27T18:44:55.672453201Z","retainedReleaseCount":10,"expireTime":"2022-06-03T18:44:55.672453201Z"}
[2022-05-27T19:02:59.265Z] >>> [apiv2][query] PATCH https://firebasehosting.googleapis.com/v1beta1/projects/dereekb-components/sites/dereekb-components/channels/test updateMask=ttl
[2022-05-27T19:02:59.265Z] >>> [apiv2][body] PATCH https://firebasehosting.googleapis.com/v1beta1/projects/dereekb-components/sites/dereekb-components/channels/test {"ttl":"604800s"}
[2022-05-27T19:02:59.507Z] <<< [apiv2][status] PATCH https://firebasehosting.googleapis.com/v1beta1/projects/dereekb-components/sites/dereekb-components/channels/test 200
[2022-05-27T19:02:59.507Z] <<< [apiv2][body] PATCH https://firebasehosting.googleapis.com/v1beta1/projects/dereekb-components/sites/dereekb-components/channels/test {"name":"projects/dereekb-components/sites/dereekb-components/channels/test","url":"https://dereekb-components--test-e8t1ab7i.web.app","createTime":"2022-05-27T18:44:55.672453201Z","updateTime":"2022-05-27T19:02:59.462863149Z","retainedReleaseCount":10,"expireTime":"2022-06-03T19:02:59.462863149Z"}
[2022-05-27T19:02:59.507Z] [hosting] updated TTL for existing channel for site dereekb-components {"name":"projects/dereekb-components/sites/dereekb-components/channels/test","url":"https://dereekb-components--test-e8t1ab7i.web.app","createTime":"2022-05-27T18:44:55.672453201Z","updateTime":"2022-05-27T19:02:59.462863149Z","retainedReleaseCount":10,"expireTime":"2022-06-03T19:02:59.462863149Z"}

=== Deploying to 'dereekb-components'...

i deploying hosting
[2022-05-27T19:02:59.509Z] >>> [apiv2][query] GET https://firebase.googleapis.com/v1beta1/projects/dereekb-components [none]
[2022-05-27T19:02:59.632Z] <<< [apiv2][status] GET https://firebase.googleapis.com/v1beta1/projects/dereekb-components 200
[2022-05-27T19:02:59.632Z] <<< [apiv2][body] GET https://firebase.googleapis.com/v1beta1/projects/dereekb-components {"projectId":"dereekb-components","projectNumber":"124286307516","displayName":"dereekb-components","name":"projects/dereekb-components","resources":{"hostingSite":"dereekb-components","realtimeDatabaseInstance":"dereekb-components-default-rtdb","storageBucket":"dereekb-components.appspot.com","locationId":"us-central"},"state":"ACTIVE"}
[2022-05-27T19:02:59.634Z] >>> [apiv2][query] POST https://firebasehosting.googleapis.com/v1beta1/projects/124286307516/sites/dereekb-components/versions [none]
[2022-05-27T19:02:59.634Z] >>> [apiv2][body] POST https://firebasehosting.googleapis.com/v1beta1/projects/124286307516/sites/dereekb-components/versions {"config":{},"labels":{"deployment-tool":"cli-firebase"}}
^C
dereekb@dbMBP firebase-tools-default-issue %
```

The deploy goes through and uses the default.

### [REQUIRED] Expected behavior

The Firebase CLI will use the `default` project by default, unless default doesn't exist. This would let projects that must strictly define default to use it.

This behavior mainly shows up in Docker containers, where you are opening up fresh contexts where `firebase use` isn't used.

### [REQUIRED] Actual behavior

Previously working CI fails:

https://app.circleci.com/pipelines/github/dereekb/dbx-components/607/workflows/8b52bf87-f0c2-4f24-964a-bf9094d1d558/jobs/1359/parallel-runs/0/steps/0-105

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.