DevSafetyOps

Jenkins 권한 자동화 Script


Jenkins 권한 자동화

목차


사용 목적

Jenkins에서 사용자에게 권한을 할당하지 않다면 모든 Job Item들을 보게 되거나 Overall/Read 권한 오류가 발생한다. “test”라는 ID를 가진 사용자는 “test_job”이라는 Job만 볼 수 있도록 권한을 할당하고 싶을 때, UI에서 번거롭게 설정하기보다 Script 실행으로 권한을 할당하려 한다.


사용 방법

0. Project-based Matrix Authorization Strategy 플러그인 설치 확인

  • Jenkins 관리 > Plugin Manager > 설치된 플러그인 목록 > Matrix Authorization Strategy Plugin 확인

plugin

1. Jenkins 관리자 계정 권한 확인

  • Project-based Matrix Authorization Strategy 설정이 아니라면 UI 혹은 Jenkins Script Console에서 실행
    • UI

      • Jenkins 관리 > Configure Global Security > Project-based Matrix Authorization Strategy 설정
        01_authori-1
      • Add user 클릭
        01_authori-2
      • 관리자 계정 User ID 설정
        01_authori-3
      • Overall/Administer 체크박스 클릭 후 Save
        01_authori-4
    • Script Console

      import hudson.model.*
      import jenkins.model.*
      import hudson.security.*
      
      def adminID = "admin"
      
      def jenkins = Jenkins.getInstance()
      
      def pmas = jenkins.getAuthorizationStrategy()
      if (!(pmas instanceof ProjectMatrixAuthorizationStrategy)) {
          pmas = new ProjectMatrixAuthorizationStrategy()
          jenkins.setAuthorizationStrategy(pmas)
      }
      
      // "admin"에게 모든 권한 추가
      pmas.add(Jenkins.ADMINISTER, "${adminID}")
      
      jenkins.save()
      
      

2. 필요 파일 설치

  • jenkins-cli.jar
    • Ubuntu 사용 시
      sudo wget http://[Jenkins URL]/jnlpJars/jenkins-cli.jar
      
    • UI에서 다운로드 시
      Jenkins 관리 > Jenkins CLI > jenkins-cli.jar 하이퍼링크 클릭
      jenkins-cli.jar
  • groovy 파일 저장
    • 파일 이름 예시: jenkinsAuto.groovy
    • 코드
    import hudson.model.*
    import jenkins.model.*
    import hudson.security.*
          
    def grantReadPermission(String userID, String jobName) {
        // 초기값 설정
        def jenkins = Jenkins.getInstance()
        def user = User.get("${userID}", false, null)
        def job = jenkins.getItemByFullName("${jobName}", Job.class)
    
        // 플러그인 설정
        def pmas = jenkins.getAuthorizationStrategy()
        if (!(pmas instanceof ProjectMatrixAuthorizationStrategy)) {
            pmas = new ProjectMatrixAuthorizationStrategy()
            jenkins.setAuthorizationStrategy(pmas)
        }
          
        // Overall/READ 권한
        pmas.add(Jenkins.READ, "${userID}")
          
        jenkins.save()
          
        // 사용자별 Job 권한 설정
        AuthorizationMatrixProperty amp = job.getProperty(AuthorizationMatrixProperty.class)
        if (amp == null) {
            amp = new AuthorizationMatrixProperty()
            job.addProperty(amp)
        }
          
        amp.add(Job.READ, "${userID}")
          
        job.save()
    }
    
    
    // 값 받아오기
    def customUserID = args[0]
    def customJobName = args[1]
    grantReadPermission(customUserID, customJobName)
    

3. 권한 부여

  • Terminal 창에서 실행
  • jenkins-cli.jar && groovy 파일이 존재하는 위치에서 실행
java -jar jenkins-cli.jar -s http://[JENKINS_URL]/ -auth [USER_NAME]:[API_TOKEN] groovy =< [GROOVY_FILE_NAME].groovy "[NEW_USER_ID]" "[NEW_JOB_NAME]" 
JENKINS_URL: Jenkins URL 주소
USER_NAME: 관리자 계정 ID
API_TOKEN: Jenkins API Token
GROOVY_FILE_NAME: Groovy 파일 이름
NEW_USER_ID: 권한 할당할 사용자 ID
NEW_JOB_NAME: 사용자에게 권한 할당할 Job 이름
// 예시

java -jar jenkins-cli.jar -s http://localhost:18080/ -auth admin:jenkinsToken groovy =< jenkinsAuto.groovy "test" "test_job" 

결과

실행 전

03_test-1

실행 후

03_test-2

업데이트: