経緯
自分のあるリポジトリを clone しようとして、名前を失念。探すのに手間取ったのでリポジトリの名前の一覧を生成するスクリプトが欲しくなりました。
調査
調べたら Linuxコマンド でどうにかなりそうだったので、 Docker で Linux環境 を用意してごにょごにょしよう、と思い立ちました。
成果物
構成
ディレクトリ構造
PROJECT_ROOT/
├ docker/
│ └ Dockerfile
│
├ entrypoint/
│ └ entrypoint.sh
│
├ template/
│ └ script.sh // コンテナ内で実行したいスクリプトのテンプレート。一部変数をエントリポイントで置換
│
├ workspace/ // リポジトリ名一覧のテキストファイルのダンプ先
│
├ .env // docker-compose.yml 用の環境変数
└ docker-compose.yml
今回はこんなディレクトリ構造に。
docker-compose.yml
version: '3.8'
services:
hirokawa:
build:
context: ./docker
dockerfile: Dockerfile
args:
USER_NAME: $USER_NAME
FILE_NAME: $FILE_NAME
volumes:
# entrypoint
- ./entrypoint:/entrypoint
# workspace
- ./workspace:/workspace
# docker settings template
- ./template:/template
tty: true
entrypoint: /bin/sh -c "/bin/sh /entrypoint/entrypoint.sh $USER_NAME $FILE_NAME && /bin/sh"
リポジトリ名の一覧を取得したい対象ユーザ名とダンプ先ファイル名を .env
で指定しています。
.env
USER_NAME=saigyo
FILE_NAME=repository_list.txt
上述の通り。
docker/Dockerfile
FROM alpine:latest
RUN apk update && \
apk upgrade && \
apk add --no-cache \
jq \
bash \
sed \
curl
RUN mkdir /var/script
RUN chmod 777 /var/script
必要なパッケージのインストールとスクリプトの生成先のディレクトリの作成。
今回はやることが最小限なので alpine を使用。
entrypoint/entrypoint.sh
sed -e "s/USER_NAME/${1}/gi" -e "s/FILE_NAME/${2}/gi" /template/script.sh > /var/script/script.sh
一部変数名を .env
の値で置換。一行しかないので command でも良かったかも。
template/script.sh
for page in $(seq 1 10);
do result=$(curl -s "https://api.github.com/users/USER_NAME/repos?page=$page&per_page=100"|jq -c '[.[] .name]'|jq -c '.[]');
if [ -z "$result" ];
then break;
fi;
formatted_result=$(echo "$result"|sed -e "s/\"//gi");
echo "$formatted_result" > "/workspace/FILE_NAME";
done
実行するスクリプトのテンプレート。個人ユーザ対象で curl
で Github API を叩いて100個(指定可能な最大数)ずつ出力、 jq
でフィルタリングして、 workspace
にファイルとしてダンプ。
これでやりたいことは実現できました。
参考
サンプル
- GitHubのリポジトリを一覧化する(public/private両対応) – Qiita
- GitHubのレポジトリ一覧を取ってくるワンライナー
- [Shell script] Alpine LinuxのDockerコンテナ内で使うjqをインストールする方法