Ничто так не волнует меня, как пустой холст, на котором возможности безграничны. Это побуждает к размышлениям о том, как я могу внедрять инновации и улучшать предыдущий опыт, чтобы создавать и использовать что-то лучше, чем раньше. С основанием 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]