Intro
Here's a second round of random issues and quick tips for working around them. Part one is here.
The issues:
Firebase app GitHub Actions deploy failing (IAM_PERMISSION_DENIED)
I've added a feature that used Firebase Cloud Storage bucket. It all worked well on emulator but when I wanted to deploy it to test environment through GitHub Actions, the job failed with such error:
Error: Request to https://firebasestorage.googleapis.com/v1alpha/projects/example-project/defaultBucket had HTTP Error: 403, Permission 'firebasestorage.defaultBucket.get' denied on resource '//firebasestorage.googleapis.com/projects/example-project/defaultBucket' (or it may not exist).
"details": [
***
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "IAM_PERMISSION_DENIED",
"domain": "firebasestorage.googleapis.com",
"metadata": ***
"resource": "projects/example-project/defaultBucket",
"permission": "firebasestorage.defaultBucket.get"
***
***
]
It happened because GitHub Action was using a service account which lacked firebasestorage.defaultBucket.get permission. The permission is listed under roles/firebasestorage.viewer, so such role should be added to the service account.
You can see your project's service accounts in Project settings / Service account page in Firebase console and manage it on GCP IAM & Admin / IAM page (IAM stands for Identity and Access Management). My project uses Tarraform and Terragrunt so after adding the role through GCP console (for a quick test) I had to add it to .tf file and run terragrunt apply to modify all the environments...
SignatureDoesNotMatch error while fetching file from a bucket
I was fetching a file with unusual file extension in React app (in-house DSL that programs clinical trial questionnaires). To work correctly it needed to be recognized as text/plain MIME type instead of the default application/octet-stream. When the file was loaded from Firebase hosting, I could set 'Content-Type': 'text/plain' header while fetching. When I've tired to do the same after switching to Firestore bucket, an 403 error with SignatureDoesNotMatch in response stated to appear.
The signature feature didn't like the fetch header setting, but it was possible to go without it by setting the Content-Type property in the uploaded file metadata. To edit the metadata you can go to GCP storage browser and use Storage bucket details -> Edit metadata menu.
BTW: You might face another issue while working with cloud storage: your newly uploaded file will be reachable when opening file link in browser or by doing a GET in curl but it might fail with fetch due to lack of CORS settings. If you get this issue look here or search how to use gsutil cors set cors.json gs://your-bucket-name command.
No level config per handler in @datadog/browser-logs
Datadog has a pretty neat feature that allows sending logs from browser to Datadog servers (including automatic reporting of unhandled errors and rejected promises). You might want to use the http handler that sends data over network (debounced) and the console handler that forwards entries to browser's console. You can set the log level (e.g. info vs debug), but the issue is that you cannot configure different level for each handler. That's a bummer, it would be cool to use info level for logs sent over network but still see the debug logs in console...
Fortunately there is a simple workaround. The datadogLogs has beforeSend callback and you can use it to filter out debug entries:
datadogLogs.init({
// More init props here
beforeSend: logsEvent => {
return logsEvent.status !== 'debug';
},
});
const logger = datadogLogs.createLogger('example-logger', {
level: 'debug',
handler: ['http', 'console'],
});
Grep skipping hidden files (fzf-lua+ripgrep in Neovim)
I like ripgrep and fzf a lot! These are great not only as standalone command line tools, but can also be combined to provide awesome search experience in Vim/Neovim. For Vim there's a fzf.vim plugin and for Neovim I can recommend se fzf-lua.
I often use life_grep command for quick regexp search of the codebase (which can later be fine tuned by fuzzy search of files that contain a match). I have this mapping:
vim.keymap.set('n', '<leader>sg', ':FzfLua live_grep<CR>', { desc = '[s]earch live [g]rep' })
I used to have such config for the fzf-lua plugin:
require('fzf-lua').setup { 'max-perf' }
but there was an issue: grepping would skip hidden files and directories (.env files, .github folder etc.). I think it's much safer and useful to check the hidden files too, so now I'm using such config:
require('fzf-lua').setup {
'max-perf',
grep = {
rg_opts = "--hidden --glob '!.git/' --color=never --no-heading --column -n --smart-case",
},
}
With the above, live_grep still avoids scanning the .git folder, and node_modules are still skipped due to ripgrep's sensible defaults but I won't miss occurrences in hidden files.
There's a simpler option, if you don't care about .git being included in search too:
require('fzf-lua').setup {
'max-perf',
grep = {
hidden = true,
},
}