3 분 소요

Sagan 의 shell script 리뷰


bisect.sh

#!/bin/bash
BAD=962958c
GOOD=b742859
git bisect start $BAD $GOOD --
git bisect run ./gradlew clean build -x gitProperties
git bisect reset

bisect.sh 는 짧은 깃 명령어 스크립트였습니다. git bisect --help 로 살펴보면, 좋은 커밋과 나쁜 커밋을 인수로 받고, 이진검색으로 어떤 커밋에서 문제가 생겼는지 찾기 위해 사용된다고 합니다. git bisect run ... 으로 테스트를 해 보고, 괜찮으면 현재 커밋을 GOOD 으로, 여전히 문제가 있으면 BAD 로 두면서 사용했을 것 같습니다. ./gradlew clean build -x gitProperties 는 테스트용 빌드 과정에서 sagan-stie 모듈의 gradle plugin 인 com.gorylenko.gradle-git-properties 를 사용하지 않기 위함입니다. gitProperty 깃허브

convert-tabs-to-spaces.sh

#!/bin/bash
git ls-files | xargs file | grep text | cut -d":" -f1 | xargs -Ifile tab2space -lf file file

파이프가 길게 이어져 있는 또 다른 깃 명령어 쉘 스크립트입니다… 다행히 파일 제목이 매우 정직해요.

  1. 맨 첫줄엔 사용할 쉘을 특정해 줍니다. 따라서 해석에 sh 이 아니라 bash 를 씁니다.
  2. 먼저 git ls-files 는 추적되고 있는 파일들을 전부 나열해 줍니다. 참고로 git help 에선 표시되지 않는 명령어입니다.
  3. | xargsfile 에 인자(파일) 전달해 줍니다. 파일 정보를 다음으로 넘깁니다. (예시 : practice.sh: a bin/bash script, ASCII text executable)
  4. 앞선 예시의 표준출력처럼, “text” 가 있는 경우 grep 으로 잡아냅니다.
  5. cut 으로 일부만 다음으로 넘겨줍니다. 예시 대로라면 practice.sh 까지만 넘어가겠네요. (옵션의 -f1 은 0-index 가 아닙니다!!)
  6. 마지막으로, tab2space 가 사용됩니다. -lf 는 줄바꿈으로 line feed 만 쓰겠다는 것이고 (windows:CRLF, Mac:CR, Unix:LF) 뒷자리는 input / output 으로 둘다 파이프로 넘어온 file 을 쓰겠네요. tab2space 문서

결과적으로 text 파일의 tab, 줄바꿈을 정리해 주는 역할을 하겠네요.

recreate-elasticsearch-index.sh

#! /bin/sh

# Clear and re-configure the search index.

if [ $# != 2 ]; then cat << EOM

    usage: $0 ENDPOINT INDEX

    where ENDPOINT is the path to the qbox.io endpoint (or http://localhost:9200)
      and INDEX is the name of the endpoint, e.g. 'sagan-production'

EOM
    exit
fi


ENDPOINT=$1
INDEX=$2

echo "\nDelete the existing index."
curl -XDELETE "$ENDPOINT/$INDEX"
sleep 1

echo "\nCreate the index again."
curl -X PUT $ENDPOINT/$INDEX -d '{ "number_of_shards" : 5, "number_of_replicas" : 0}'
sleep 1
echo "\nClosing index."
curl -XPOST "$ENDPOINT/$INDEX/_close"
sleep 1
curl -XPUT $ENDPOINT/$INDEX/_settings -d @../sagan-site/src/main/resources/elasticsearch/settings.json
sleep 1
echo "\nInstall the mapping - do once per type/mapping file."
curl -XPOST "$ENDPOINT/$INDEX/apidoc/_mapping" -d @../sagan-site/src/main/resources/elasticsearch/mappings/apidoc.json
sleep 1
curl -XPOST "$ENDPOINT/$INDEX/blogpost/_mapping" -d @../sagan-site/src/main/resources/elasticsearch/mappings/blogpost.json
sleep 1
curl -XPOST "$ENDPOINT/$INDEX/guidedoc/_mapping" -d @../sagan-site/src/main/resources/elasticsearch/mappings/guidedoc.json
sleep 1
curl -XPOST "$ENDPOINT/$INDEX/referencedoc/_mapping" -d @../sagan-site/src/main/resources/elasticsearch/mappings/referencedoc.json
sleep 1
curl -XPOST "$ENDPOINT/$INDEX/sitepage/_mapping" -d @../sagan-site/src/main/resources/elasticsearch/mappings/sitepage.json
sleep 1
curl -XPOST "$ENDPOINT/$INDEX/projectpage/_mapping" -d @../sagan-site/src/main/resources/elasticsearch/mappings/projectpage.json
sleep 1
curl -XPOST "$ENDPOINT/$INDEX/_open"
sleep 1

echo "\nCheck the settings."
curl $ENDPOINT/$INDEX/_settings?pretty=true
sleep 1

echo "\nCheck the mappings."
curl $ENDPOINT/$INDEX/_mapping?pretty=true

elastic search 라는 서비스를 위해(?) 만든 스크립트인 것 같습니다.

  1. $# 로 받은 인자 갯수를 보고, cat 뒷부분은 here doc 이라는 형식입니다. $0 는 파일 자기 자신이고, $1, $2 를 사용하겠네요. 인수 조건이 맞지 않으면 설명을 해주고 종료됩니다.
  2. 여러 url 에 curl 을 날립니다.

elastic search 는 검색엔진이라 나오는데, 정확히 어떤 동작을 하는진 알기가 힘드네요. resource/elasticsearch/ 디렉토리도 없어서…

replicate-db.sh

#!/bin/sh

if [ $# != 2 ]; then cat << EOM
    usage: $0 DB_URL_SOURCE DB_URL_DESTINATION
EOM
    exit
fi

echo "Creating dump from $1"
pg_dump -a -O $1  > /tmp/dump.sql

echo "Replicating into $2"
psql $2 -c "truncate memberprofile restart identity cascade"
psql $2 -c "truncate databasechangelog"
psql $2 -c "truncate databasechangeloglock"
psql $2 < /tmp/dump.sql

원본 db 로 부터 덤프를 받아서 다른 곳에 복사하는 스크립트네요. pg_dump, psql 모두 PostgreSQL 에서 사용하는 도구입니다.

이상한 건 sagan 프로젝트 내에 다른 부분엔 PostgreSQL 에 대한 의존이 없다는 점인데… 어디에 사용했을지 좀 궁금하네요.

마치며

반복되는 요소가 있다면 마땅히 시스테마틱 하게 끝낼 수 있도록 하는 게 도리겠죠. 사실 지금 쓰는 블로그의 디버깅 모드도 batch 파일로 실행하고 있습니다. (2 줄 밖에 안되긴 함…) Batch 로도 별로 작성한 건 없으나 Linux shell script 는 경험이 거의 전무하니 (Docker 겉핥기 할때 조금밖에…) 생각나는 게 있으면 열심히 만들어 봐야겠습니다.