aboutsummaryrefslogtreecommitdiffstats
path: root/DEVNOTES.md
blob: 00b4dddd273f63920c2f0922d74aa773c45d5d24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# Workflow

## References

https://nvie.com/posts/a-successful-git-branching-model/ \
https://learn.microsoft.com/en-us/azure/devops/repos/git/merging-with-squash?view=azure-devops


## Branching

*Based off GitFlow but slightly modified*

- There are two main branches
  - `main` - production-ready code
  - `development` - integration branch for features
  - `staging` - represents the current staging state
- In addition, there are additional branches 
  - Feature branches - for new features and non-urgent bugfixes
  - Hotfix branches - probably won't be used but for critical bugs in production (this is what testing should prevent)
  - Release branches - for preparation of production releases

- Feature branches - e.g. `feature/short-description`
- Bugfix branches - e.g. `bugfix/short-description`
- Hotfix branches - e.g. `hotfix/short-description`
- Release branches - e.g. `release/vX.Y.Z`

### Examples
```
feature/add-data-extractor
bugfix/fix-s3-upload-error
hotfix/security-patch
release/v1.0.0
```

## Environments

1. Development - where active development and initial testing occur
2. Staging - for integration testing and final checks before production
3. Production - live and stable environment

## Deployment

1. `main` - represents the current production state
2. `develop` - represents the integration branch for features and non-urgent fixes
3. `staging` - represents the current staging state

## Staging Flow

1. Create feature branches from `develop` & merge completed features back into `develop`
2. When the `develop` branch is ready for testing, create a `staging` branch from `develop`
3. Deploy the `staging` branch to the staging environment and perform our unit-tests
4. If staging tests pass, create a `release/vX.Y.Z` branch from `staging`
5. Make any final adjustments in the `release/vX.Y.Z` branch
6. Once we have approved the changes in the `release/vX.Y.Z` branch, merge into `main`
7. Tag the release in `main`

### Notes

- No new features should be included in the release branches and any new features should be merged into `develop` for the next release cycle

## Commit Messages

Please follow the conventional commits specification:
  
```
<type>[optional scope]: <description>

<optional body>

[optional footer(s)]
```

### Types
- feat: new features
- fix: bugfixes
- docs: documentation-only changes
- style: changes that do not affect the meaning of the code
- refactor: code changes that neither fix bugs nor adds features
- perf: code changes that improve performance
- test: adding tests or correcting existing tests
- chore: changes to build process or tools/libraries (probably not needed)
- infra: changes to infrastructure configuration (e.g. Terraform)

### Examples
```
feat(extract): add automatic scheduling for data ingestion
docs: update README with project setup instructions
```

Configuration files for things such as Terraform isn't native to Conventional Commits, but we can add our own:

```
infra(tf): update S3 bucket policy
```

If the Terraform change involves a fix, you may combine `fix` and `infra`:

```
fix(infra): ...
```
git.ajschof.me — hosted by ajschofield — powered by cgit