GitLab APIには gitlab gem があり、簡単に使う事ができます。
以下のコードは、 あるグループに所属する全員の レポジトリーの一覧を表示し、そのリポジトリをアクセスするために自分のアカウントを管理者として登録し、全リポジトリーを clone するコードです。
PRIVATE_TOKEN
は管理者(root)アカウントの PRIVATE_TOKEN
を指定して下さい。
#!/usr/bin/env ruby
require 'gitlab'
GUEST_LEVEL = 10
MASTER_LEVEL = 40
GITLAB_SERVER_URL = 'http://GITLAB_SERVER'
GITLAB_API_URL = "#{GITLAB_SERVER_URL}/api/v3"
PRIVATE_TOKEN = 'xxxXXXXXXXXXXxxXXXXn'
GROUP_NAME = 'student'
MY_NAME = 'yuumi3'
def get_group_members(gitlab_root, group_id)
gitlab_root.group_members(group_id).select{|e| e.access_level == GUEST_LEVEL}.map(&:username)
end
def add_member_to_projects(gitlab_member, user_id)
gitlab_member.projects.each do |project|
unless gitlab_member.team_members(project.id).find {|m| m.id == user_id}
gitlab_member.add_team_member(project.id, user_id, MASTER_LEVEL)
puts " add users to #{project.path_with_namespace}"
end
end
end
def list_all_projects(gitlab_member)
gitlab_member.projects.each do |project|
puts " #{project.path_with_namespace}"
end
end
def clone_all_projects(gitlab_member)
gitlab_member.projects.each do |project|
unless File.exists?(project.path_with_namespace)
cmd = "git clone git@#{GITLAB_SERVER_URL}:#{project.path_with_namespace} #{project.path_with_namespace}"
puts " #{cmd}"
system cmd
end
end
end
gitlab_root = Gitlab.client(endpoint: GITLAB_API_URL, private_token: PRIVATE_TOKEN)
username_to_id = Hash[*gitlab_root.users.map {|u| [u.username, u.id]}.flatten]
groupname_to_id = Hash[*gitlab_root.groups.map {|u| [u.name, u.id]}.flatten]
members = get_group_members(gitlab_root, groupname_to_id[GROUP_NAME])
# 生徒のrepository一覧
members.each do |member|
gitlab_member = Gitlab.client(endpoint: GITLAB_API_URL, private_token: PRIVATE_TOKEN, sudo: member)
list_all_projects(gitlab_member)
end
# 生徒のrepositoryに私を管理者として追加
members.each do |member|
gitlab_member = Gitlab.client(endpoint: GITLAB_API_URL, private_token: PRIVATE_TOKEN, sudo: member)
add_member_to_projects(gitlab_member, username_to_id[MY_NAME])
end
# 生徒のrepositoryをclone
members.each do |member|
gitlab_member = Gitlab.client(endpoint: GITLAB_API_URL, private_token: PRIVATE_TOKEN, sudo: member)
clone_all_projects(gitlab_member)
end
Examples: http://narkoz.github.io/gitlab/usage
Original: http://d.hatena.ne.jp/yuum3/20140529/1401330812