diff --git a/.aibuild b/.aibuild new file mode 100644 index 0000000..b79b81b --- /dev/null +++ b/.aibuild @@ -0,0 +1 @@ +BUILD=5 diff --git a/.gitignore b/.gitignore index 0f75210..3bc9f44 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ dist node_modules redmine-reactions.pem +build +output diff --git a/Dockerfile.build b/Dockerfile.build index 696c925..8697e30 100644 --- a/Dockerfile.build +++ b/Dockerfile.build @@ -4,16 +4,35 @@ FROM node:20-alpine AS builder # Устанавливаем рабочую директорию внутри контейнера 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 (если есть) # Это ключевая оптимизация! 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 && \ - cat /etc/resolv.conf && \ - npm install --verbose + su - node -c "cd /app && npm install" + +USER node -# Теперь копируем все остальные исходники -COPY . . +COPY --chown=node:node . . # Команда, которая будет выполняться по умолчанию для сборки проекта CMD ["npm", "run", "build"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ff847ca --- /dev/null +++ b/Makefile @@ -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) diff --git a/README.md b/README.md index d3355fd..7c09448 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,16 @@ Build ===== - docker-compose run --rm builder npm run build:chrome + make chrome or - docker-compose run --rm builder npm run build:firefox + make firefox Signed ====== -Needs AMO API key from Mozilla. +Needs AMO API key from Mozilla. Place it to the `.env` file. - docker-compose run --rm \ - -e AMO_JWT_ISSUER="$USER" \ - -e AMO_JWT_SECRET="$SECRET" \ - builder npm run package:firefox-signed + AMO_JWT_ISSUER=$USER + AMO_JWT_SECRET=$SECRET diff --git a/docker-compose.yml b/docker-compose.yml index 74b0b19..4fa636a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,34 +1,13 @@ version: '3.8' services: - # Сервис для ОДНОРАЗОВОЙ СБОРКИ расширения (команда npm run build) - # Запускается командой: docker-compose run --rm builder builder: - # Собираем образ на основе нашего Dockerfile.build build: context: . dockerfile: Dockerfile.build - # Это магия! Мы "пробрасываем" всю текущую папку внутрь контейнера. - # Когда внутри контейнера в /app создастся папка dist, она автоматически - # появится и на нашей хост-машине. + env_file: + - .env volumes: - - .:/app - # Анонимный том для node_modules. Важный трюк! - # Он предотвращает перезапись папки node_modules, установленной внутри - # контейнера, пустой папкой с хоста. - - /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 + - ./build:/app/build + - ./build/manifest.json:/app/manifest.json + - ./output:/app/output diff --git a/manifest-chrome.json b/manifest-chrome.json index d72c291..6b3055c 100644 --- a/manifest-chrome.json +++ b/manifest-chrome.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Redmine Reactions", - "version": "0.1.0", + "version": "0.1.AI_BUILD", "description": "Добавляет реакции на комментарии в локальном Redmine.", "permissions": ["storage"], "icons": { @@ -10,7 +10,8 @@ "content_scripts": [ { "matches": ["https://red.eltex.loc/issues/*"], - "js": ["src/content.tsx"] + "js": ["src/content.tsx"], + "run_at": "document_start" } ] } diff --git a/manifest-firefox.json b/manifest-firefox.json index 824434b..0cdfd9c 100644 --- a/manifest-firefox.json +++ b/manifest-firefox.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Redmine Reactions", - "version": "0.1.0", + "version": "0.1.AI_BUILD", "description": "Добавляет реакции на комментарии в локальном Redmine.", "permissions": [ "storage", @@ -13,7 +13,8 @@ "content_scripts": [ { "matches": ["https://red.eltex.loc/issues/*"], - "js": ["src/content.tsx"] + "js": ["src/content.tsx"], + "run_at": "document_start" } ], "browser_specific_settings": { diff --git a/package.json b/package.json index 5533e96..9ff4c95 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,9 @@ "type": "module", "scripts": { "dev": "vite", - "build": "tsc && vite build", - "build:firefox": "cp manifest-firefox.json manifest.json && tsc && vite build", - "package:firefox": "npm run build:firefox && web-ext build --source-dir dist/ --overwrite-dest", - "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" + "build": "tsc && vite build --outDir build/dist --emptyOutDir", + "lint": "tsc --noEmit", + "sign:firefox": "web-ext sign --source-dir build/dist --artifacts-dir build/amo --api-key=$AMO_JWT_ISSUER --api-secret=$AMO_JWT_SECRET" }, "dependencies": { "webextension-polyfill": "^0.10.0",