Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automate migrations #134

Merged
merged 19 commits into from
Oct 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 111 additions & 0 deletions .github/workflows/main-migrations.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: Deploy production

on:
pull_request:
types: [closed]

jobs:
apply-main-migrations:
if: ${{ github.event.pull_request.merged == true }}
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Check for changes in migrations folder
id: check_changes
run: |
git fetch origin main

if git diff --quiet HEAD^ HEAD migrations; then
echo "CHANGES=false" >> $GITHUB_ENV
else
echo "CHANGES=true" >> $GITHUB_ENV
fi

- name: Set up Node.js
if: ${{ env.CHANGES == 'true' }}
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Install dependencies
if: ${{ env.CHANGES == 'true' }}
run: npm install --force

- name: Run TypeScript script
if: ${{ env.CHANGES == 'true' }}
env:
DATO_API_KEY_OPENEARTH_RWS_VIEWER: ${{ secrets.DATO_API_KEY_OPENEARTH_RWS_VIEWER }}
DATO_API_KEY_OPENEARTH_DATA_VIEWER: ${{ secrets.DATO_API_KEY_OPENEARTH_DATA_VIEWER }}
DATO_API_KEY_NL2120: ${{ secrets.DATO_API_KEY_NL2120 }}
run: npm run migrations:apply-main

prepare:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Install dependencies
run: npm install --force

- name: Set matrix data
id: set-matrix
run: |
instances=$(node -e 'console.log(JSON.stringify(require("./config/dato/instances.js").instances))')
echo "matrix=$(echo $instances | jq -c '.')" >> $GITHUB_OUTPUT
echo "matrix is set to: $instances"

deploy-application:
needs: prepare
runs-on: ubuntu-latest
strategy:
matrix:
include: ${{ fromJson(needs.prepare.outputs.matrix) }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Install dependencies
run: npm install --force

- name: Build application
run: NODE_OPTIONS="--openssl-legacy-provider" npm run build
env:
DATO_API_KEY_OPENEARTH_RWS_VIEWER: ${{ secrets.DATO_API_KEY_OPENEARTH_RWS_VIEWER }}
DATO_API_KEY_OPENEARTH_DATA_VIEWER: ${{ secrets.DATO_API_KEY_OPENEARTH_DATA_VIEWER }}
DATO_API_KEY_NL2120: ${{ secrets.DATO_API_KEY_NL2120 }}
DATO_INSTANCE_CURRENT: ${{ matrix.name }}
DATO_ENVIRONMENT: main
VUE_APP_MAPBOX_TOKEN: ${{ secrets.VUE_APP_MAPBOX_TOKEN }}
VUE_APP_API_ENDPOINT: ${{ secrets.VUE_APP_API_ENDPOINT }}
VUE_APP_AQUADESK_KEY: ${{ secrets.VUE_APP_AQUADESK_KEY }}
VUE_APP_PIWIK_CONTAINER_ID: ${{ secrets.VUE_APP_PIWIK_CONTAINER_ID }}
VUE_APP_WMR_KEY: ${{ secrets.VUE_APP_WMR_KEY }}
DEEPL_KEY: ${{ secrets.DEEPL_KEY }}

- name: Deploy to Netlify
uses: nwtgck/[email protected]
with:
publish-dir: "./dist"
production-branch: main
github-token: ${{ secrets.GITHUB_TOKEN }}
deploy-message: Production deployment for ${{ matrix.name }}
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ matrix.netlifySiteId }}
112 changes: 112 additions & 0 deletions .github/workflows/staging-migrations.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
name: Deploy staging

on:
pull_request:
types: [opened, synchronize]

jobs:
apply-staging-migrations:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Check for changes in migrations folder
id: check_changes
run: |
git fetch origin main
git fetch origin ${{ github.head_ref || github.ref_name }}
git checkout ${{ github.head_ref || github.ref_name }}

if git diff --quiet origin/main HEAD -- migrations; then
echo "CHANGES=false" >> $GITHUB_ENV
else
echo "CHANGES=true" >> $GITHUB_ENV
fi

- name: Set up Node.js
if: ${{ env.CHANGES == 'true' }}
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Install dependencies
if: ${{ env.CHANGES == 'true' }}
run: npm install --force

- name: Run TypeScript script
if: ${{ env.CHANGES == 'true' }}
env:
DATO_API_KEY_OPENEARTH_RWS_VIEWER: ${{ secrets.DATO_API_KEY_OPENEARTH_RWS_VIEWER }}
DATO_API_KEY_OPENEARTH_DATA_VIEWER: ${{ secrets.DATO_API_KEY_OPENEARTH_DATA_VIEWER }}
DATO_API_KEY_NL2120: ${{ secrets.DATO_API_KEY_NL2120 }}
run: npm run migrations:apply-staging

prepare:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Install dependencies
run: npm install --force

- name: Set matrix data
id: set-matrix
run: |
instances=$(node -e 'console.log(JSON.stringify(require("./config/dato/instances.js").instances))')
echo "matrix=$(echo $instances | jq -c '.')" >> $GITHUB_OUTPUT
echo "matrix is set to: $instances"

