Ничто так не волнует меня, как пустой холст, на котором возможности безграничны. Это побуждает к размышлениям о том, как я могу внедрять инновации и улучшать предыдущий опыт, чтобы создавать и использовать что-то лучше, чем раньше. С основанием Infinic я нахожусь именно в этом положении.

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

  • Я получаю общий и мощный опыт местного развития
  • Я получаю краткий конвейер CICD, который использует точно такую ​​же среду.

Местное развитие

Я всегда чувствовал, что отличный и полный опыт локальной разработки необходим для ускорения разработки. В течение многих лет я рассчитывал на помощь Docker. Около двух лет назад я познакомился с экосистемой Nix и сразу оценил способ управления версиями сред — и их итераций — доступный для каждого члена команды. Два недостатка, с которыми я столкнулся, заключались в том, что сам язык Nix не самый интуитивно понятный, по крайней мере, не для меня. Честно говоря, я был немного ошеломлен строками кода Nix и наложениями, которые казались необходимыми для бесперебойной работы. Во-вторых, дополнительное количество линий, необходимое для того, чтобы все работало в конвейерах CICD, создавало много шума, IMO, затмевая суть конвейера.

Познакомьтесь с Девенв

Год назад я наткнулся на devenv.sh, горячую инициативу в прессе, которой кто-то поделился на канале Nix моей предыдущей работы. Предоставляя декларативный интерфейс, devenv стремится снизить барьер для языка и экосистемы Nix. Из коробки он позволяет вам просто включить наиболее распространенные инструменты, пакеты и языки, необходимые для начала работы. Тогда это выглядело очень многообещающе, и, учитывая мой пустой холст, это казалось прекрасной возможностью попробовать.

Я не буду направлять вас по установке, вы можете найти замечательную документацию здесь. Вместо этого я собираюсь показать вам несколько моих любимых вещей о devenv.

Мои любимые функции devenv

Вот список моих любимых функций в произвольном порядке.

Чистый интерфейс

Структура точки входа devenv devenv.nix очень проста и интуитивно понятна. В сочетании с сгенерированными примерами и ссылками на документацию в комментариях я быстро формировал свою среду!

Скрипты

Раньше у меня было много отдельных файлов сценариев для автоматизации и связывания вещей воедино. Devenv предоставляет специальный раздел для указания таких сценариев и удобной подготовки их к использованию в оболочке, как при вызове исполняемого файла. Это позволяет избавиться от файлов скриптов меньшего размера! Вот пример создания команды с именем foo.

scripts = {
    foo.exec = ‘’
      echo “foo”
      echo “bar”
    ‘’;
} 

Языки

Существует простой способ сделать ваши (предполагаемые) инструменты разработки доступными для выбранного вами языка программирования. Возьмем следующий пример:

languages = {
    javascript.enable = true;
    scala.enable = true;
 };

Эти линии дают нам node + npm и scala 3 + sbt соответственно. Возможна расширенная конфигурация для закрепления конкретных версий.

Компонуемость + услуги

Среды можно компоновать, то есть вы можете ссылаться на одну или несколько сред devenv в новую и использовать совокупность скриптов, языков и служб, которые вы определили ранее.

Один из примеров, когда это работает хорошо, следующий:

  • Создайте среду во вложенной папке api. Здесь мы включаем выбранный нами внутренний язык и определяем процесс, который запускает нашу службу API.
  • Создайте среду в подпапке ui. Здесь мы включаем javascript и typescript и определяем процесс для обслуживания внешнего интерфейса.
  • В корневой папке мы создаем новую среду, которая ссылается на оба, с devenv.yaml, выглядящим так:
inputs:
  nixpkgs:
    url: github:NixOS/nixpkgs/nixpkgs-unstable
imports:
- ./api
- ./ui

Когда мы входим в корневую папку в терминале — при условии, что вы также следовали инструкциям по установке direnv — оба процесса могут быть запущены одновременно при запуске

devenv up

Сделайте его еще более привлекательным, включив предопределенную службу nginx в корневом каталоге devenv.nix и предоставив действительный файл nginx.conf.

services = {
  nginx = {
    enable = true;
    httpConfig = (builtins.readFile ./nginx.conf);
  };
};

Предварительная фиксация + ci

