Pular para o conteúdo

Worker em shell

Terminal window
oren init worker minha-task --template shell

Gera o contrato, a implementação, o Dockerfile e o worker. oren run dev funciona em seguida, sem nenhum comando Docker.

O template inclui worker/oren.sh:

Terminal window
oren_input() { jq -r "$1" "$OREN_INPUT_PATH"; }
oren_output() { cat > "$OREN_OUTPUT_PATH"; }
oren_log() { echo "$@" >&2; }
oren_fail() { echo "$@" >&2; exit 1; }
oren_path() { jq -r ".dependencies.\"$1\".path" "$OREN_CONTEXT_PATH"; }

Dez linhas. Para shell, a unidade de distribuição de um SDK é a imagem, não um gerenciador de pacotes — e isso generaliza para qualquer linguagem, inclusive as sem registry conveniente.

#!/bin/sh
set -eu
. /worker/oren.sh
mensagem=$(oren_input '.mensagem')
source_dir=$(oren_path 'source')
oren_log "processando $source_dir"
arquivos=$(find "$source_dir" -type f | wc -l | tr -d ' ')
jq -n --arg r "$mensagem" --argjson a "$arquivos" \
'{resultado: $r, arquivos: $a}' | oren_output

Este padrão quebra com qualquer valor que contenha espaço:

Terminal window
# ERRADO
for pair in $(jq -r '.vars | to_entries[] | "\(.key)=\(.value)"' "$INPUT"); do
args="$args -var=$pair"
done

conteudo: "criado pelo oren" vira três argumentos separados. O for ... in $(...) faz word splitting.

Use argumentos posicionais, que preservam espaços:

Terminal window
set --
while IFS= read -r pair; do
[ -n "$pair" ] && set -- "$@" "-var=$pair"
done <<FIM
$(jq -r '.vars | to_entries[] | "\(.key)=\(.value)"' "$INPUT")
FIM
terraform plan "$@"

Esse bug existiu em três workers oficiais antes de ser notado — vale conferir ao escrever qualquer worker em shell.