deploy-application:
needs: prepare
runs-on: ubuntu-latest
strategy:
matrix:
include: ${{ fromJson(needs.prepare.outputs.matrix) }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "20"

- name: Install dependencies
run: npm install --force

- name: Build application
run: NODE_OPTIONS="--openssl-legacy-provider" npm run build
env:
DATO_API_KEY_OPENEARTH_RWS_VIEWER: ${{ secrets.DATO_API_KEY_OPENEARTH_RWS_VIEWER }}
DATO_API_KEY_OPENEARTH_DATA_VIEWER: ${{ secrets.DATO_API_KEY_OPENEARTH_DATA_VIEWER }}
DATO_API_KEY_NL2120: ${{ secrets.DATO_API_KEY_NL2120 }}
DATO_INSTANCE_CURRENT: ${{ matrix.name }}
DATO_ENVIRONMENT: staging
VUE_APP_MAPBOX_TOKEN: ${{ secrets.VUE_APP_MAPBOX_TOKEN }}
VUE_APP_API_ENDPOINT: ${{ secrets.VUE_APP_API_ENDPOINT }}
VUE_APP_AQUADESK_KEY: ${{ secrets.VUE_APP_AQUADESK_KEY }}
VUE_APP_PIWIK_CONTAINER_ID: ${{ secrets.VUE_APP_PIWIK_CONTAINER_ID }}
VUE_APP_WMR_KEY: ${{ secrets.VUE_APP_WMR_KEY }}
DEEPL_KEY: ${{ secrets.DEEPL_KEY }}

- name: Deploy to Netlify
uses: nwtgck/[email protected]
with:
publish-dir: "./dist"
production-branch: main
github-token: ${{ secrets.GITHUB_TOKEN }}
deploy-message: Preview deployment for ${{ matrix.name }}
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ matrix.netlifySiteId }}
2 changes: 1 addition & 1 deletion config/dato/datocms.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ if (!currentInstance) {
throw new Error("No current instance found");
}

const token = currentInstance.key;
const token = currentInstance.datoApiKey;

const endpoint =
process.env.NODE_ENV === 'production'
Expand Down
3 changes: 2 additions & 1 deletion config/dato/instances.d.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export const instances: Array<{
name: string;
key: string;
datoApiKey: string;
netlifySiteId: string;
}>;
9 changes: 6 additions & 3 deletions config/dato/instances.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,17 @@ dotenv.config();
module.exports.instances = [
{
name: "nl2120",
key: process.env.DATO_API_KEY_NL2120,
datoApiKey: process.env.DATO_API_KEY_NL2120,
netlifySiteId: "1f6372f6-c532-4e0e-bba7-dee08678d518",
},
{
name: "openearth-data-viewer",
key: process.env.DATO_API_KEY_OPENEARTH_DATA_VIEWER,
datoApiKey: process.env.DATO_API_KEY_OPENEARTH_DATA_VIEWER,
netlifySiteId: "1785f3f6-b4cf-42de-bea6-b57d48a5c664",
},
{
name: "openearth-rws-viewer",
key: process.env.DATO_API_KEY_OPENEARTH_RWS_VIEWER,
datoApiKey: process.env.DATO_API_KEY_OPENEARTH_RWS_VIEWER,
netlifySiteId: "119b8ff3-5b22-4995-b43b-b31f21ba77c3",
},
];
17 changes: 17 additions & 0 deletions migrations/1727855666_test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Client } from "@datocms/cli/lib/cma-client-node";

export default async function (client: Client): Promise<void> {
const articleModel = await client.itemTypes.create({
name: "Article",
api_key: "article",
});

await client.fields.create(articleModel, {
label: "Title",
api_key: "title",
field_type: "string",
validators: {
required: {},
},
});
}
6 changes: 5 additions & 1 deletion scripts/dato/apply-main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ async function main() {
for (const instance of instances) {
console.log(`Managing environments for ${instance.name}`);

const client = new DatoClient(instance.key);
const client = new DatoClient(instance.datoApiKey);

await client.runCommand(["maintenance:on"]);

const existingEnvironments = await client.listEnvironments();

Expand All @@ -28,6 +30,8 @@ async function main() {
await client.destroyEnvironment("main");

await client.runCommand(["environments:rename", "staging", "main"]);

await client.runCommand(["maintenance:off"]);
}
}

Expand Down
4 changes: 2 additions & 2 deletions scripts/dato/apply-staging.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { DatoClient } from "./utils.js";
import { DatoClient } from "./utils";

async function main() {
const { instances } = await import("../../config/dato/instances.js");

for (const instance of instances) {
console.log(`Setting up staging environment for ${instance.name}`);

const client = new DatoClient(instance.key);
const client = new DatoClient(instance.datoApiKey);

const existingEnvironments = await client.listEnvironments();

Expand Down
2 changes: 1 addition & 1 deletion scripts/dato/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ if (!currentInstance) {
throw new Error("No current instance found");
}

const apiKey = currentInstance.key;
const apiKey = currentInstance.datoApiKey;
const client = new DatoClient(apiKey);

const promptGet = promisify(prompt.get);
Expand Down
Loading