[Перевод] Cовместное использование GitHub Actions, Docker и GitHub NPMvPackage

Github Actions

Github Actions

В современном мире разработки программного обеспечения 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».

Github Token

Github Token

После получения токена у вас есть два варианта:

Добавьте свой токен в глобальную конфигурацию 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 уровня репозиторий.

Dependabot

Dependabot

Заключение

В заключение отмечу, что интеграция GitHub Actions, Docker и GitHub NPM Package представляет собой мощное решение для автоматизации рабочих процессов при разработке программного обеспечения. Используя эти инструменты, разработчики могут оптимизировать свои процессы, повысить производительность и обеспечить согласованность между проектами и командами. От автоматизации сборок и развертываний до беспрепятственного управления зависимостями — возможности безграничны. Поскольку технологии продолжают развиваться, освоение этих инструментов будет становиться все более важным для сохранения конкурентоспособности в постоянно меняющейся среде разработки.

P.S. это перевод моей же статьи, написанной для Medium. Оригинал можете найти по ссылке в шапке статьи.

© Habrahabr.ru