-
Kubernetes secrets to a dotenv (.env) file
For dumb reasons, I recently needed to be able to quickly setup a local environment with secrets loaded from a kubernetes instance. After manually copying/pasting/decoding a few times, I decided to write a quick script to do it for me.
The following script grabs a kubernetes secrets file (
${SECRET}) from kube, decodes each key/value pair and then appends them to a.envfile.Prerequisites: jq, kubectl
# base64 decode secrets file ${SECRET} and add each key=value pair to .env file for s in $(kubectl get secret ${SECRET} -o json | jq -r ".data" | jq -r "to_entries|map(\"\(.key)=\(.value | @base64d)\")|.[]" ); do echo $s >> .env doneThe above script invokes
jqtwice, which was a quick and dirty workaround to get it working under alpine’s ash, in addition to bash. -
Typescript migration headaches
I had the pleasure of migrating an existing codebase from straight nodejs to Typescript. Here’s a few of the headaches/gotchas I ran into.
Extending from Error breaks things
The following custom error class resulted in an error complaining about
instanceof:class ApiError extends Error { constructor(message: string) { this.name = 'ApiError'; } }Microsoft explain the issue and point out a simple fix in their Breaking Changes list
Mocha not picking up sub directories with –recursive
With a test structure like:
test/controllers/book.spec.ts test/middleware/log.spec.ts test/app.spec.tsrunning
mocha --recursive test/**/*.spec.tswill only see mocha pickup tests inapp.spec.ts, despite the--recursiveoption being set.As ScottFreeCode points out the solution is to quote the glob to avoid having the shell interpret the **.
Eg.
mocha --recursive "test/**/*.spec.ts"Typescript compiler will not touch non-ts/js files
There’s no built in mechanism to have the compiler copy non-typescript/javascript files, such as
.jsonschemas to thedistdirectory. This instead needs to be done separately.With only a few files to copy I ended up creating a simple bin script to copy the files before running
tsc.Sequelize unexpected token in map file error
A fairly common pattern to follow when using Sequelize is to load all model files defined in a particular directory, with code like:
fs.readdirSync('models/').forEach((filename) => { ... load model models[model] = model; });This works fine with javascript, but will cause a runtime
Unexpected tokenwith Typescript when map file generation is turned on. Any code loading files should be modified to explicitly check the extension. In this case, we want to exclude any*.map.jsfiles from being loaded.More details can be found on this TypeScript github issue.
Cannot redeclare block-scoped variable
With a codebase split up amongst a number of files, Typescript instantly complained about
Cannot redeclare block-scoped variablewhenever attempting to load a local file.The solution is to ensure each file exported every function/variable used in other files.
export function doSomething() { ... } export function doSomethingElse() { ... } module.exports = { doSomething, doSomethingElse}; -
Run Rails tests on Gitlab CI with a Postgres database
Gitlab CI can be used to run rails tests on every push. It’s pretty straight forward to setup.
First create a
.gitlab-ci.ymlfile:image: ruby:2.3 services: - postgres:latest variables: POSTGRES_DB: dbname # set database POSTGRES_USER: username # set username POSTGRES_PASSWORD: "" before_script: - apt-get update -qy - apt-get install -y nodejs - bundle install --path /cache # run tests test: script: - cp config/database-gitlab.yml config/database.yml - bundle exec rake db:create RAILS_ENV=test - bundle exec rake testThe
before_scriptinstalls everything we need to run the tests.testjob creates the database and executes the tests.Next, create a gitlab specific database config
config/database-gitlab.ymlto connect to the database setup earlier.test: adapter: postgresql pool: 5 timeout: 5000 host: postgres database: dbname # set database user: username # set usernameNow the tests will be run on each push!
- Older posts Newer posts