simplify build

master
Sergey Marinkevich 4 months ago
parent 2a17029751
commit db11fff026

@ -0,0 +1 @@
BUILD=5

2
.gitignore vendored

@ -2,3 +2,5 @@
dist dist
node_modules node_modules
redmine-reactions.pem redmine-reactions.pem
build
output

@ -4,16 +4,35 @@ FROM node:20-alpine AS builder
# Устанавливаем рабочую директорию внутри контейнера # Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app WORKDIR /app
#ENV USER=docker
#ENV GROUPNAME=$USER
#ENV UID=1000
#ENV GID=1000
#
#RUN addgroup \
# --gid "$GID" \
# "$GROUPNAME" \
#&& adduser \
# --disabled-password \
# --gecos "" \
# --home "$(pwd)" \
# --ingroup "$GROUPNAME" \
# --no-create-home \
# --uid "$UID" \
# $USER
# Копируем сначала только package.json и package-lock.json (если есть) # Копируем сначала только package.json и package-lock.json (если есть)
# Это ключевая оптимизация! Docker будет кэшировать этот слой, и npm install # Это ключевая оптимизация! Docker будет кэшировать этот слой, и npm install
# не будет запускаться каждый раз, если зависимости не менялись. # не будет запускаться каждый раз, если зависимости не менялись.
COPY package*.json ./ COPY --chown=node:node package*.json ./
RUN chown node:node /app -R
RUN echo -e 'nameserver 1.1.1.1\noptions single-request-reopen' > /etc/resolv.conf && \ RUN echo -e 'nameserver 1.1.1.1\noptions single-request-reopen' > /etc/resolv.conf && \
cat /etc/resolv.conf && \ su - node -c "cd /app && npm install"
npm install --verbose
USER node
# Теперь копируем все остальные исходники COPY --chown=node:node . .
COPY . .
# Команда, которая будет выполняться по умолчанию для сборки проекта # Команда, которая будет выполняться по умолчанию для сборки проекта
CMD ["npm", "run", "build"] CMD ["npm", "run", "build"]

@ -0,0 +1,56 @@
BUILD_DIR := build
DIST_DIR := $(BUILD_DIR)/dist
OUTPUT_DIR := output
CHROME_ZIP := $(OUTPUT_DIR)/chrome/redmine-reactions.zip
FIREFOX_XPI := $(OUTPUT_DIR)/firefox/redmine-reactions.xpi
DOCKER_COMPOSE_RUN := docker-compose run --rm builder
ifneq (,$(wildcard .env))
include .env
export AMO_JWT_ISSUER AMO_JWT_SECRET
endif
include .aibuild
BUILD := $(shell echo $$(($(BUILD) + 1)))
.PHONY: all chrome firefox clean
all: chrome firefox
chrome: build output builder aibuild
@echo "==> 🏗️ Building for Chrome..."
sed -e "s/AI_BUILD/$(BUILD)/" manifest-chrome.json > ./build/manifest.json
$(DOCKER_COMPOSE_RUN) npm run build
@echo "==> 📦 Packaging Chrome extension..."
mkdir -p $(OUTPUT_DIR)/chrome
cd $(DIST_DIR) && zip -rq ../../$(CHROME_ZIP) .
@echo "==> ✅ Chrome package is ready: $(CHROME_ZIP)"
firefox: build output builder aibuild
@echo "==> 🏗️ Building for Firefox..."
sed -e "s/AI_BUILD/$(BUILD)/" manifest-firefox.json > ./build/manifest.json
$(DOCKER_COMPOSE_RUN) npm run build
@echo "==> ✍️ Signing Firefox extension (this may take a moment)..."
$(DOCKER_COMPOSE_RUN) npm run sign:firefox
@echo "==> 🚚 Moving signed XPI to output..."
mkdir -p $(OUTPUT_DIR)/firefox
find $(BUILD_DIR)/amo -name "*.xpi" -exec mv {} $(FIREFOX_XPI) \;
@echo "==> ✅ Firefox package is ready: $(FIREFOX_XPI)"
aibuild:
@echo BUILD=$(BUILD) > .aibuild
output:
mkdir output
build:
mkdir build
builder:
docker-compose build
clean:
@echo "==> 🧹 Cleaning up build artifacts..."
rm -rf $(BUILD_DIR) $(OUTPUT_DIR)

