gitlabリポジトリ取得スクリプト API v4対応

前回作った自身のgitlabリポジトリ取得スクリプトが、動かなくなっていたので
確認したら、GitlabのAPI v3はもう使えなくなっていました。

{"error":"API V3 is no longer supported. Use API V4 instead."}

なので、v4に対応したスクリプトに修正したので、書いておきます。

前回記事: gitlabのリポジトリ取得用スクリプト

API v4 のリポジトリ一覧

v4で自身のリポジトリ一覧を取得するのは、この形。
アクセストークンの取得は前回の記事参照。
userは自身のリポジトリを示す。

curl --header "Private-Token: $token" \
    "https://gitlab.com/api/v4/users/$user/projects?visibility=private&page=1&per_page=100"

visibility

visibility を指定しないと、internalレベルまでしか取得できないようだ。
private を指定しておけば、
privateリポジトリまで取得することができる

page

デフォルトでは、最大20件分までしか取得できない。
per_page=100 で一ページあたり最大100件まで取得できるようになります。

API V4 ドキュメント

ユーザープロジェクト

https://docs.gitlab.com/ce/api/projects.html#list-user-projects

ペーシング

https://docs.gitlab.com/ce/api/#pagination

リポジトリ取得スクリプト

スクリプトの全容です。

#!/usr/bin/env bash

set -u

user="YOUR_GITLAB_USER_NAME"
tokenDir=~/.config/gitlab-token
tokenFile=token.enc

if [ ! -f "$tokenDir/$tokenFile" ]; then
    echo "Enter PrivateToken"
    read inputToken

    mkdir -p $tokenDir
    echo "$inputToken" | openssl aes-256-cbc -e -base64 -out $tokenDir/$tokenFile
    echo "Private-Token saved."
fi

# token取得
token=$(cat $tokenDir/$tokenFile | openssl aes-256-cbc -d -base64)
if [ 0 -ne $? ]; then
    echo "Invalid password."
    exit 1
fi

# ページャごとに取得
repos=
page=1
while :; do
    list=$(curl --header "Private-Token: $token" \
        "https://gitlab.com/api/v4/users/$user/projects?visibility=private&per_page=100&page=$page" | \
        jq -r ".[].ssh_url_to_repo")

    if [ -z "$list" ]; then
        break
    fi

    repos="$repos $list"
    page=$((page + 1))
done

if [ -z "$repos" ]; then
    echo "取得出来るリポジトリがみつかりません"
    exit 1
fi

# ソート
repos=$(for v in $repos; do echo $v; done | sort)

# 取得するリポジトリを選択
echo "取得するリポジトリを選んでください"
PS3='>>> '
select repository in $repos; do
    [ -z "$repository" ] && exit 0
    break
done

# git clone
git clone --recursive $repository

ページが何件あるのかわからないので、
whileループで取れなくなるまでページをインクリメントしています。
(件数取得するAPIあるのかな??)

コメントを残す