You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
trustieforge/lib/tasks/sync_gitlab_user.rake

68 lines
2.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#coding=utf-8
namespace :gitlab do
desc "sync gitlab's users which lost in last sync"
task :add_gid => :environment do
users = User.find_by_sql("select * from users where gid is null")
s = Trustie::Gitlab::Sync.new
g = Gitlab.client
logger_i = Logger.new('./log/task_add_gid.log', 'daily')
logger_e = Logger.new('./log/task_add_gid_error.log', 'daily')
NAMESPACE_REGEX_STR = '(?:[a-zA-Z0-9_\.][a-zA-Z0-9_\-\.]*[a-zA-Z0-9_\-]|[a-zA-Z0-9_])'.freeze
MAIL_REGEX_STR ='^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$'.freeze
error_cnt=0
success_cnt=0
p "同步Gitlab用户开始..."
users.each do |user|
info="userid=#{user.id},mail=#{user.mail},login(username)=#{user.login},name=#{user.show_name}"
# username不能有特殊字符,不能有保留字符,邮箱特殊字符(比如‘>)导致search失败的name不能为空串
if !(user.login =~ /\A#{NAMESPACE_REGEX_STR}\Z/.freeze)
logger_e.error("#{info}error=校验失败username特殊字符")
error_cnt+=1
next
elsif !(user.mail.downcase =~ /#{MAIL_REGEX_STR}/)
logger_e.error("#{info}error=校验失败:邮箱特殊字符")
error_cnt+=1
next
elsif user.show_name.lstrip.rstrip.blank?
logger_e.error("#{info}error=校验失败name不正常")
error_cnt+=1
next
end
begin
us = g.get("/users?search=#{user.mail}")
if us.blank?
s.sync_user(user)
logger_i.info("sync_remote_user:id=#{user.id},mail=#{user.mail}")
success_cnt+=1
else
if Array === us
us.each do |u|
if u.email == user.mail
user.gid = u.id
# !爆炸方法抛出异常
user.save!
logger_i.info("sync_local_user:#{info}")
success_cnt+=1
end
end
end
end
rescue => e
logger_e.error("#{info},error=#{e}")
puts e
end
end
p "同步Gitlab用户结束..."
p "同步成功#{success_cnt},未完成#{error_cnt}"
end
task :sync_members => :environment do
projects = Project.all
s = Trustie::Gitlab::Sync.new
projects.each do |project|
puts project.id
s.only_members(project.first)
end
end
end