mystic-agit 개발 블로그

[Jenkins] pipeline 스크립트에서 sudo 명령 사용 (feat. xcode-select) 본문

CI-CD/Jenkins

[Jenkins] pipeline 스크립트에서 sudo 명령 사용 (feat. xcode-select)

mystic-agit 2024. 7. 15. 18:32

[목 차]

1. sudo 명령으로 Xcode 타겟팅 버전 변경

2. 비밀번호를 다시 묻지 않도록 한번에 입력하기

3. Jenkins에서 pipeline 코드 구성

4. Jenkins에 비밀번호 권한 부여


 

Jenkins의 Pipeline 스크립트 코드에서 sudo 명령을 통해 Mac에서 제어하고 싶은 환경 설정들이 있다.

예로, 간혹 Xcode를 여러 버전 설치해둔 경우 경우에 따라 샘플 빌드 시 하나의 단말에서 Xcode 타겟팅을 변경해야 한다.

다만, 개인 단말이 아닌 빌드 머신인 경우 구성원 간 CICD 단말에 접근 권한이 없는 경우 이를 진행하기 어렵다.

 

개발 그룹원들만 내부 망에서 Jenkins를 사용한다는 조건으로 sudo 코드를 사용한 스크립트를 사용할 수 있게 구성을 해보았다.

 

1. sudo 명령으로 Xcode 타겟팅 버전 변경

 

Xcode 타겟팅 설정을 변경할 경우 아래의 코드를 사용한다.

 

sudo xcode-select --switch /Applications/Xcode_${ver}.app
// 또는 
sudo xcode-select -s /Applications/Xcode_${ver}.app/Contents/Developer

 

sudo 명령을 수행할 경우 이후 동작에서 Mac의 단말 비밀번호를 입력해야 코드를 수행할 수 있다.

Jenkins에서 이런 코드를 사용하게되면 비밀번호를 입력할 수 없어 진행이 멈추거나 실패할 것이다.

 

2. 비밀번호를 다시 묻지 않도록 한번에 입력하기

 

일단 비밀번호가 노출되지만 가장 간단한 방법이 있다.

 

echo ‘${password}' | sudo -S xcode-select --switch /Applications/Xcode_${ver}.app

 

이렇게 할 경우 echo에서 명시한 비밀번호를 사용하여 되묻지 않고코드가 바로 실행된다.

다만, 콘솔에서 비밀번호가 노출되어 보안에 매우 취약하다.

 

3. Jenkins에서 pipeline 코드 구성

 

비밀번호 노출을 막기 위해 Credential에 비밀번호를 입력하여 사용할 수 있다.

'Jenkins 관리 > Credential' 메뉴에 들어가서 Secret Text를 추가하면 된다.

 

  • Kind : Secret Text
  • Scope : 해당 값 사용 범위
  • Secret : 사용할 값 (value)
  • ID : 변수명 (key)
  • Description : Jenkins 콘솔에 보일 설명

이후, Pipeline 코드를 아래처럼 작성하였다.

 

node('myAgent001') {
    stage('set xcode version') {
        sh 'xcode-select -p'   // 현재 설정된 xcode 버전 확인
        
        // 버전 변경 및 셋팅
        withCredentials([string(credentialsId: 'mac_password', variable: 'sudo_password')]) {
            sh """
            echo ${sudo_password} | sudo -S xcode-select --switch /Applications/Xcode_${ver}.app
            """
        }   
        sh 'xcode-select -p'   // 현재 설정된 xcode 버전 확인
    }
}

 

과연 동작은??

 

sudo 코드 호출 시 무한 대기중 발생....

아마도 Jenkins에서 비밀번호 권한에 대해서 처리를 하지 못해 대기가 걸리는 것으로 보인다. 해당 단말에서 별도의 창이 열려있어 비밀번호를 기다리는가 보았지만 그렇진 않았다. 대응이 필요하다...

 

4. Jenkins에 비밀번호 권한 부여

 

sudo의 환경 설정 파일인 visudo를 편집한다.

 

sudo visudo

 

해당 코드를 수행하면 vi를 통해 sudo에 관련된 내용을 확인할 수 있다.

아래에서 '# root and users in group wheel can run anything~' 항목이 있는 부분을 찾는다.

 

 

%admin~ 라인 하단에 아래와 같이 추가한다.

 

jenkins ALL=(ALL) NOPASSWD:ALL

 

이는 모든 명령을 no password로 구생하는 의미를 갖는다.

All이 아닌 일부 명령을 선언해주는 것이 좋다. (보안에 취약하니 주의하자!)

 

그리고 vi 저장을 위해 'Escape > :wq!'

 

이후에 3' 에서 작성하였던 Pipeline 코드를 다시 수행하면 대기가 발생하지 않고 / 별도로 비밀번호를 기다리지 않고 정상 수행된다.

Comments