- Node with NPM
- Postgres DB
- Kubernetes with docker images for orchestration
- Atlassian services
- Bitbucket
- Jira
- Confluence
- Bamboo
-
- Version control
- Git on Bitbucket
- Clear branching and commit strategy
- **Cactus model. Feature branches -> master. master is dev. tag for test and/or prod
- Sane defaults
- master is dev, no production creds in code
- Hygeine for code and version control
- keep commit messages informative, keep removing old branches
- Version control
-
- Package managers
- npm for JS
- docker for containers
- kubernetes for infra
- Package managers
-
- Service drivers or providers isolated for configurability / injection
- kubernetes helps
- Wrap and/or abstract environment/driver specific stuff so a configuration change can do it
- kubernetes with configmaps and secrets
- Service drivers or providers isolated for configurability / injection
-
- Config should be provisioned by environment so that configuration leads to automatic flexibility and hot swapping of configurable elements.
- kubernetes
- Config should be provisioned by environment so that configuration leads to automatic flexibility and hot swapping of configurable elements.
-
- Transformation of code, dependencies, assets and configuration into a runnable package within an environment
- npm + bamboo
- Easily testable (preferrably automatically tested)
- mocha tests + gwen-web later
- Indempotent, safe, logged, verbose processes.
- bamboo plans
- Transformation of code, dependencies, assets and configuration into a runnable package within an environment
-
- Code should be written clearly so that it can self document
- Comments should be employed when code is necessarily unclear
- Project management methodology should create a documentation artifact that can provide context and connections between actions, events and assets.
- jira + bitbucket + confluence
- README.md should be all a developer needs to read to get from checking out from version control to running a development version locally (with passing tests)
- a-yup
- How-to's and onboarding information should be easily accessible and outlined.
- confluence
- A decision register should be kept to outline decisions made throughout the software's life, why they were made, by whom (possibly) and against what alternatives
- confluence
- A technical debt register should be kept to outline trade-offs made, mistakes identified, possible improvements identified, incoming refactors etc.
- confluence
- Opportunistic use of context-providing links eg Jira codes in commit message; leave breadcrumbs wherever you can.
- thank u atlassian
- Relevant information and non-functional artifacts should be managed and accessible eg. Confluence
- ^^^
-
- Sanity checks for checking dependencies / assumed things like folder structure, specific files, dumb stuff not obviously required.
- mocha and kubernetes
- Unit testing
- mocha
- Integration testing for required Services with mockable or memoized inputs
- mocha and koob
- End-to-end testing - test the software with connected services as a whole.
- DUNNO
- User testing - test as an agent utilizing the software.
- gwen-web
- Verification testing - after events such as releases or environment changes re-run all tests and treat it like a first release.
- necessarily manual
- Sanity checks for checking dependencies / assumed things like folder structure, specific files, dumb stuff not obviously required.
-
- Start, Stop, Restart, Status of application.
- npm, bamboo, kubernetes
- Process managers for crash recovery
- kubernetes
- Profiling and watchdog processes for real-time information on status and resource usage.
- kubernetes
- Start, Stop, Restart, Status of application.
-
- Required Services such as configuration can be provisioned by environments
- kubernetes configmaps and secrets
- No code changes should be required for moving from one evironment to another
- this is why kubernetes is the industry standard god damn
- Staged environments should be as close to equivalent as possible
- just another koob cluster baby
- Environments should be entirely isolated from eachother, if they are not then they should be considered a single logical environment
- just anoter kloobster
- Environments are a major source of erosion, so resource usage and environmental side effects should be monitored and constrained.
- kloobs provide many opportunities for this also
- Required Services such as configuration can be provisioned by environments
-
- At some time everything that the application does or has happen to it will be of interest to someone.
- DUNNO YET
- but kubernetes cluster-level logging with persistent storage is a start
- Future business logic will want to work on arbitrary past data.
- Immutable data + Events + Event Handlers as Mutators = Time Travelling Logic
- Keep a master event log if possible. Forever.
- At some time everything that the application does or has happen to it will be of interest to someone.
-
- At all times the resource usage of the application should be known as well as the history of that usage.
- k o o b
- At all times the resource usage of the application should be known as well as the history of that usage.
-
Administrative and Tertiary Processes
- Interval based reports or sporadically required tasks should be in code somehow, documented and configurable to the standard of the application.
- stateful workloads in kubernetes and/or bamboo plans
- If not in code these processes should be defined and documented in a way such that any layperson can do it with the right access.
- bamboo plans are real easy to click on
- Data imports and exports
- Arbitrary reports on anything at all.
- Auditing
- koob gives many datapoints
- Erasing and locking down things if required
- koob encapsulates everything so this is possible
- Interval based reports or sporadically required tasks should be in code somehow, documented and configurable to the standard of the application.
-
Continuous Integration / Continuous Deployment
- In conclusion: Commit -> Build -> Test -> Deploy -> Run -> Log / Profile / Administer -> Nice. Or any subset or superset of that flow.
- COMMIT - bitbucket*
- BUILD - bamboo*
- TEST - bamboo with mocha + gwen-web + manual*
- DEPLOY - bamboo + kubernetes*
- RUN - kubernetes*
- LOG - kubernetes + internal logging*
- PROFILE - kubernetes*
- ADMINISTER - bamboo + kubernetes*
- NICE - yeah it is*
- In conclusion: Commit -> Build -> Test -> Deploy -> Run -> Log / Profile / Administer -> Nice. Or any subset or superset of that flow.
-
- Maintenance such as patches, upgrades, breaking changes to dependencies
- DUNNO BUT ALMOST
- The application should communicate somehow any foreseen problems occurring
- koob helps but DUNNO
- There should be some strategy or policy on how to manage required resources over time - up and down.
- koob does this so much and so hard
-
- Every line of code, every dependency, every service, every environment, every configuration, every Event, every generated log, all data, all processes, all communications, all side-channels must be maintainable, patchable, auditable and assumed to be under constant opportunistic attack
- Obscurity is not security
- The application will be exploited and broken so there must be a strategy for identifying, managing, understanding and cleaning-up after a breach.
- i dunno security is hard
- hopefully the security team can bang on our shit forever