|  |  | #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 |