본문 바로가기

Dev/CICD

[Jenkins] 전체 사용자 권한 조회 및 CSV 파일 생성

  • 프로젝트 진행 간 구현 내용을 글로 작성합니다.
  • 요구사항
    • Jenkins 전체 사용자의 Folder, Job 별 권한을 조회하고 그 결과를 CSV로 생성
  • Jenkins 전체 사용자 Job 별 권한 조회 -> CSV 파일 생성 파이프라인 구현
  • 코드 내용
    • // MngJenkinsUtils.groovy
      // 젠킨스 관리를 위한 메서드를 구현
      
      def getAllUserJobAndFolderPermissions() {
      
          def jenkins = Jenkins.getInstanceOrNull()
          if (jenkins == null) {
              println "[ERROR] Jenkins 인스턴스를 가져올 수 없습니다."
              return [:]
          }
      
          def permissions = [:]
          User.getAll().each { user ->
              def userId = user.getId()
              if (userId == null || userId.trim().isEmpty()) return
              def userName = user.getFullName()
              def userPermissions = [:]
              try {
                  def userAuth = user.impersonate()
                  // 폴더 권한 조회
                  jenkins.getAllItems(Folder.class).each { folder ->
                      try {
                          def folderPermissions = []
                          def acl = folder.getACL()
                          
                          if (acl.hasPermission(userAuth, Item.READ)) {
                              folderPermissions.add("Read")
                          }
                          
                          if (acl.hasPermission(userAuth, Item.BUILD)) {
                              folderPermissions.add("Build")
                          }
                          
                          if (acl.hasPermission(userAuth, Item.CANCEL)) {
                              folderPermissions.add("Cancel")
                          }
      
                          if (!folderPermissions.isEmpty()) {
                              userPermissions.put(folder.getFullName(), folderPermissions)
                          }
                      } catch (Exception e) {
                          println "[WARNING] Folder '${folder.getFullName()}' 권한 조회 중 오류 발생: ${e.message}"
                      }
                  }
      
                  // Job 권한 조회
                  jenkins.getAllItems(Job.class).each { job ->
                      try {
                          def jobPermissions = []
                          def acl = job.getACL()
      
                          if (acl.hasPermission(userAuth, Item.READ)) {
                              jobPermissions.add("Read")
                          }
                          if (acl.hasPermission(userAuth, Item.BUILD)) {
      
                              jobPermissions.add("Build")
                          }
                          if (acl.hasPermission(userAuth, Item.CANCEL)) {
                              jobPermissions.add("Cancel")
                          }
                          if (!jobPermissions.isEmpty()) {
                              userPermissions.put(job.getFullName(), jobPermissions)
                          }
                      } catch (Exception e) {
                          println "[WARNING] Job '${job.getFullName()}' 권한 조회 중 오류 발생: ${e.message}"
                      }
                  }
              } catch (Exception e) {
                  println "[ERROR] 사용자 '${userId}'의 인증 정보를 가져오는 중 오류 발생: ${e.message}"
                  return
              }
      
              if (!userPermissions.isEmpty()) {
                  permissions.put(userId, [userName: userName, permissions: userPermissions])
              }
          }
          return permissions
      }
      
      def generateUserJobPermissionsCsv(String outputFilePath) {
      
          def permissions = getAllUserJobAndFolderPermissions()
          def csvContent = new StringBuilder()
      
          // UTF-8 BOM 추가 (Excel에서 한글 깨짐 방지)
          csvContent.append("\uFEFF")
          csvContent.append("사용자 ID,사용자 이름,Job 이름,권한\n")
      
          permissions.each { userId, userData ->
              def userName = userData.userName // 사용자 이름을 userData에서 가져옴
              def jobs = userData.permissions // 사용자 권한 정보
      
              jobs.each { job, jobPermissions ->
                  def permissionsString = jobPermissions ? jobPermissions.join(",") : "없음"
                  echo "${userId}, ${userName}, ${job}, ${permissionsString}"
      csvContent.append("${userId},${userName},${job},${permissionsString}\n")
              }
          }
      
          // UTF-8 인코딩으로 파일 저장
          writeFile file: outputFilePath, text: csvContent.toString(), encoding: 'UTF-8'
          echo "[INFO] 권한 조회 결과가 CSV 파일로 저장되었습니다: ${outputFilePath}"
          archiveArtifacts artifacts: "*.csv", fingerprint: true
      }
      
      return this
      
      ```

  • 개발 중 이슈 사항
    • 엑셀에 빈 userId 값이 들어간다.
    • 엑셀 열기 시 한글 깨짐 현상
    • 해결 내용
      • 엑셀에 빈 userId 값 들어간 row 생성된 이유
        • 실제로 userId가 비어있는 항목이 존재했음
        • 어떤 계정인진 모름, 시스템 계정? or 잘못 생성된 계정
          아마 잘못 생성된 계정일 확률이 높을 듯?
          • -> null 이외에 빈값("")도 예외 처리 하도록 추가
      • 한글 깨짐 현상
        • Windows 메모장이나 리눅스 서버 내에서 vi로 열었을 땐 문제없이 잘 출력됨.
        • Excel로 열 시 깨짐 현상 발생
        • 인코딩 문제인가? -> jenkinsfile에서 writeFile function에 encoding 옵션 추가
          • // UTF-8 인코딩으로 파일 저장
                writeFile file: outputFilePath, text: csvContent.toString(), encoding: 'UTF-8'
          • 하지만 해결되지 않아서 검색 중 BOM(Byte Order Mark) 관련된 내용을 발견했고, 코드에 추가함
          • csvContent.append("\uFEFF")
            csvContent.append("사용자 ID,Job 이름,권한\n")
             
          • 해당 코드를 추가했더니 깨짐 현상이 없어졌다.

'Dev > CICD' 카테고리의 다른 글

[Jenkins] 사용자 권한 자동 검증 기능 구현  (0) 2025.04.08