@abgov/nx-oc 12.5.0 → 12.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +144 -9
- package/package.json +1 -1
- package/src/generators/deployment/deployment.js +2 -1
- package/src/generators/deployment/deployment.js.map +1 -1
- package/src/generators/deployment/deployment.spec.ts +58 -0
- package/src/generators/deployment/node-files/__projectName__.yml__tmpl__ +30 -0
- package/src/generators/deployment/schema.d.ts +2 -0
- package/src/generators/deployment/schema.json +5 -0
package/README.md
CHANGED
|
@@ -1,13 +1,148 @@
|
|
|
1
|
-
#
|
|
2
|
-
This is the Government of Alberta - Nx plugin for OpenShift.
|
|
1
|
+
# @abgov/nx-oc
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
Nx plugin for generating and applying OpenShift manifests for Government of Alberta applications.
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
The plugin provides generators for CI/CD pipeline setup and per-application deployment configuration, and an executor for running `oc apply` against an OpenShift cluster.
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
2. Install plugin: `npm i -D @abgov/nx-oc`
|
|
10
|
-
3. Login to OpenShift: `oc login {url} --token={token}`
|
|
11
|
-
4. Generate basic infrastructure yml and apply it: `npx nx g @abgov/nx-oc:pipeline`
|
|
12
|
-
5. Set up OpenShift yml on apps using `npx nx g @abgov/nx-oc:deployment`
|
|
7
|
+
## Prerequisites
|
|
13
8
|
|
|
9
|
+
- [OpenShift CLI (`oc`)](https://docs.openshift.com/container-platform/latest/cli_reference/openshift_cli/getting-started-cli.html) installed and on `PATH`
|
|
10
|
+
- An active OpenShift login: `oc login <url> --token=<token>`
|
|
11
|
+
- Separate OpenShift projects provisioned for build infrastructure and each runtime environment (dev, test, prod)
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm i -D @abgov/nx-oc
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# 1. Create workspace and install plugin
|
|
23
|
+
npx create-nx-workspace my-workspace
|
|
24
|
+
npm i -D @abgov/nx-oc
|
|
25
|
+
|
|
26
|
+
# 2. Login to OpenShift
|
|
27
|
+
oc login <url> --token=<token>
|
|
28
|
+
|
|
29
|
+
# 3. Generate pipeline infrastructure manifests
|
|
30
|
+
npx nx g @abgov/nx-oc:pipeline my-pipeline \
|
|
31
|
+
--infra my-infra-project \
|
|
32
|
+
--envs "my-dev my-test my-prod" \
|
|
33
|
+
--registry ghcr.io/my-org
|
|
34
|
+
|
|
35
|
+
# 4. Apply the generated infrastructure manifests to the cluster
|
|
36
|
+
npx nx g @abgov/nx-oc:apply-infra
|
|
37
|
+
|
|
38
|
+
# 5. Add deployment manifests to each application
|
|
39
|
+
npx nx g @abgov/nx-oc:deployment my-app --appType node --env dev
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Generators
|
|
43
|
+
|
|
44
|
+
### `pipeline`
|
|
45
|
+
|
|
46
|
+
Generates OpenShift manifests for a CI/CD pipeline, including shared build infrastructure resources used across all environments.
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npx nx g @abgov/nx-oc:pipeline my-pipeline \
|
|
50
|
+
--infra my-infra-project \
|
|
51
|
+
--envs "my-dev my-test my-prod" \
|
|
52
|
+
--registry ghcr.io/my-org \
|
|
53
|
+
--type actions
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
| Option | Alias | Required | Description |
|
|
57
|
+
|--------|-------|----------|-------------|
|
|
58
|
+
| `pipeline` | — | Yes | Name of the OpenShift pipeline |
|
|
59
|
+
| `infra` | `-i` | Yes | OpenShift project name used for build infrastructure |
|
|
60
|
+
| `envs` | `-e` | Yes | Space-separated names of the OpenShift environment projects (e.g., `"my-dev my-test my-prod"`) |
|
|
61
|
+
| `registry` | `-r` | Yes | Container registry to publish images to (e.g., `ghcr.io/my-org`) |
|
|
62
|
+
| `type` | `-t` | No | Pipeline type: `actions` (default) or `jenkins` |
|
|
63
|
+
| `apply` | `-a` | No | Apply the generated manifests to OpenShift immediately after generation |
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
### `apply-infra`
|
|
68
|
+
|
|
69
|
+
Applies the OpenShift infrastructure manifests that were generated by `pipeline`. Takes no options — reads the generated pipeline configuration from the workspace.
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npx nx g @abgov/nx-oc:apply-infra
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Use `apply-infra` as a follow-up to `pipeline` when you want to defer cluster provisioning, or as a re-apply step after editing the generated manifests.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
### `deployment`
|
|
80
|
+
|
|
81
|
+
Adds OpenShift deployment manifests (Deployment, Service, Route, etc.) to an existing Nx project for a specific environment.
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
npx nx g @abgov/nx-oc:deployment my-app --appType node --env dev
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
| Option | Alias | Required | Description |
|
|
88
|
+
|--------|-------|----------|-------------|
|
|
89
|
+
| `project` | — | Yes | Name of the existing Nx project to add deployment manifests to |
|
|
90
|
+
| `appType` | `-t` | Yes | Application type: `frontend`, `dotnet`, or `node` |
|
|
91
|
+
| `env` | `-e` | Yes | ADSP environment: `dev`, `test`, or `prod` |
|
|
92
|
+
| `accessToken` | `-at` | No | Access token for non-interactive retrieval of ADSP configuration |
|
|
93
|
+
|
|
94
|
+
Run the generator once per environment per application. For a typical three-environment setup, run it three times with `--env dev`, `--env test`, and `--env prod`.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Executor: `apply`
|
|
99
|
+
|
|
100
|
+
Runs `oc apply` to deploy an application's OpenShift manifests. Configure it as a target in the project's `project.json`:
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{
|
|
104
|
+
"targets": {
|
|
105
|
+
"deploy": {
|
|
106
|
+
"executor": "@abgov/nx-oc:apply",
|
|
107
|
+
"options": {
|
|
108
|
+
"ocProject": "my-dev-project"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Then run:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npx nx run my-app:deploy
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Options
|
|
122
|
+
|
|
123
|
+
| Option | Required | Description |
|
|
124
|
+
|--------|----------|-------------|
|
|
125
|
+
| `ocProject` | Yes | OpenShift project(s) to apply manifests to |
|
|
126
|
+
|
|
127
|
+
`ocProject` accepts three forms:
|
|
128
|
+
|
|
129
|
+
```json
|
|
130
|
+
// Single project
|
|
131
|
+
{ "ocProject": "my-dev" }
|
|
132
|
+
|
|
133
|
+
// Multiple projects
|
|
134
|
+
{ "ocProject": ["my-dev", "my-test"] }
|
|
135
|
+
|
|
136
|
+
// Tagged deployments
|
|
137
|
+
{ "ocProject": [{ "project": "my-dev", "tag": "v1.2.3" }] }
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Typical workflow
|
|
143
|
+
|
|
144
|
+
1. Run `pipeline` once per workspace to generate shared build infrastructure manifests.
|
|
145
|
+
2. Run `apply-infra` (or pass `--apply` to `pipeline`) to provision the resources on the cluster.
|
|
146
|
+
3. Run `deployment` for each application and environment combination.
|
|
147
|
+
4. Add an `apply` executor target to each application's `project.json`.
|
|
148
|
+
5. In your GitHub Actions or Jenkins pipeline, call `npx nx run my-app:deploy` to apply manifests during CI/CD.
|
package/package.json
CHANGED
|
@@ -50,7 +50,8 @@ function normalizeOptions(host, options) {
|
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
52
|
function addFiles(host, options) {
|
|
53
|
-
|
|
53
|
+
var _a;
|
|
54
|
+
const templateOptions = Object.assign(Object.assign(Object.assign({}, options), options.adsp), { sourceRepositoryUrl: (0, git_utils_1.getGitRemoteUrl)(), database: (_a = options.database) !== null && _a !== void 0 ? _a : 'none', tmpl: '' });
|
|
54
55
|
(0, devkit_1.generateFiles)(host, path.join(__dirname, `${options.appType}-files`), `./.openshift/${options.projectName}`, templateOptions);
|
|
55
56
|
}
|
|
56
57
|
function default_1(host, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../../../../../packages/nx-oc/src/generators/deployment/deployment.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../../../../../packages/nx-oc/src/generators/deployment/deployment.ts"],"names":[],"mappings":"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"}
|
|
@@ -180,6 +180,64 @@ describe('Deployment Generator', () => {
|
|
|
180
180
|
expect(dockerfile).toContain('dotnet');
|
|
181
181
|
});
|
|
182
182
|
|
|
183
|
+
it('includes DATABASE_URL secretKeyRef and init container for postgres node deployment', async () => {
|
|
184
|
+
const host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
|
185
|
+
await pipeline(host, {
|
|
186
|
+
pipeline: 'test',
|
|
187
|
+
registry: 'ghcr.io/test-org',
|
|
188
|
+
type: 'jenkins',
|
|
189
|
+
infra: 'test-infra',
|
|
190
|
+
envs: 'test-dev',
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
addProjectConfiguration(host, 'test', {
|
|
194
|
+
root: 'apps/test',
|
|
195
|
+
projectType: 'application',
|
|
196
|
+
targets: {
|
|
197
|
+
build: {
|
|
198
|
+
executor: '@nx/webpack:webpack',
|
|
199
|
+
options: { compiler: 'tsc', target: 'node' },
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
await generator(host, { ...options, appType: 'node', database: 'postgres' });
|
|
205
|
+
|
|
206
|
+
const manifest = host.read('.openshift/test/test.yml').toString();
|
|
207
|
+
expect(manifest).toContain('DATABASE_URL');
|
|
208
|
+
expect(manifest).toContain('initContainers');
|
|
209
|
+
expect(manifest).toContain('prisma');
|
|
210
|
+
expect(manifest).toContain('migrate');
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('includes MONGODB_URI secretKeyRef without init container for mongo node deployment', async () => {
|
|
214
|
+
const host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
|
215
|
+
await pipeline(host, {
|
|
216
|
+
pipeline: 'test',
|
|
217
|
+
registry: 'ghcr.io/test-org',
|
|
218
|
+
type: 'jenkins',
|
|
219
|
+
infra: 'test-infra',
|
|
220
|
+
envs: 'test-dev',
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
addProjectConfiguration(host, 'test', {
|
|
224
|
+
root: 'apps/test',
|
|
225
|
+
projectType: 'application',
|
|
226
|
+
targets: {
|
|
227
|
+
build: {
|
|
228
|
+
executor: '@nx/webpack:webpack',
|
|
229
|
+
options: { compiler: 'tsc', target: 'node' },
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
await generator(host, { ...options, appType: 'node', database: 'mongo' });
|
|
235
|
+
|
|
236
|
+
const manifest = host.read('.openshift/test/test.yml').toString();
|
|
237
|
+
expect(manifest).toContain('MONGODB_URI');
|
|
238
|
+
expect(manifest).not.toContain('initContainers');
|
|
239
|
+
});
|
|
240
|
+
|
|
183
241
|
it('can skip unknown project type', async () => {
|
|
184
242
|
const host = createTreeWithEmptyWorkspace({ layout: 'apps-libs' });
|
|
185
243
|
await pipeline(host, {
|
|
@@ -75,6 +75,21 @@ objects:
|
|
|
75
75
|
labels:
|
|
76
76
|
name: ${APP_NAME}
|
|
77
77
|
spec:
|
|
78
|
+
<% if (database === 'postgres') { %>
|
|
79
|
+
initContainers:
|
|
80
|
+
- name: ${APP_NAME}-migrate
|
|
81
|
+
image: image-registry.openshift-image-registry.svc:5000/${INFRA_PROJECT}/${APP_NAME}:${DEPLOY_TAG}
|
|
82
|
+
command: ["npx", "prisma", "migrate", "deploy"]
|
|
83
|
+
envFrom:
|
|
84
|
+
- configMapRef:
|
|
85
|
+
name: ${APP_NAME}
|
|
86
|
+
env:
|
|
87
|
+
- name: DATABASE_URL
|
|
88
|
+
valueFrom:
|
|
89
|
+
secretKeyRef:
|
|
90
|
+
name: ${APP_NAME}-database
|
|
91
|
+
key: DATABASE_URL
|
|
92
|
+
<% } %>
|
|
78
93
|
containers:
|
|
79
94
|
- name: ${APP_NAME}
|
|
80
95
|
image: ${APP_NAME}:${DEPLOY_TAG}
|
|
@@ -86,6 +101,21 @@ objects:
|
|
|
86
101
|
value: '3333'
|
|
87
102
|
- name: LOG_LEVEL
|
|
88
103
|
value: info
|
|
104
|
+
<% if (database === 'postgres') { %>
|
|
105
|
+
# Set via: oc create secret generic ${APP_NAME}-database --from-literal=DATABASE_URL=<connection-string>
|
|
106
|
+
- name: DATABASE_URL
|
|
107
|
+
valueFrom:
|
|
108
|
+
secretKeyRef:
|
|
109
|
+
name: ${APP_NAME}-database
|
|
110
|
+
key: DATABASE_URL
|
|
111
|
+
<% } else if (database === 'mongo') { %>
|
|
112
|
+
# Set via: oc create secret generic ${APP_NAME}-database --from-literal=MONGODB_URI=<connection-string>
|
|
113
|
+
- name: MONGODB_URI
|
|
114
|
+
valueFrom:
|
|
115
|
+
secretKeyRef:
|
|
116
|
+
name: ${APP_NAME}-database
|
|
117
|
+
key: MONGODB_URI
|
|
118
|
+
<% } %>
|
|
89
119
|
imagePullPolicy: IfNotPresent
|
|
90
120
|
ports:
|
|
91
121
|
- containerPort: 3333
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AdspConfiguration } from '../../adsp';
|
|
2
2
|
|
|
3
3
|
export type ApplicationType = 'node' | 'dotnet' | 'frontend';
|
|
4
|
+
export type DatabaseType = 'none' | 'postgres' | 'mongo';
|
|
4
5
|
|
|
5
6
|
export interface Schema {
|
|
6
7
|
project: string;
|
|
@@ -8,6 +9,7 @@ export interface Schema {
|
|
|
8
9
|
env: EnvironmentName;
|
|
9
10
|
adsp?: AdspConfiguration;
|
|
10
11
|
accessToken?: string;
|
|
12
|
+
database?: DatabaseType;
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
export interface NormalizedSchema extends Schema {
|
|
@@ -53,6 +53,11 @@
|
|
|
53
53
|
"type": "string",
|
|
54
54
|
"description": "Access token for retrieving configuration from ADSP APIs.",
|
|
55
55
|
"alias": "at"
|
|
56
|
+
},
|
|
57
|
+
"database": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"description": "Database type used by the service. When set, the deployment manifest references the appropriate Secret.",
|
|
60
|
+
"enum": ["none", "postgres", "mongo"]
|
|
56
61
|
}
|
|
57
62
|
},
|
|
58
63
|
"required": [
|