Skip to content

Commit

Permalink
feat: build and publish data-dev container
Browse files Browse the repository at this point in the history
  • Loading branch information
jamesdabbs committed Jan 15, 2024
1 parent 8717bef commit 6c1f0e5
Show file tree
Hide file tree
Showing 16 changed files with 414 additions and 888 deletions.
3 changes: 3 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.git
*Dockerfile*
node_modules
3 changes: 2 additions & 1 deletion .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: e2e
name: End-to-end tests

on:
pull_request:

Expand Down
57 changes: 57 additions & 0 deletions .github/workflows/images.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: Publish Docker image

on:
push:
branches:
- jcd/images
- main

jobs:
build:
runs-on: ubuntu-latest

strategy:
matrix:
image:
- compile
- data-dev

env:
REGISTRY: ghcr.io

permissions:
contents: read
packages: write

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Lint Dockerfiles
uses: hadolint/[email protected]
with:
dockerfile: images/${{ matrix.image }}/Dockerfile

- name: Log in to the container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: ${{ env.REGISTRY }}/${{ matrix.image }}
tags: |
type=sha
- name: Build and push
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
with:
context: .
file: images/${{ matrix.image }}/Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
3 changes: 2 additions & 1 deletion .github/workflows/test.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: test
name: Unit Tests

on:
push:

Expand Down
27 changes: 27 additions & 0 deletions images/compile/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# See https://pnpm.io/docker
FROM node:18-slim AS base

ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"

RUN corepack enable

VOLUME /data

COPY . /app
WORKDIR /app

FROM base AS prod-deps
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prod --frozen-lockfile

FROM base AS build
RUN --mount=type=cache,id=pnpm,target=/pnpm/store \
pnpm install --frozen-lockfile && \
pnpm run --filter core build && \
pnpm run --filter compile build && \
pnpm deploy --filter compile --prod /prod/compile

FROM base
COPY --from=build /prod/compile /app

ENTRYPOINT ["node", "dist/esm/main.js"]
22 changes: 22 additions & 0 deletions images/data-dev/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# See https://pnpm.io/docker
FROM node:18-slim AS base

ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"

EXPOSE 3141/tcp
EXPOSE 4173/tcp

RUN corepack enable

VOLUME /data

COPY . /app
WORKDIR /app

COPY ./images/data-dev/entrypoint.sh /app/entrypoint.sh
RUN chmod +x /app/entrypoint.sh

RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile

ENTRYPOINT ["/bin/bash", "/app/entrypoint.sh"]
3 changes: 3 additions & 0 deletions images/data-dev/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pnpm run --filter compile dev &

VITE_BUNDLE_SSE=true VITE_BUNDLE_HOST=/bundle pnpm run --filter viewer dev --host
8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
},
"devDependencies": {
"@types/node": "^18.16.6",
"@vitest/coverage-c8": "^0.29.8",
"@vitest/coverage-v8": "^0.34.0",
"nodemon": "^2.0.22",
"npm-check-updates": "^16.14.6",
"prettier": "^2.8.8",
"prettier-plugin-svelte": "^2.10.0",
"ts-node": "^10.9.1",
"typescript": "^4.9.5",
"vite": "^3.2.6",
"vitest": "^0.31.0"
"typescript": "^5.3.3",
"vite": "^4.5.1",
"vitest": "^0.34.6"
}
}
11 changes: 0 additions & 11 deletions packages/compile/action.yml

This file was deleted.

