Skip to content

Commit 1dfb3b6

Browse files
committed
ci: add script and workflow to release packages
1 parent e712d22 commit 1dfb3b6

File tree

4 files changed

+180
-0
lines changed

4 files changed

+180
-0
lines changed

.github/workflows/packages.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: Update workshop packages
2+
on:
3+
push:
4+
branches:
5+
- main
6+
7+
jobs:
8+
update_packages:
9+
name: Update
10+
runs-on: ubuntu-latest
11+
permissions:
12+
contents: write
13+
steps:
14+
- name: Checkout
15+
uses: actions/checkout@v3
16+
- name: Create packages
17+
run: ./scripts/create-packages.sh
18+
- name: Update release
19+
uses: ncipollo/release-action@v1.12.0
20+
with:
21+
name: Workshop packages
22+
tag: latest
23+
artifacts: "dist/*.tar.gz"
24+
allowUpdates: true

.github/workflows/template.yml

Whitespace-only changes.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# compiled output
22
node_modules/
3+
dist/
34

45
# Logs
56
logs

scripts/create-packages.sh

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
#!/usr/bin/env bash
2+
##############################################################################
3+
# Usage: ./create-packages.sh
4+
# Creates packages for skippable sections of the workshop
5+
##############################################################################
6+
7+
set -euo pipefail
8+
cd "$(dirname "${BASH_SOURCE[0]}")/.."
9+
10+
target_folder=dist
11+
12+
rm -rf "$target_folder"
13+
mkdir -p "$target_folder"
14+
15+
copyFolder() {
16+
local src="$1"
17+
find "$src" -type d -not -path '*node_modules*' -exec mkdir -p '{}' "$target_folder/{}" ';'
18+
find "$src" -type f -not -path '*node_modules*' -exec cp -r '{}' "$target_folder/{}" ';'
19+
}
20+
21+
makeArchive() {
22+
local src="$1"
23+
local name="${2:-$src}"
24+
local archive="$name.tar.gz"
25+
echo "Creating $archive..."
26+
tar -czvf "$target_folder/$archive" "$target_folder/$src"
27+
rm -rf "$target_folder/${src:?}"
28+
}
29+
30+
##############################################################################
31+
# Settings API, without database implementation
32+
##############################################################################
33+
34+
echo "Creating settings-api package..."
35+
copyFolder packages/settings-api
36+
perl -i -pe "s/^.*azure\/cosmos.*$//" "$target_folder/packages/settings-api/package.json"
37+
38+
echo -e "import fp from 'fastify-plugin'
39+
40+
// the use of fastify-plugin is required to be able
41+
// to export the decorators to the outer scope
42+
43+
export default fp(async function (fastify, opts) {
44+
fastify.decorate('db', new MockDatabase());
45+
});
46+
47+
class MockDatabase {
48+
constructor() {
49+
this.db = {};
50+
}
51+
52+
async saveSettings(userId, settings) {
53+
await this.#delay();
54+
this.db[userId] = settings;
55+
}
56+
57+
async getSettings(userId) {
58+
await this.#delay();
59+
return this.db[userId];
60+
}
61+
62+
async #delay() {
63+
return new Promise(resolve => setTimeout(resolve, 10));
64+
}
65+
}
66+
" > "$target_folder/packages/settings-api/plugins/database.js"
67+
68+
makeArchive packages settings-api
69+
70+
##############################################################################
71+
# Dice API, without database implementation
72+
##############################################################################
73+
74+
echo "Creating dice-api package..."
75+
copyFolder packages/dice-api
76+
perl -i -pe "s/^.*azure\/cosmos.*$//" "$target_folder/packages/dice-api/package.json"
77+
78+
echo -e "import { Injectable } from '@nestjs/common';
79+
80+
export interface Roll {
81+
sides: number;
82+
result: number;
83+
timestamp: number;
84+
}
85+
86+
@Injectable()
87+
export class DbService {
88+
private mockDb: Roll[] = [];
89+
90+
async addRoll(roll: Roll) {
91+
await this.delay();
92+
this.mockDb.push(roll);
93+
this.mockDb.sort((a, b) => a.timestamp - b.timestamp);
94+
}
95+
96+
async getLastRolls(max: number, sides: number) {
97+
await this.delay();
98+
return this.mockDb.filter((roll) => roll.sides === sides).slice(-max);
99+
}
100+
101+
private async delay() {
102+
return new Promise((resolve) => setTimeout(resolve, 10));
103+
}
104+
}
105+
" > "$target_folder/packages/dice-api/src/db.service.ts"
106+
107+
echo -e "import { Module } from '@nestjs/common';
108+
import { LoggerModule } from 'nestjs-pino';
109+
import { AppController } from './app.controller';
110+
import { AppService } from './app.service';
111+
import { DbService } from './db.service';
112+
import { RollsController } from './rolls.controller';
113+
114+
@Module({
115+
imports: [LoggerModule.forRoot()],
116+
controllers: [AppController, RollsController],
117+
providers: [AppService, DbService],
118+
})
119+
export class AppModule {}
120+
" > "$target_folder/packages/dice-api/src/app.module.ts"
121+
122+
makeArchive packages dice-api
123+
124+
##############################################################################
125+
# Gateway API
126+
##############################################################################
127+
128+
echo "Creating gateway-api package..."
129+
copyFolder packages/gateway-api
130+
makeArchive packages gateway-api
131+
132+
##############################################################################
133+
# Website
134+
##############################################################################
135+
136+
echo "Creating website package..."
137+
copyFolder packages/website
138+
makeArchive packages website
139+
140+
##############################################################################
141+
# docker-compose.yml
142+
##############################################################################
143+
144+
echo "Creating docker-compose package..."
145+
cp docker-compose.yml "$target_folder/docker-compose.yml"
146+
makeArchive docker-compose.yml docker-compose
147+
148+
##############################################################################
149+
# deploy.yml
150+
##############################################################################
151+
152+
echo "Creating deploy package..."
153+
mkdir -p "$target_folder/.github/workflows"
154+
cp .github/workflows/deploy.yml "$target_folder/.github/workflows/deploy.yml"
155+
makeArchive .github deploy

0 commit comments

Comments
 (0)