#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