Записки погромиста

Записки погромиста на вольные темы

Автоматизация ежедневных задач програмиста с bash

1. Скрипт, который автоматически создает Pull Request.

Создадим следюущий скрипт:

current_branch=$(git rev-parse --abbrev-ref HEAD)
username=''
title=''
password=''

usage() {
    echo "Usage: open pr [-u <username>] [-p <password/token>] [-t <title of the PR>] <body of the PR>"
}

while getopts ":u:p:t:h" opt; do
    case $opt in
        u) username="$OPTARG";;
        p) password="$OPTARG";;
        t) title="$OPTARG";;
        h)
            usage
           exit
        \?) 
            echo "Invalid usage $OPTARG" >&2
            usage >&2
            exit 1
        ;;
    esac
done

shift "$((OPTIND - 1))"

if [[ $current_branch ]] == 'master'; then
    echo "You are already on master, create new branch, push it and then run this script" >&2
    exit 1
fi

check_is_set() {
    if [[ -z $2 ]]; then
        echo "Error: $1 must be set" >&2
        usage >&2
        exit 1
    fi
}

check_is_set "username" $username
check_is_set "password" $password
check_is_set "title" $title

data=$(cat <<-END
{
    "title": $title,
    "base": "master",
    "head": $current_branch,
    "body": "$@" // rest of the input
}

status_code=$(curl -s --user "$username:$password" -X POST "https://path-to-git" -d "$data" -w %{http_code} -o /dev/null)

if [[ status_code ]] == 201; then
    echo "Complete"
else
    echo "Error"
fi

rev-parse — это вспомогательгная команда, используемая для различных манипуляций с помощью дополнительных флагов, преобразуя эти данные в SHA1 хэш.

Отправление и получение данных из Node.js в Bash с помощью process.

Создадим JavaScript файл (не забудьте дать ему разрешение на исполнение — chmod +x) таким сожержанием:

#! /usr/bin/env node

const parse = require('querystring');

const [
    queryString,
    queryStringPropName,
    queryStringExpected
] = process.argv.slice(2);

if (!queryString || !queryStringPropName || !queryStringExpected) {
    process.stderr.write(`ERRPR, Must pass three args\n`);
    process.exit(1);
}

let value = parse(queryString)[queryStringPropName];

if (value === queryStringExpected) {
    process.stdout.write(`${value} is equal to ${queryStringExpected} \n`);
    process.exit(0);
} else {
    process.stderr.write(`${value} is not equal to ${queryStringExpected} \n`);
    process.exit(1);
}

Теперь, мы можем вызвать js скрипт таким образом

 ./qscheck 'foo=123&bar=456' foo 123

#! — такая последовательность символов называется shebang, когда скрипт с этим сиволом выполняется как программа в Unix системах, остаток строки после сивола рассматривается как имя программы-интерпретатора, в нашем случае это Node.js.

Трансформация данных из пайпа bash в Node.js  c помощью Transform Stream.

Преадположим, что у нас есть логи в таком формате:

{"level": "warn", message: "warning message"}
 {"level": "info", message: "info message"}
{"level": "error", message: "error message"}

Создадим скрипт, который будет фильтровать логи с уровнем error. Для этого создадим такой скрипт:

#! /usr/bin/env node

const { Transform } = require('stream');

class FilterLogs extends Transform {
    _transform(chunk, encoding, callback) {
    try {
        let jsonChunk = chunk.toString().split('\n').reduce((aggr, line) => {\
            if (line) {
                let json = JSON.parse(line);
                if (json.level === "error") {
                   arg.push(JSON.stringify(json));
                }
            }
        return aggr;
        }, []).join('\n');
    }

   if (jsonChunk) {
        this.push(jsonChunk + '\n');
    } 

    callback();
    }
   catch(error) {
       callback(error);
   }

} 

process.on('uncaughtException', () => {
    process.stderr.write(`Uncaught Exception: ${error.message}`);
    process.exit(1);
})

process.stdin
    .pipe(new FilterLogs())
    .pipe(process.stdout);

Теперь этот скрипт можно использовать таким образом tail -f | ./filter-pipe.js.

Published by

Оставьте комментарий