Na aplikaci je videt, ktery build to je
Nasazena aplikace o dva commity pozadu funguje a vypada skoro stejne jako nova. Bez oznaceni buildu se to nepozna a hleda se chyba tam, kde zadna neni - prave to nas dnes stalo pul hodiny hadani, proc je na produkci porad stary vzhled. - oznaceni buildu v pate postranniho menu, pod tlacitkem Odhlasit se: verze, cas buildu a cislo commitu. Text jde oznacit jednim kliknutim. - totez jako <meta name="app-build"> v hlavicce stranky. V JS balicku uz to je, ale ten se musi stahnout a rozbalit; meta znacka je videt na jeden curl bez prihlaseni, a presne to clovek potrebuje pri zjistovani, co bezi na produkci. - hodnoty dosazuje Vite pri buildu (define a plugin build-stamp), takze neplati pro repozitar, ale pro ten konkretni balicek. - .dockerignore uz nevylucuje .git/. Build z nej cte cislo commitu; bez nej by se poznal jen cas buildu, ne co v nem je. Do vysledneho image se .git nedostane, ten se sklada z ciste zakladni image a kopiruje se do nej jen dist, scripts a migrace. Ve vyvoji se misto casu pise "vyvoj" - cas buildu by tam byl pokazde jiny a nikomu by nic nerekl. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
73e0ecca4f
commit
33b4a3fdd6
+66
-2
@@ -1,11 +1,72 @@
|
||||
import tailwindcss from '@tailwindcss/vite';
|
||||
import react from '@vitejs/plugin-react';
|
||||
import { execSync } from 'node:child_process';
|
||||
import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { defineConfig } from 'vite';
|
||||
import { defineConfig, type Plugin } from 'vite';
|
||||
|
||||
const here = path.dirname(fileURLToPath(import.meta.url));
|
||||
|
||||
/**
|
||||
* Oznaceni buildu.
|
||||
*
|
||||
* Bez nej se nasazena verze nepozna: aplikace bezi, jen je stara, a z venku
|
||||
* to vypada stejne jako kdyz je nova. Prave to nas jednou stalo pul hodiny
|
||||
* hadani, proc je na produkci porad stary vzhled.
|
||||
*
|
||||
* Cas buildu je hlavni udaj, protoze funguje vzdycky. Commit je bonus: do
|
||||
* image se `.git` nekopiruje (`.dockerignore`), takze v produkcnim buildu
|
||||
* chybi a zustane prazdny.
|
||||
*/
|
||||
const pkg: { version: string } = JSON.parse(
|
||||
fs.readFileSync(path.resolve(here, 'package.json'), 'utf8'),
|
||||
);
|
||||
|
||||
function gitCommit(): string {
|
||||
try {
|
||||
return execSync('git rev-parse --short HEAD', { stdio: ['ignore', 'pipe', 'ignore'] })
|
||||
.toString()
|
||||
.trim();
|
||||
} catch {
|
||||
// V containeru `.git` neni. Neni to chyba, jen se commit nedozvime.
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
const buildInfo = {
|
||||
version: pkg.version,
|
||||
builtAt: new Date().toISOString(),
|
||||
commit: gitCommit(),
|
||||
};
|
||||
|
||||
/**
|
||||
* Vlozi oznaceni buildu i do hlavicky stranky.
|
||||
*
|
||||
* V JS balicku uz je, ale ten se musi stahnout a rozbalit. Meta znacka je
|
||||
* videt na jeden `curl` bez prihlaseni - a presne to clovek potrebuje, kdyz
|
||||
* zjistuje, co vlastne bezi na produkci.
|
||||
*/
|
||||
function buildStamp(): Plugin {
|
||||
return {
|
||||
name: 'build-stamp',
|
||||
transformIndexHtml() {
|
||||
return [
|
||||
{
|
||||
tag: 'meta',
|
||||
attrs: {
|
||||
name: 'app-build',
|
||||
content: [buildInfo.version, buildInfo.builtAt, buildInfo.commit]
|
||||
.filter(Boolean)
|
||||
.join(' '),
|
||||
},
|
||||
injectTo: 'head',
|
||||
},
|
||||
];
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export default defineConfig({
|
||||
root: path.resolve(here, 'web'),
|
||||
/**
|
||||
@@ -14,7 +75,10 @@ export default defineConfig({
|
||||
* podle ROOT_PATH a relativni odkazy se podle nej slozi spravne.
|
||||
*/
|
||||
base: './',
|
||||
plugins: [react(), tailwindcss()],
|
||||
plugins: [react(), tailwindcss(), buildStamp()],
|
||||
define: {
|
||||
__BUILD_INFO__: JSON.stringify(buildInfo),
|
||||
},
|
||||
resolve: {
|
||||
// Musi zustat v souladu s "paths" ve web/tsconfig.json
|
||||
alias: {
|
||||
|
||||
Reference in New Issue
Block a user