From ec8c8aef35095a198235ddf2e36e97e13be53d80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zieli=C5=84ski?= Date: Thu, 18 Sep 2025 08:39:36 +0200 Subject: [PATCH] release --- .gitea/scripts/replaceTokens.js | 123 +++++++++++++++++++++-------- .gitea/workflows/morskaRelease.yml | 10 +-- 2 files changed, 93 insertions(+), 40 deletions(-) diff --git a/.gitea/scripts/replaceTokens.js b/.gitea/scripts/replaceTokens.js index 565cfdb..a0b993a 100644 --- a/.gitea/scripts/replaceTokens.js +++ b/.gitea/scripts/replaceTokens.js @@ -1,38 +1,91 @@ -module.exports = async ({ github, context, core, jobId }) => { - - const frontendPath = `./${jobId}/frontend/diunaBI/browser/`; - const files = (require('fs').readdirSync(frontendPath).filter(file => file.endsWith('.js'))) - .map(file => `${frontendPath}${file}`); - if (files.length === 0) { - core.setFailed("Frontend JS files not found"); - return false; - } - - files.push(`./${jobId}/webapi/appsettings.json`); - files.push(`./${jobId}/webapi/client_secrets.json`); +// .gitea/scripts/replaceTokens.js +// Skanuje: +// - artifacts/frontend/**/*.js +// - artifacts/webapi/appsettings.json (jeśli jest) +// - artifacts/webapi/client_secrets.json (jeśli jest) +// Tokeny: #{NAME}# -> wartość z VARIABLES/SECRETS (NAME: uppercased, '-'->'_') +// Dodatkowo: #{BUILDID}# -> RUN_ID (z ENV) - files.forEach(file => { - let data = require('fs').readFileSync(file, 'utf8'); - const regex = /#{(.*?)}#/g; - let match; - while (match = regex.exec(data)) { - const original = match[0]; - const token = match[1].replace(/-/g, '_').toUpperCase(); - const value = getValue(token, jobId); - console.log(`Replacing ${original} with ${value} for ${token}`); - if (!value) { - core.setFailed(`Token ${token} not found`); - return false; - } - data = data.replace(new RegExp(original, 'g'), value); - } - require('fs').writeFileSync(file, data, 'utf8'); - }); +const fs = require('fs'); +const path = require('path'); + +function walk(dir, predicate) { + const out = []; + if (!fs.existsSync(dir)) return out; + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) out.push(...walk(full, predicate)); + else if (predicate(full)) out.push(full); + } + return out; } -function getValue(token, jobId) { - if (token == 'BUILDID') { return jobId; } - const secrets = JSON.parse(process.env.SECRETS); - const variables = JSON.parse(process.env.VARIABLES); - return variables[token] || secrets[token]; -} \ No newline at end of file +function replaceInFile(file, mapToken) { + let data = fs.readFileSync(file, 'utf8'); + const re = /#\{(.*?)\}#/g; + let changed = false; + data = data.replace(re, (_, raw) => { + const token = (raw || '').replace(/-/g, '_').toUpperCase(); + const val = mapToken(token); + if (val == null || val === '') return `#{${raw}}#`; // zostaw bez zmian, podbijemy błąd później + changed = true; + return String(val); + }); + fs.writeFileSync(file, data, 'utf8'); + return changed; +} + +(async () => { + const secrets = JSON.parse(process.env.SECRETS || '{}'); + const variables = JSON.parse(process.env.VARIABLES || '{}'); + const RUN_ID = process.env.RUN_ID || process.env.GITHUB_RUN_ID || ''; + + const mapToken = (token) => { + if (token === 'BUILDID') return RUN_ID; + return (variables[token] != null ? variables[token] : secrets[token]); + }; + + // 1) Frontend: wszystkie .js + const feRoot = path.resolve('artifacts/frontend'); + const feFiles = walk(feRoot, (f) => f.endsWith('.js')); + + // 2) Backend: wybrane pliki jeśli istnieją + const beRoot = path.resolve('artifacts/webapi'); + const beFiles = [] + ;['appsettings.json', 'client_secrets.json'].forEach((name) => { + const p = path.join(beRoot, name); + if (fs.existsSync(p)) beFiles.push(p); + }); + + const files = [...feFiles, ...beFiles]; + + if (files.length === 0) { + console.error('❌ No candidate files found to tokenize (frontend .js / backend json).'); + process.exit(1); + } + + console.log(`🔎 Tokenizing ${files.length} file(s)`); + const missing = new Set(); + + // drugi przebieg: wypisz brakujące tokeny, jeśli jakieś zostały w plikach + for (const file of files) { + // pierwsze podejście: podstaw wartości + replaceInFile(file, mapToken); + } + for (const file of files) { + const content = fs.readFileSync(file, 'utf8'); + const reLeft = /#\{(.*?)\}#/g; + let m; + while ((m = reLeft.exec(content))) { + const token = (m[1] || '').replace(/-/g, '_').toUpperCase(); + missing.add(token); + } + } + + if (missing.size > 0) { + console.error(`❌ Missing values for tokens: ${Array.from(missing).join(', ')}`); + process.exit(1); + } + + console.log('✅ Tokenization complete.'); +})(); \ No newline at end of file diff --git a/.gitea/workflows/morskaRelease.yml b/.gitea/workflows/morskaRelease.yml index c089b10..d382b56 100644 --- a/.gitea/workflows/morskaRelease.yml +++ b/.gitea/workflows/morskaRelease.yml @@ -62,13 +62,13 @@ jobs: ls -laR artifacts/webapi || true echo "::endgroup::" - - name: Tokenize (replace #{...}# from secrets/vars) + - name: Resolve latest run that exposes required artifacts + id: resolve env: - SECRETS: ${{ toJson(secrets) }} - VARIABLES: ${{ toJson(vars) }} + GITEA_PAT: ${{ secrets.GITEATOKEN }} run: | - set -euo pipefail - node -e "require('./.gitea/scripts/replaceTokens.js')({ github: {}, context: {}, core: {} });" + node .gitea/scripts/getLatestRunWithArtifacts.js + echo "run_id=$(cat .gitea/.cache/run_id)" >> "$GITHUB_OUTPUT" - name: Package artifacts as ZIPs run: |