Github で特定ユーザの publicリポジトリ の名前の一覧を生成する Docker Compose

経緯

自分のあるリポジトリを 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 にファイルとしてダンプ。


これでやりたいことは実現できました。

参考

サンプル

jq

alpine で bash

starting container process caused: exec: “bash”: executable file not found in $PATH: unknown

alpineイメージ への entrypoint 指定

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。