2021-07-11に投稿

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 指定

Originally published at labor.ewigleere.net
ツイッターでシェア
みんなに共有、忘れないようにメモ

arm-band

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

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント