Ao trabalhar em um projeto focado em automação de processos e infraestrutura no zCloud, frequentemente nos deparamos com a necessidade de criar múltiplas funções para realizar validações e processos comuns. Tudo funciona bem quando se utiliza apenas um sistema operacional, mas a situação fica complicada quando mais de um sistema está envolvido.
No nosso caso, a maior parte do desenvolvimento acontece no Linux, mas também precisamos garantir a compatibilidade com o macOS. Isso geralmente resulta em incompatibilidades de código.
Para resolver esse problema, estamos migrando nossas funções de script de shell para arquivos JavaScript, usando Bun como intérprete. Escolhemos o Bun porque ele fornece uma maneira simples de executar comandos como um shell por meio de sua funcionalidade Shell API.
Abaixo está um exemplo de uma função que usamos para verificar quaisquer alterações no código antes de aplicar modificações na infraestrutura.
Código do script de shell:
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 }||
; então
retornar 0
fi
local not_pristine=0
arquivos_modificados locais = ""
# Verifica se há alterações preparadas, mas não confirmadas
staged_changes=$(git diff --name-only --cached)
if [ -n "$staged_changes"]; então
not_pristine=1
modificado_files ="Alterações preparadas:\n$staged_changes"
fi
# Verifique se há alterações não planejadas
unstaged_changes=$(git diff --name-only)
if [ -n "$unstaged_changes"]; então
not_pristine=1
modificado_files ="Alterações não preparadas:\n$unstaged_changes"
fi
# Verifique se há arquivos não rastreados
untracked_files=$(git ls-files --others --exclude-standard)
if [ -n "$untracked_files"]; então
not_pristine=1
modificado_files ="Arquivos não rastreados:\n$untracked_files"
fi
# Verifica se a filial atual está à frente da remota
ahead_commits=$(git log @{u}.. --oneline)
se [ -n "$ahead_commits"]; então
not_pristine=1
modificado_files ="Commit antes do controle remoto:\n$ahead_commits\n\n"
fi
se [$not_pristine -eq 1]; então
echo -e "$arquivos_modificados"
retornar 1
fi
retornar 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 bun // @linguagem JavaScript importar { checkPristineGit } de '../js/helpers/helpers.js'; aguarde checkPristineGit({ currentEnv: process.env.ZC_CURRENT_ENV });
Usamos o shebang #!/usr/bin/env bun para indicar que estamos usando Bun como intérprete.
Adicionamos o comentário // @linguagem JavaScript para que o IDE reconheça o arquivo como JavaScript (usamos principalmente ferramentas Jetbrains).
Em seguida, importamos a função que realmente será executada.
Implementação da função convertida de shell para JavaScript:
#!/usr/bin/env bun // @language JavaScript import { checkPristineGit } from '../js/helpers/helpers.js'; await checkPristineGit({ currentEnv: process.env.ZC_CURRENT_ENV });
exportar const checkPristineGit = async ({ currentEnv }) => { exitOnError(() => { notEmpty(currentEnv, 'currentEnv é obrigatório'); }); if (['staging', 'dev'].includes(currentEnv)) { retornar; } deixe notPristine = 0; deixe arquivos modificados = ''; // Verifica se há alterações preparadas, mas não confirmadas const stagedChanges = aguarda $`git diff --name-only --cached`.text(); if (stagedChanges! == '') { nãoPristine = 1; modificadoFiles = `Alterações preparadas:\n${stagedChanges}`; } //Verifica se há alterações não preparadas const unstagedChanges = aguarda $`git diff --name-only`.text(); if (unstagedChanges! == '') { nãoPristine = 1; modificadoFiles = `Alterações não preparadas:\n${unstagedChanges}`; } //Verifica se há arquivos não rastreados const untrackedFiles = aguarda $`git ls-files --others --exclude-standard`.text(); if (arquivos não rastreados! == '') { nãoPristine = 1; modificadoFiles = `Arquivos não rastreados:\n${untrackedFiles}`; } // Verifica se o branch atual está à frente do remoto const aheadCommits = aguarda $`git log @{u}.. --oneline`.text(); if (aheadCommits! == '') { nãoPristine = 1; modificadoFiles = `Commit antes do remoto:\n${aheadCommits}`; } if (notPristine) { console.warn('Erro: Você só pode aplicar alterações em ambientes de produção se o repositório estiver em estado original.'); console.warn (arquivos modificados); processo.exit(1); } };
Existem chamadas para funções (exitOnError, notEmpty) que não são implementadas no exemplo fornecido.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3