При работе над проектом, ориентированным на автоматизацию процессов и инфраструктуру в 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
}
#!/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); } };
Есть вызовы функций (exitOnError, notEmpty), которые не реализованы в приведенном примере.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3