Хранилища артефактов

Владимир Портнов — DevOps engineer

Что такое хранилище артефактов

Артефакт — конечный продукт разработки кода.

Artifact registry, или Artifact repository, или хранилище артефактов — это система централизованного хранения и версионирования артефактов.

Устройство

Архитектура типичного хранилища артефактов:

архитектура Artifactory

Какие бывают

  • Публичные
    • DockerHub
    • PyPi
    • Maven Central
    • npm registry
    • RHEL/deb.debian
    • Microsoft Store
    • etc…
  • Приватные
    • Artifactory
    • Nexus
    • Github
    • GitLab

GitLab Registry

GitLab Registry: работа с сырым файлом

stages:
  - build
  - deploy

image: alpine
before_script:
  - apk add --update curl

build:
  stage: build
  script:
    - tar -cvf output.tar .
    - >-
      curl
      --header "JOB-TOKEN: $CI_JOB_TOKEN"
      --upload-file output.tar
      "$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/tararchive/0.0.0/archive.tar"

deploy:
  stage: deploy
  script:
    - >-
      curl
      --header "JOB-TOKEN: $CI_JOB_TOKEN"
      -o input.tar
      "$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/tararchive/0.0.0/archive.tar"
    - tar -xvf input.tar

GitLab Registry: работа с Python-пакетом

stages:
  - build
  - deploy

image: python:3.11

build:
  stage: build
  cache:
    paths:
      - .pip/
  variables:
    PIP_CACHE_DIR: "$CI_PROJECT_DIR/.pip"
    TWINE_USERNAME: "gitlab-ci-token"
    TWINE_PASSWORD: "$CI_JOB_TOKEN"
  script:
    - pip install build twine
    - python -m build
    - python -m twine upload --repository-url $CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/pypi dist/*


deploy:
  stage: deploy
  cache:
    paths:
      - .pip/
  variables:
    PIP_CACHE_DIR: "$CI_PROJECT_DIR/.pip"
    PIP_EXTRA_INDEX_URL: "https://gitlab-ci-token:$CI_JOB_TOKEN@$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/pypi/simple"
  script:
    - pip install -U yourmodule
    - python -m yourmodule

GitLab Registry: работа с Docker-образом

stages:
  - build
  - deploy

build:
  stage: build
  image: docker
  services:
    - docker:dind
  script:
    - echo $CI_JOB_TOKEN | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
    - docker build -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG" .
    - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"

deploy:
  stage: deploy
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
  when: manual
  tags:
    - prod
  script:
    - echo $CI_JOB_TOKEN | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin
    - docker pull "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
    - docker stop prod
    - docker rm prod
    - docker run -p 80:80 --name prod "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"

Nexus/Artifactory

Узкоспециализированные решения по хранению артефактов имеют широкий дополнительный функционал, кроме собственно хранения артефактов:

  • Зеркала репозиториев — локальный кэш и доступ к репозиториям из закрытых сред
  • Виртуальные репозитории — группировка существующих репозиториев
  • Тонкая настройка доступов
  • Аудит безопасности