Devenv создает файл .precommit-config.yml из своей конфигурации. Из коробки многие общие перехватчики предварительной фиксации становятся доступными, если их включить, как и языки:

pre-commit.hooks = {
    terraform-format.enable = true;
};

Также можно добавить собственные хуки или переопределить существующие, как в примере ниже:

pre-commit.hooks = {
  tflint = pkgs.lib.mkForce {
    enable = true;
    pass_filenames = false;
    files = "\\.tf$";
    entry = "${pkgs.tflint}/bin/tflint --recursive";
  };
};

Одна вещь, которую я еще не выяснил, но это было бы долгожданным дополнением, — это повторное использование существующих хуков, определенных в Интернете. Я понимаю, что это как бы противоречит цели devenv/nix, поскольку не позволяет надежно воспроизводить среду, но это сэкономит время при переходе к более нестандартным хукам, определенным devenv.

Если вы знакомы с предварительной фиксацией, вы знаете, что она будет выполнять все определенные проверки локально для измененных файлов, прежде чем фактически выполнить коммит git. Это поможет вам избежать неожиданностей на удаленном конвейере ci и избавит от беспорядочных коммитов исправления.

Еще одна замечательная особенность devenv заключается в том, что он использует хуки предварительной фиксации для всей кодовой базы (а не только для измененных файлов). Вы можете добиться этого с помощью следующей команды:

devenv ci

Это создаст среду и применит все хуки ко всей кодовой базе, чтобы убедиться, что все надежно. Это тот лайнер, который вы хотите запустить в своем конвейере CICD!

трубопроводы CICD

Я видел и использовал много различных решений CICD на протяжении многих лет. Поскольку мы используем Github для размещения нашего кода, я решил придерживаться Github Actions, чтобы свести к минимуму усилия по интеграции и ограничить количество поддерживаемых учетных записей.

В идеале я хочу воспроизвести точную локальную среду в моем конвейере CICD. Это ограничивает количество неожиданностей, когда что-то работает локально, но не работает в CI из-за, например, несоответствия версий зависимостей.

К счастью, я нашел два действия — несколько строк кода — которые достигают именно этого. Я заглянул в репозиторий devenv на github, чтобы узнать, как сделать devenv доступным:

name: "Perform CI checks"

on:
  pull_request:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: cachix/install-nix-action@v21
        with:
          extra_nix_config: |
            access-tokens = github.com=${{secrets.GITHUB_TOKEN}}
      - uses: cachix/cachix-action@v12
        with:
          name: devenv
      - name: Install devenv
        run: |
          nix profile remove ‘.*’ 
          nix profile install --accept-flake-config github:cachix/devenv/latest 
      - name: Perform CI checks
        run: |
          devenv ci

Это позволяет запустить первый набор проверок с помощью удобной команды devenv ci.

Теперь, если вы хотите запустить любую команду, которая обычно доступна в вашей локальной оболочке, я обнаружил, что самый простой способ добиться этого — также установить direnv. После установки он загрузит конфигурацию devenv в вашу оболочку.

- name: Install direnv
  uses: HatsuneMiku3939/direnv-action@v1
    with:
      direnvVersion: 2.32.1
- name: Run Terraform Plan
  run: |
    terraform init
    terraform plan

Все (пользовательские) сценарии и пакеты, которые вы сделали доступными, будут готовы к использованию в вашем конвейере! Одним из примеров, где я использовал это, был запуск команды «terraforme plan», чтобы предоставить обратную связь об ожидаемых изменениях ресурсов, вызванных запросом на вытягивание.

Заключение

Devenv — мой новый любимый подход к созданию воспроизводимой среды разработки. Над ним активно работают, и доступны частые обновления. До сих пор он был достаточно стабильным, чтобы поддерживать мои варианты использования — с несколькими сбоями, которые также были устранены очень быстро. Я призываю вас попробовать его и сделать devenv успешным. Чем больше сообщество, тем светлее его будущее!

Возможность найма

Вам нравится такой подход к предоставлению сред разработки? Вы герой в обеспечении бесперебойной работы производственного программного обеспечения? Вам нравится создавать среды в облаке? У вас есть большой опыт в улучшении процессов разработки? Я нанимаю опытного инженера DevOps (местоположение, провинция Утрехт, Нидерланды). Свяжитесь с нами по адресу [email protected]