1 change: 0 additions & 1 deletion packages/compile/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
"test:watch": "vitest"
},
"dependencies": {
"@actions/core": "^1.10.0",
"@pi-base/core": "workspace:*",
"chalk": "^5.2.0",
"chokidar": "^3.5.3",
Expand Down
26 changes: 13 additions & 13 deletions packages/compile/src/main.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,20 @@ import { join } from 'node:path'

const main = join(__dirname, '..', 'src', 'main.ts')
const repo = join(__dirname, '..', 'test', 'repo')
const out = join(repo, 'out.json')
const out = 'out.json'

async function run(dir: string) {
const { stdout, stderr, error, status } = spawnSync('tsx', [main], {
env: {
GITHUB_REF: 'refs/heads/test',
GITHUB_SHA: 'c74d99cf46f6ed23e742f2617e9908294b4a608b',
GITHUB_WORKSPACE: join(repo, dir),
INPUT_OUT: out,
PATH: process.env.PATH,
const { stdout, stderr, error, status } = spawnSync(
'tsx',
[main, join(repo, dir), out],
{
env: {
GITHUB_REF: 'refs/heads/test',
GITHUB_SHA: 'c74d99cf46f6ed23e742f2617e9908294b4a608b',
PATH: process.env.PATH,
},
},
})
)

if (error) {
throw error
Expand All @@ -43,12 +45,10 @@ afterAll(cleanup)

it('builds a bundle', async () => {
const { output, error } = await run('valid')
expect(output).toContain(
`::debug::Compiling repo=${repo}/valid to out=${out}`,
)
expect(output).toContain(`::debug Compiling repo=${repo}/valid to out=`)
expect(error).toBe(false)

const bundle = JSON.parse((await readFile(out)).toString())
const bundle = JSON.parse((await readFile(`${repo}/valid/${out}`)).toString())

expect(bundle.properties.length).toEqual(3)
expect(bundle.spaces.length).toEqual(2)
Expand Down
37 changes: 16 additions & 21 deletions packages/compile/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,39 @@
/**
* Entry point for running as a Github action, with the local workspace
* containing the data repository. Set GITHUB_WORKSPACE to use a different
* data repository.
*/
import * as core from '@actions/core'
import * as fs from 'fs'
import * as process from 'process'
import { bundle as B } from '@pi-base/core'

import load from './load.js'

async function run(): Promise<void> {
const repo: string = process.env.GITHUB_WORKSPACE || '.'
const outpath: string = core.getInput('out')

core.debug(`Compiling repo=${repo} to out=${outpath}`)
async function run(repo = '/data', out = 'bundle.json'): Promise<void> {
log(`Compiling repo=${repo} to out=${out}`, 'debug')

const { bundle, errors } = await load(repo)

if (errors) {
errors.forEach((messages, path) => {
messages.forEach(message => {
error(path, message)
log(`file=${path}::${message}`, 'error')
})
})
}

if (errors || !bundle) {
core.setFailed('Compilation finished with errors')
return
log('Compilation finished with errors', 'error')
process.exit(1)
}

fs.writeFileSync(outpath, JSON.stringify(B.serialize(bundle)))
fs.writeFileSync(`${repo}/${out}`, JSON.stringify(B.serialize(bundle)))
}

type Level = 'debug' | 'info' | 'error'

function log(message: string, level: Level = 'info') {
console.log(`::${level} ${message}`)
}

function error(file: string, message: string) {
console.log(`::error file=${file}::${message}`)
function fail(message: string) {
log(message, 'error')
process.exit(1)
}

run().catch(err => {
core.setFailed(err.message)
core.error(err.message)
})
run(...process.argv.slice(2)).catch(err => fail(err.message))
1 change: 1 addition & 0 deletions packages/compile/test/repo/valid/out.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"properties":[{"name":"Compact","aliases":[],"uid":"P000016","description":"A space $X$ is compact if every open cover of $X$ has a finite subcover.\n\nDefined on page 18 of {{doi:10.1007/978-1-4612-6290-9}}.","refs":[{"name":"Counterexamples in Topology","doi":"10.1007/978-1-4612-6290-9"},{"name":"Compact space on Wikipedia","wikipedia":"Compact_space"}]},{"name":"Countably compact","aliases":[],"uid":"P000019","description":"A space $X$ is countably compact if every countable open cover of $X$ has a finite subcover.\n\nDefined on page 19 of {{doi:10.1007/978-1-4612-6290-9}}.","refs":[{"name":"Counterexamples in Topology","doi":"10.1007/978-1-4612-6290-9"}]},{"name":"Connected","aliases":[],"uid":"P000036","description":"A space $X$ is connected if given any two disjoint open $U, V \\subset X$ with $U \\cup V = X$, one of $U$ or $V$ must be empty.\n\nDefined on page 7 of {{doi:10.1007/978-1-4612-6290-9}}.","refs":[{"name":"Counterexamples in Topology","doi":"10.1007/978-1-4612-6290-9"}]}],"spaces":[{"name":"Discrete topology on a two-point set","aliases":["Finite Discrete Topology"],"uid":"S000001","counterexamples_id":1,"description":"Let $X=2=\\{0,1\\}$ be the space containing two points and\nlet all subsets of $X$ be open.\n\nDefined as counterexample #1 (\"Finite Discrete Topology\")\nin {{doi:10.1007/978-1-4612-6290-9}}.","refs":[{"name":"Counterexamples in Topology","doi":"10.1007/978-1-4612-6290-9"},{"name":"Discrete Space on Wikipedia","wikipedia":"Discrete_space"}]},{"name":"Discrete Topology on a Countably Infinite Set","aliases":["Countable Discrete Topology"],"uid":"S000002","counterexamples_id":2,"description":"Let $X=\\omega=\\{0,1,2,\\dots\\}$ be the space containing countably-many\npoints and let all subsets of $X$ be open.\n\nDefined as counterexample #2 (\"Countable Discrete Topology\")\nin {{doi:10.1007/978-1-4612-6290-9}}.\n\n<!-- [[Proof of Topology]]\n1) $U=\\emptyset$ is open by definition. Let $U = X$ is open by definition.\n\n2) Let $A$ be an arbitrary union of the elements of any subcollection of $\\tau$. Since every element in the subcollection are subsets of $X$ their union must be a subset of $X$. Thus, $A$ is a subset of $X$ and is open by definition.\n\n3) Let $A$ be a finite intersection of elements from any subcollection of $\\tau$. Since every element in the subcollection are subsets of $X$ their intersection must necessarily be a subset of $X$. Thus, $A$ is a subset of $X$ and is open by definition. -->","refs":[{"name":"Counterexamples in Topology","doi":"10.1007/978-1-4612-6290-9"},{"name":"Discrete Space on Wikipedia","wikipedia":"Discrete_space"}]}],"theorems":[{"when":{"kind":"atom","property":"P000016","value":true},"then":{"kind":"atom","property":"P000019","value":true},"uid":"T000001","description":"Asserted on page 21 of {{doi:10.1007/978-1-4612-6290-9}}.","refs":[{"name":"Counterexamples in Topology","doi":"10.1007/978-1-4612-6290-9"}]}],"traits":[{"space":"S000001","property":"P000016","value":true,"uid":"T000008","description":"\n\nIf $X$ is finite any topology on $X$ is finite, and so any open cover of $X$ must be finite.\n\nSee item #8 for space #1 in {{doi:10.1007/978-1-4612-6290-9}}.\n","refs":[{"name":"Counterexamples in Topology","doi":"10.1007/978-1-4612-6290-9"}]},{"space":"S000001","property":"P000036","value":false,"uid":"T000009","description":"\n\nSince X consists of more than one point, X contains isolated points and is therefore clearly not connected.\n\nSee point #10 for space #1 in {{doi:10.1007/978-1-4612-6290-9}}.\n","refs":[{"name":"Counterexamples in Topology","doi":"10.1007/978-1-4612-6290-9"}]},{"space":"S000002","property":"P000036","value":false,"uid":"T000010","description":"\n\nX contains isolated points and is therefore clearly not connected.\n\nSee item #10 for space #2 in {{doi:10.1007/978-1-4612-6290-9}}.\n","refs":[{"name":"Counterexamples in Topology","doi":"10.1007/978-1-4612-6290-9"}]}],"version":{"ref":"test","sha":"c74d99cf46f6ed23e742f2617e9908294b4a608b"}}
4 changes: 2 additions & 2 deletions packages/core/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ export default defineConfig({
test: {
coverage: {
lines: 93.04,
branches: 94.35,
branches: 93.52,
statements: 93.04,
functions: 84.21,
functions: 93.54,
skipFull: true,
thresholdAutoUpdate: true,
exclude: ['src/Formula/Grammar.ts', 'test'],
Expand Down
8 changes: 4 additions & 4 deletions packages/viewer/vite.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ export default defineConfig({
test: {
include: ['src/**/*.{test,spec}.{js,ts}'],
coverage: {
lines: 82.91,
branches: 87.36,
statements: 82.91,
functions: 80.19,
lines: 82.99,
branches: 85.71,
statements: 82.99,
functions: 81.33,
skipFull: true,
thresholdAutoUpdate: true,
},
Expand Down
Loading

0 comments on commit 6c1f0e5

Please sign in to comment.