feat: add one-command Traefik deployment
This commit is contained in:
65
scripts/deployment.test.ts
Normal file
65
scripts/deployment.test.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import { readFileSync } from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
const projectRoot = process.cwd();
|
||||
const compose = readFileSync(path.join(projectRoot, 'compose.yaml'), 'utf8');
|
||||
const containerfile = readFileSync(
|
||||
path.join(projectRoot, 'Containerfile.release'),
|
||||
'utf8'
|
||||
);
|
||||
const releaseLock = JSON.parse(
|
||||
readFileSync(path.join(projectRoot, 'release', 'toolbox.lock.json'), 'utf8')
|
||||
) as { releaseVersion: string };
|
||||
|
||||
describe('production deployment', () => {
|
||||
it('keeps the release version and checksum pins synchronized', () => {
|
||||
const containerVersion = containerfile.match(
|
||||
/^ARG TOOLBOX_RELEASE_VERSION=(\S+)$/mu
|
||||
)?.[1];
|
||||
const composeVersion = compose.match(
|
||||
/\$\{TOOLBOX_RELEASE_VERSION:-([^}]+)\}/u
|
||||
)?.[1];
|
||||
const containerChecksum = containerfile.match(
|
||||
/^ARG TOOLBOX_RELEASE_SHA256=([a-f0-9]{64})$/mu
|
||||
)?.[1];
|
||||
const composeChecksum = compose.match(
|
||||
/\$\{TOOLBOX_RELEASE_SHA256:-([a-f0-9]{64})\}/u
|
||||
)?.[1];
|
||||
|
||||
expect(containerVersion).toBe(releaseLock.releaseVersion);
|
||||
expect(composeVersion).toBe(containerVersion);
|
||||
expect(composeChecksum).toBe(containerChecksum);
|
||||
});
|
||||
|
||||
it('verifies the release before extraction and retains a rootless final image', () => {
|
||||
expect(containerfile).toContain("--proto-redir '=https' --tlsv1.2");
|
||||
expect(containerfile.indexOf('sha256sum -c -')).toBeGreaterThan(0);
|
||||
expect(containerfile.indexOf('unzip -q')).toBeGreaterThan(
|
||||
containerfile.indexOf('sha256sum -c -')
|
||||
);
|
||||
expect(containerfile).toContain(
|
||||
'COPY --from=release --chown=101:101 /tmp/toolbox/'
|
||||
);
|
||||
expect(containerfile).toMatch(/\nUSER 101:101\nEXPOSE 8080\n/u);
|
||||
});
|
||||
|
||||
it('uses only the requested external Traefik network and HTTPS router', () => {
|
||||
expect(compose).toContain('dockerfile: Containerfile.release');
|
||||
expect(compose).toContain('traefik.enable: "true"');
|
||||
expect(compose).toContain(
|
||||
'traefik.docker.network: "${TRAEFIK_NETWORK:-internal}"'
|
||||
);
|
||||
expect(compose).toContain(
|
||||
'traefik.http.routers.addideas-toolbox.rule: "Host(`${TOOLBOX_HOST:-toolbax.add-ideas.de}`)"'
|
||||
);
|
||||
expect(compose).toContain(
|
||||
'traefik.http.routers.addideas-toolbox.entrypoints: websecure'
|
||||
);
|
||||
expect(compose).toContain(
|
||||
'traefik.http.routers.addideas-toolbox.tls.certresolver: "${TRAEFIK_CERT_RESOLVER:-netcup}"'
|
||||
);
|
||||
expect(compose).toContain('external: true');
|
||||
expect(compose).not.toMatch(/^\s+ports:/mu);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user