В современном мире разработки программного обеспечения GitHub остается самой популярной платформой для хранения Git-репозиторий и управления ими. Помимо своей фундаментальной роли в управлении версиями, GitHub предлагает дополнительные функции, включая возможность размещения private NPM registry. Эта функция упрощает хранение и совместное использование JavaScript и TypeScript библиотек между проектами и командами, улучшая совместную работу и возможность повторного использования кода в вашей компании.
GitHub Actions позволяет автоматизировать задачи ваших проектов, такие как linter, sonar , запуск тестов, билд образов Docker, развертывание в различных средах и многое другое.
Говоря о Docker, общепринятой практикой является создание приложения, библиотеки или любого кода в определенном образе Docker (то есть сборка внутри Docker контейнера). В этом контейнере можно задать определенную версию Node, а также любые внешние ресурсы и библиотеки, необходимые в процессе сборки. Этот подход обеспечивает максимальное удобство, поскольку устраняет необходимость полагаться на конкретный ПК или виртуальную машину со всеми необходимыми настройками. Вместо этого вы можете один раз подготовить среду на уровне Docker и последовательно использовать ее на разных машинах и в разных средах, обеспечивая согласованность и воспроизводимость на протяжении всего процесса разработки.
Однако возникает проблема, когда вы пытаетесь создать свое приложение в Docker, и для этого требуется библиотека npm, хранящаяся в вашем частном реестре GitHub NPM. Более того, этот процесс должен быть осуществим в GitHub Actions. В этой статье я покажу вам процесс настройки, чтобы добиться этого без проблем!
Как использовать private registry GitHub?
Во-первых, давайте начнем с простого сценария. Представьте себе проект с зависимостью от частного реестра NPM.
{
...
"dependencies": {
...
"@targsoft/private-lib": "^1.0.0",
...
}
...
}
Прежде всего, вам необходимо создать новый токен GitHub Token. Вы можете создать токен в настройках своей учетной записи GitHub по адресу https://github.com/settings/tokens. Обязательно добавьте в свой токен область действия ‘read:packages’.
После получения токена у вас есть два варианта:
Добавьте свой токен в глобальную конфигурацию npm. Откройте терминал и выполните следующие команды:
npm login --registry=https://npm.pkg.github.com --scope=@targsoft
login: your username password=TOKEN
В качестве альтернативы вы можете создать файл .npmrc рядом с файлом package.json со следующим содержимым:
@targsoft:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=TOKEN
always-auth=true
Это должно сработать, и ваш глобальный npm получит библиотеку из частного реестра. Попробуйте запустить ‘npm install’ и посмотрите, как это работает!
Как использовать частный реестр GitHub внутри Docker?
Хорошо, теперь довольно понятно, как использовать реестр GitHub с вашего локального компьютера. Но что, если у вас есть Dockerfile, который собирает ваше приложение внутри себя, а затем запускает его? Например, это может быть небольшое веб-приложение с nginx в качестве веб-сервера.
FROM node:20-alpine AS build
WORKDIR /opt
COPY ./package.json ./yarn.lock /opt/
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc yarn install --frozen-lockfile
COPY . .
RUN yarn audit --omit=dev
RUN yarn build
FROM nginx:1.25.4-alpine AS runtime
COPY --from=build /opt/dist/targpatrol-main-frontend /usr/share/nginx/html
COPY docker/nginx.conf /etc/nginx/nginx.conf
CMD ["/bin/sh", "-c", "envsubst < /usr/share/nginx/html/assets/env.template.js > /usr/share/nginx/html/assets/env.js && exec nginx -g 'daemon off;'"]
Хитрость здесь заключается в том, чтобы передать секреты в ваш Dockerfile, позволяя npm внутри Docker получать доступ к приватному реестру GitHub.
RUN --mount=type=secret,id=npmrc,target=/root/.npmrc yarn install --frozen-lockfile
Как видите, мы "монтируем" секреты перед установкой пакетов. Это гарантирует, что у npm есть необходимые учетные данные для получения зависимостей из частного реестра.
Файл Docker Compose будет выглядеть следующим образом:
version: '3.9'
secrets:
npmrc:
file: ./.npmrc
....
services:
targpatrol-main-frontend:
build:
context: ../../targpatrol-main-frontend
secrets:
- npmrc
container_name: targpatrol-main-frontend
restart: always
networks:
- targpatrol-docker-network
.npmrc — это тот же файл, который мы использовали для получения библиотеки с помощью глобального npm.
@targsoft:registry=https://npm.pkg.github.com
//npm.pkg.github.com/:_authToken=TOKEN
always-auth=true
Теперь вы можете запустить билд контейнера:
docker compose up --build --force-recreate
Как использовать Github Action для создания образа Docker?
Отлично, теперь, когда у нас есть возможность собирать Docker образы на локальных машинах, давайте рассмотрим, как использовать GitHub Actions для этой задачи. Вот как это можно сделать.
name: targpatrol-main-frontend-pr-opened
...
jobs:
build-and-test:
runs-on: ubuntu-latest
defaults:
run:
shell: bash
working-directory: ${{ env.SERVICE }}
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup node
uses: actions/setup-node@v3
with:
node-version: '20.x'
registry-url: 'https://npm.pkg.github.com'
scope: '@targsoft'
- name: Install npm packages
run: yarn install --frozen-lockfile
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Lint
run: yarn lint
- name: Audit
run: yarn audit --omit=dev
- name: Build
run: yarn build
- name: Docker Build and push to AWS ECR
uses: docker/build-push-action@v5
with:
context: ${{ env.SERVICE }}
file: ${{ env.SERVICE }}/Dockerfile
secrets: |
"npmrc=${{ secrets.NPMRC_SECRET_FILE }}"
push: false
Это пример настройки Node.js внутри GitHub Action. NPM_TOKEN следует настроить на уровне репозитория или организации. NPMRC_SECRET_FILE — это секрет GitHub Action, который содержит то же содержимое, что и файл .npmrc.
Так же важно отметить, что данное решение работает только с 5-ой версией docker/build-push-action@v5.
Не забывайте про Dependabot
Если вы используете Dependabot для обновления версий ваших пакетов, вам необходимо создать для него отдельные секреты, поскольку он не будет использовать секреты из ваших Github Actions уровня репозиторий.
Заключение
В заключение отмечу, что интеграция GitHub Actions, Docker и GitHub NPM Package представляет собой мощное решение для автоматизации рабочих процессов при разработке программного обеспечения. Используя эти инструменты, разработчики могут оптимизировать свои процессы, повысить производительность и обеспечить согласованность между проектами и командами. От автоматизации сборок и развертываний до беспрепятственного управления зависимостями — возможности безграничны. Поскольку технологии продолжают развиваться, освоение этих инструментов будет становиться все более важным для сохранения конкурентоспособности в постоянно меняющейся среде разработки.
P.S. это перевод моей же статьи, написанной для Medium. Оригинал можете найти по ссылке в шапке статьи.