@ -1,18 +1,16 @@
Build Build
===== =====
docker-compose run --rm builder npm run build:chrome make chrome
or or
docker-compose run --rm builder npm run build:firefox make firefox
Signed Signed
====== ======
Needs AMO API key from Mozilla. Needs AMO API key from Mozilla. Place it to the `.env` file.
docker-compose run --rm \ AMO_JWT_ISSUER=$USER
-e AMO_JWT_ISSUER="$USER" \ AMO_JWT_SECRET=$SECRET
-e AMO_JWT_SECRET="$SECRET" \
builder npm run package:firefox-signed

@ -1,34 +1,13 @@
version: '3.8' version: '3.8'
services: services:
# Сервис для ОДНОРАЗОВОЙ СБОРКИ расширения (команда npm run build)
# Запускается командой: docker-compose run --rm builder
builder: builder:
# Собираем образ на основе нашего Dockerfile.build
build: build:
context: . context: .
dockerfile: Dockerfile.build dockerfile: Dockerfile.build
# Это магия! Мы "пробрасываем" всю текущую папку внутрь контейнера. env_file:
# Когда внутри контейнера в /app создастся папка dist, она автоматически - .env
# появится и на нашей хост-машине.
volumes: volumes:
- .:/app - ./build:/app/build
# Анонимный том для node_modules. Важный трюк! - ./build/manifest.json:/app/manifest.json
# Он предотвращает перезапись папки node_modules, установленной внутри - ./output:/app/output
# контейнера, пустой папкой с хоста.
- /app/node_modules
# Сервис для РЕЖИМА РАЗРАБОТКИ (команда npm run dev)
# Запускается командой: docker-compose up dev
dev:
build:
context: .
dockerfile: Dockerfile.build
ports:
# Пробрасываем порт Vite для hot-reload
- "5173:5173"
volumes:
- .:/app
- /app/node_modules
# Переопределяем команду по умолчанию на запуск dev-сервера
command: npm run dev

@ -1,7 +1,7 @@
{ {
"manifest_version": 3, "manifest_version": 3,
"name": "Redmine Reactions", "name": "Redmine Reactions",
"version": "0.1.0", "version": "0.1.AI_BUILD",
"description": "Добавляет реакции на комментарии в локальном Redmine.", "description": "Добавляет реакции на комментарии в локальном Redmine.",
"permissions": ["storage"], "permissions": ["storage"],
"icons": { "icons": {
@ -10,7 +10,8 @@
"content_scripts": [ "content_scripts": [
{ {
"matches": ["https://red.eltex.loc/issues/*"], "matches": ["https://red.eltex.loc/issues/*"],
"js": ["src/content.tsx"] "js": ["src/content.tsx"],
"run_at": "document_start"
} }
] ]
} }

@ -1,7 +1,7 @@
{ {
"manifest_version": 3, "manifest_version": 3,
"name": "Redmine Reactions", "name": "Redmine Reactions",
"version": "0.1.0", "version": "0.1.AI_BUILD",
"description": "Добавляет реакции на комментарии в локальном Redmine.", "description": "Добавляет реакции на комментарии в локальном Redmine.",
"permissions": [ "permissions": [
"storage", "storage",
@ -13,7 +13,8 @@
"content_scripts": [ "content_scripts": [
{ {
"matches": ["https://red.eltex.loc/issues/*"], "matches": ["https://red.eltex.loc/issues/*"],
"js": ["src/content.tsx"] "js": ["src/content.tsx"],
"run_at": "document_start"
} }
], ],
"browser_specific_settings": { "browser_specific_settings": {

@ -5,12 +5,9 @@
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "tsc && vite build", "build": "tsc && vite build --outDir build/dist --emptyOutDir",
"build:firefox": "cp manifest-firefox.json manifest.json && tsc && vite build", "lint": "tsc --noEmit",
"package:firefox": "npm run build:firefox && web-ext build --source-dir dist/ --overwrite-dest", "sign:firefox": "web-ext sign --source-dir build/dist --artifacts-dir build/amo --api-key=$AMO_JWT_ISSUER --api-secret=$AMO_JWT_SECRET"
"package:firefox-signed": "echo -e 'nameserver 1.1.1.1\noptions single-request-reopen' > /etc/resolv.conf && npm run build:firefox && web-ext sign --source-dir dist/ --api-key=$AMO_JWT_ISSUER --api-secret=$AMO_JWT_SECRET",
"build:chrome": "cp manifest-chrome.json manifest.json && npm run build",
"package:chrome": "npm run build:chrome && crx3 dist/ --key redmine-reactions.pem --output dist/redmine-reactions.crx"
}, },
"dependencies": { "dependencies": {
"webextension-polyfill": "^0.10.0", "webextension-polyfill": "^0.10.0",

Loading…
Cancel
Save