«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Переход со сценария оболочки на сценарий «Булочка»

Переход со сценария оболочки на сценарий «Булочка»

Опубликовано 6 ноября 2024 г.
Просматривать:586

Migrating from shell script to \

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

В нашем случае большая часть разработки происходит под Linux, но нам также необходимо обеспечить совместимость с macOS. Это часто приводит к несовместимости кода.

Чтобы решить эту проблему, мы переносим функции наших сценариев оболочки в файлы JavaScript, используя Bun в качестве интерпретатора. Мы выбрали Bun, потому что он обеспечивает простой способ запуска команд, подобных оболочке, через функциональность Shell API.

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

Код сценария оболочки:

function zc_check_pristine_git() {
    if [ "$ZC_CURRENT_ENV" = "staging" ] || [ "$ZC_CURRENT_ENV" = "dev" ]; then
      return 0
    fi

    local not_pristine=0
    local modified_files=""

    # Check for staged but uncommitted changes
    staged_changes=$(git diff --name-only --cached)
    if [ -n "$staged_changes" ]; then
        not_pristine=1
        modified_files ="Staged changes:\n$staged_changes"
    fi

    # Check for unstaged changes
    unstaged_changes=$(git diff --name-only)
    if [ -n "$unstaged_changes" ]; then
        not_pristine=1
        modified_files ="Unstaged changes:\n$unstaged_changes"
    fi

    # Check for untracked files
    untracked_files=$(git ls-files --others --exclude-standard)
    if [ -n "$untracked_files" ]; then
        not_pristine=1
        modified_files ="Untracked files:\n$untracked_files"
    fi

    # Check if the current branch is ahead of the remote
    ahead_commits=$(git log @{u}.. --oneline)
    if [ -n "$ahead_commits" ]; then
        not_pristine=1
        modified_files ="Commits ahead of the remote:\n$ahead_commits\n\n"
    fi

    if [ $not_pristine -eq 1 ]; then
        echo -e "$modified_files"
        return 1
    fi

    return 0
}
||

; затем вернуть 0 фи местный not_pristine=0 локальные модифицированные_файлы="" # Проверьте наличие подготовленных, но незафиксированных изменений staged_changes=$(git diff --name-only --cached) if [ -n "$staged_changes"]; затем not_pristine=1 модифицированные_файлы = "Поэтапные изменения:\n$staged_changes" фи # Проверьте наличие неустановленных изменений unstaged_changes=$(git diff --name-only) if [ -n "$unstaged_changes"]; затем not_pristine=1 модифицированные_файлы = "Неустановленные изменения:\n$unstaged_changes" фи # Проверяем наличие неотслеживаемых файлов untracked_files=$(git ls-files --others --exclude-standard) if [ -n "$untracked_files"]; затем not_pristine=1 модифицированные_файлы = "Неотслеживаемые файлы:\n$untracked_files" фи # Проверяем, находится ли текущая ветка перед удаленной Ahead_commits=$(git log @{u}.. --oneline) if [ -n "$ahead_commits"]; затем not_pristine=1 Modified_files ="Выполняется раньше удаленного:\n$ahead_commits\n\n" фи если [$not_pristine -eq 1]; затем echo -e "$modified_files" вернуть 1 фи вернуть 0 }

Чтобы преобразовать этот код в JavaScript, мы создали файл с именем zc_check_pristine_git в каталоге bin проекта (который уже находится в PATH) со следующим содержимым:
#!/usr/bin/env bun
// @language JavaScript

import { checkPristineGit } from '../js/helpers/helpers.js';

await checkPristineGit({ currentEnv: process.env.ZC_CURRENT_ENV });

#!/usr/bin/env булочка // @language JavaScript импортировать { checkPristineGit } из '../js/helpers/helpers.js'; ждут checkPristineGit({currentEnv:process.env.ZC_CURRENT_ENV});

Мы использовали шебанг #!/usr/bin/env Bun, чтобы указать, что мы используем Bun в качестве интерпретатора.

Мы добавили комментарий // @language JavaScript, чтобы IDE распознавала файл как JavaScript (в основном мы используем инструменты Jetbrains).

Затем мы импортировали функцию, которая будет фактически выполнена.
Реализация функции, преобразованной из оболочки в JavaScript:

#!/usr/bin/env bun
// @language JavaScript

import { checkPristineGit } from '../js/helpers/helpers.js';

await checkPristineGit({ currentEnv: process.env.ZC_CURRENT_ENV });

export const checkPristineGit = async ({ currentEnv }) => { выходOnError(() => { notEmpty(currentEnv, 'требуется currentEnv'); }); if (['staging', 'dev'].includes(currentEnv)) { возвращаться; } пусть notPristine = 0; пусть модифицированные файлы = ''; // Проверяем наличие проиндексированных, но незафиксированных изменений const stagedChanges = await $`git diff --name-only --cached`.text(); if (stagedChanges !== '') { неPristine = 1; ModifiedFiles = `Поэтапные изменения:\n${stagedChanges}`; } // Проверяем наличие непроиндексированных изменений const unstagedChanges = await $`git diff --name-only`.text(); if (unstagedChanges !== '') { неPristine = 1; ModifiedFiles = `Неустановленные изменения:\n${unstagedChanges}`; } // Проверяем наличие неотслеживаемых файлов const untrackedFiles = await $`git ls-files --others --exclude-standard`.text(); if (untrackedFiles !== '') { неPristine = 1; ModifiedFiles = `Неотслеживаемые файлы:\n${untrackedFiles}`; } // Проверяем, опережает ли текущая ветка удаленную const beforeCommits = await $`git log @{u}.. --oneline`.text(); if (aheadCommits !== '') { неPristine = 1; ModifiedFiles = `Коммит перед удаленным:\n${aheadCommits}`; } если (notPristine) { console.warn('Ошибка: изменения в производственной среде можно применять только в том случае, если репозиторий находится в первозданном состоянии.'); console.warn(modifiedFiles); процесс.выход(1); } };


Таким образом, мы стандартизировали код JavaScript, который будет выполняться как сценарий оболочки.

Есть вызовы функций (exitOnError, notEmpty), которые не реализованы в приведенном примере.

Migrating from shell script to \

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/edimarlnx/migrating-from-shell-script-to-bun-script-4pnj?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3