오픈소스 : Sagan Shell scripts
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
파이프가 길게 이어져 있는 또 다른 깃 명령어 쉘 스크립트입니다… 다행히 파일 제목이 매우 정직해요.
- 맨 첫줄엔 사용할 쉘을 특정해 줍니다. 따라서 해석에
sh
이 아니라bash
를 씁니다. - 먼저
git ls-files
는 추적되고 있는 파일들을 전부 나열해 줍니다. 참고로 git help 에선 표시되지 않는 명령어입니다. | xargs
로file
에 인자(파일) 전달해 줍니다. 파일 정보를 다음으로 넘깁니다. (예시 :practice.sh: a bin/bash script, ASCII text executable
)- 앞선 예시의 표준출력처럼, “text” 가 있는 경우
grep
으로 잡아냅니다. cut
으로 일부만 다음으로 넘겨줍니다. 예시 대로라면practice.sh
까지만 넘어가겠네요. (옵션의-f1
은 0-index 가 아닙니다!!)- 마지막으로,
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 라는 서비스를 위해(?) 만든 스크립트인 것 같습니다.
$#
로 받은 인자 갯수를 보고, cat 뒷부분은 here doc 이라는 형식입니다.$0
는 파일 자기 자신이고,$1
,$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 겉핥기 할때 조금밖에…) 생각나는 게 있으면 열심히 만들어 봐야겠습니다.