Jenkins 로그 한국어 깨지는 현상

jenkins 설치 폴더에 jenkins.xml 파일 수정

대부분  C:\Program Files\Jenkins

<arguments> 에 -Dfile.encoding=UTF8 추가

-jar 앞에 붙인다. 맨 뒤에 (war 파일 뒤에 붙였더니) 안됨

그리고 서비스 - Jenkins - 다시시작

 

 

그래도 젠킨스 내부에서 cmd 명령어 실행 시 한국어가 깨질 수 있다.

bat 실행 상단에 chcp 65001 (유니코드) 를 붙임

script {
     bat """
        chcp 65001
        // todo
        """
 }

 

 

Jenkins 환경변수 설정

안드로이드 CI/CD를 위해 SDK / NDK / JDK / Gradle 환경 변수를 설정 해 주어야 한다.

윈도우 환경변수 / 안드로이드 스튜디오 / 언리얼 에디터에서 설정한 환경변수와 달리 젠킨스에서 독립적으로 설정해 주어야 인식하는 것 같다.

 

Jenkins 관리 - 시스템 설정 - Global Properties

ANDROID_HOME - SDK 경로

ANDROID_NDK_HOME - NDK 경로

GRADLE_USER_HOME - Gradle 경로

 

 

JDK 는 Global Tool Configuration 에서 설정


Credentials 설정

인증정보를 담은 Credentials 파일 관리

 

Domain 아무거나 클릭 후 Add Credentials

 

 

타입에 맞게 사용

Perforce 같은 경우 프리스타일에서는 (Perforce Password Credential)을 사용

파이프라인에서는 Secret text로 해도 무방 (텍스트)


서브 노드 설정

젠킨스에서 명령을 내릴 때  현재 사용자의 권한에 따른 명령어를 실행할 때 엑세스 거부가 될 수도 있다.

 

Cmd에서의 whoami 와 Jenkins에서의 whoamI 가 다르기 때문 

PC Jenkins

그래서 PC사용자(Junyoung.park) 은 \\newmedia\moon 폴더에 접근 권한이 있지만 Jenkins는 폴더 접근권한이 없어서 엑세스가 거부된다.

 

 

다음과 같이 서브노드를 만들어야한다.

 

서브노드 설정에서 UseWebSocket을 체크한다.

 

해당 서브노드를 만들고 들어가면 다음과 같은 명령어를 실행하라고 한다.

이런 식으로 명령어가 뜨고 Cmd 창에서 한 줄씩 입력하여

agent.jar을 다운받고 java -jar~ 명령어로 실행하면 서브노드가 실행된다.

 

실행한 cmd 창은 닫으면 안되고 가끔 서브노드가 자동으로 꺼지는 경우가 있디.

그럴때 다시 java -jar~ 명령어로 다시 실행시켜야 한다.

 

만약 설치되어 있는 자바 버전이 높은 경우 다음과 같은 오류가 나타나면서 안될 수도 있다.

이 경우 시스템 환경변수에서 자바 버전을 낮게 세팅해야 한다.

 

 

Jenskins PC (서버PC) 에서 CI 작업과 CD 작업을 한번에 돌리면 늦게 들어간 작업이 실행되지 않는다.

(언리얼 빌드나 패키징은 한 컴퓨터 당 한 작업만 가능하기 때문)

 

그렇기 때문에 같은 프로젝트를 공유하는 작업은 한 노드 에서만 실행 가능 해야 한다.

 

서브노드 설정에 들어가서 Jenkins 작업이 이 노드를 사용하지않게 라벨 붙인 작업만 여기서 동작하도록 바꾼다.

그리고 각각 작업에서 해당 라벨을 붙인 작업만 동작하도록 설정한다.

프리스타일 파이프라인

 
 
 

7z

필자같은경우 젠킨스에서 압축을 하기위해 7z를 사용하였다.

https://www.7-zip.org/download.html

https://info.nrao.edu/computing/guide/file-access-and-archiving/7zip/7z-7za-command-line-guide

 

윈도우에서 환경변수 설정 했는데 인식을 못하여 CDM에 직접 입력을 하고 7z명령어를 실행해야 한다.

set PATH=%PATH%;C:\Program Files\7-Zip\

 

젠킨스 파이프라인에서 위의 명령어를 배치파일 안에다 넣어야 7z 명령어를 인식한다.

7z a {압축파일이름}.zip {패키징할폴더} -p{비밀번호}

(-p비밀번호 붙여 써야 합니다.)

7z 명령어 자체가 압축 이여서 따로 비밀번호만 설정할 수 는 없는 것 같다.

 


Jenkins Pipeline 문법 관련

 

젠킨스 파이프 라인에서 다음과 같이 줄 내림을 할 수 있다.

 

 

기본적으로 bat는 하나의 cmd 이다.

그래서 이전의 세팅한 변수를 다른 bat에서 인식할 수 없다.

 

 

Perforce

Jenkins Pipeline에서 P4를 사용할 때 다음과 같이 유저 / 포트 / 클라이언트와 함께 명령어를 사용하던가 아니면 P4 Set P4CLIENT = {변수} 명령어를 이용해야 cmd에서 해당 Perforce 서버에 명령어를 보낼 수 있다.

p4 add -d -f ${ZIPFILENAME}_P4.zip - 파일을 처음 추가할 때는 Add
p4 edit -c default ${ZIPFILENAME}_P4.zip - 파일을 변경 할 때는 edit  (CheckOut)

 


안드로이드 KeyStore

 

https://coderwall.com/p/r09hoq/android-generate-release-debug-keystores

https://developer.android.com/studio/publish/app-signing?hl=ko#debugmode 

 

안드로이드 앱을 플레이스토어에 올리려면 배포(만들 때)할 때 자신의 코드 서명 인증서로 서명을 해야 한다.

이후 이 서명이 동일해야 플레이스토어에서 앱 업데이트를 할 수 있다.

다른 사람이 앱을 바꿔치기 못하게 하기 위함

 

Play 앱 서명을 선택하지 않은 앱은 서명 키를 분실하면 앱을 업데이트할 수 없다.

Upload Key 구글 플레이에서 앱 서명을 위해 업로드 하기 전에 App Bundle 이나 APK에 서명하는 데 사용되는 키
App Signing Key 사용자의 기기에 설치된 APK에 서명하는데 사용되는 키

 

UploadKey

https://docs.unrealengine.com/4.27/ko/SharingAndReleasing/Mobile/Android/DistributionSigning/

 

C:\Program Files\Java\jre_버전\bin 폴더 에서 다음 명령어 실행

keytool -genkey -v -keystore my-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

 

언리얼 DefaultEngine.ini 에 다음과 같이 기본값으로 지정되어 있음

KeyStore=key.keystore
KeyAlias=Mykey
KeyStorePassword=787878
KeyPassword=787878

 

App Signing Key

디버깅 용 Android 앱에 서명하는데 사용되는 키는 Google에서 지정한대로 해야함

keytool -genkey -v -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000
  • 키 저장소 이름: "debug.keystore"
  • 키 저장소 비밀번호: "android"
  • 키 별칭: "androiddebugkey"
  • 키 비밀번호: "android"
  • CN: "CN=Android Debug,O=Android,C=US"

 

이 디버그 키가 있지 않으면 언리얼 빌드 시, 다음과 같은 경고가 뜨면서 패키징된 APK를 설치할 수 없다.

 

 


ssh agent 시간 초과 (불확실)

젠킨스에서 다른 PC 에 접속하기위해 sshagent를 사용할 때가 있는데

sshagent(credentials: [MAC_SSH_JENKINS])

 

이게 시간이 초과되는건지 중간에 어떠한 에러도 없이 그냥 파이프라인이 종료되 버린다.

왼쪽 (실패) / 오른쪽 (성공)

확실하지 않지만 해당 Stage에 걸리는 시간보다 더 긴 타임아웃을 추가하니까 성공적으로 명령어가 실행 된다.

 

timeoutactivity: true설정하면 (default : false) 

false - 해당 구문 부터 타임 아웃을 설정
true - 마지막 로그 출력 이후의 경과 시간으로 타임 아웃을 설정

 

timeout 이상이 지나면 과정을 생략하고 다음 스테이지로 넘어가는 것이라고 적혀있는데 timeout 만큼 기다려주는듯??

script{
    timeout(time: 1, unit: 'HOURS') {
    	... TODO
    }
}

(윈도우) 네트워크 공유 폴더

script{
	bat """
    	whoami
    """
}
nt authority\system

젠킨스 내부에서 whoami 명령어를 실행하게 되면  해당 사용자가 나오는 것을 확인할 수 있다.

 

위의 사용자는 로컬 시스템 수준에서 가장 높은 수준의 권한을 가진 기본 제공 Window 계정이지만,

네트워크 드라이브 입장에서는 사용자에게 범위가 매칭되기 때문에 Jenkins는 공유폴더에 대해 접근하지 못한다. 

Access is denied.

 

그렇기때문에 이미 컴퓨터가 공유폴더에 연결이 되어있더라고 젠킨스에 대해서 공유폴더를 다시 연결해야 한다.

net use {드라이브이름} {서버주소}{공유폴더} {암호/사용자}

ex) 네트워크 공유폴더 마운트
net use X: \\share.net\testFolder {비밀번호} /user:{사용자}

ex) 네트워크 공유폴더 언마운드
net use X: /delete

공유폴더에 마운트가 성공하면 

The command completed successfully.

 

 


파이프라인 관련

agent {
    node {
        label "노드 라벨"
        customWorkspace "시작할 경로"
    }
}

customWorkspace 설정한 후 chdir 하면 해당 경로로 시작하는것을 알 수 있음

 

 

ssh 원격 예제

stage('Sync From Perforce'){
    steps {
        echo "====================================="
        echo "Sync From Perforce Start"
        echo "====================================="

        withCredentials([
            [$class: 'UsernamePasswordMultiBinding',
                credentialsId: MAC_STUDIO_INFO,
                usernameVariable: 'MAC_USER',
                passwordVariable: 'MAC_PASSWORD'],
            [$class: 'UsernamePasswordMultiBinding',
                credentialsId: APPLE_DEVELOPER_APP,
                usernameVariable: 'APPLE_USER',
                passwordVariable: 'APPLE_APP_PASSWORD']
        ]) { 
            sshagent(credentials: [MAC_SSH_JENKINS]) {
                sh """

                    echo ${MAC_WORKSPACE_DIRECTORY}
                    echo ${MAC_ROOT_DIRECTORY}

                    ssh -o StrictHostKeyChecking=no ${MAC_USER}@${MAC_REMOTE_IP} '

                        unset P4CONFIG;
                        export P4PORT=${P4_PORT};
                        export P4CLIENT=${P4_CLIENT};
                        export P4USER=${P4_USER};
                        export P4CHARSET=utf8;
                        cd ${MAC_WORKSPACE_DIRECTORY}; 

                        /usr/local/bin/p4 sync //${P4_ROOTSTREAM}/${P4_STREAM}/...
                    '
                """
            }
        }
    }
}

 

MAC_STUDIO_INFO = Username with password
MAC_SSH_JENKINS = SSH Username with private key


MAC_SSH_JENKINS 세팅은 해당 문서 참조
https://moris0712.tistory.com/78
   

 

 

 

Bool 파라미터 검사해서 함수 실행여부 결정할 수도 있고 stage 자체를 건너뛰고싶다면 

when - expression 사용하면 조건에 맞으면 stage 실행, 맞지 않으면 아예 건너 뜀

stage('Copy To Window Shared Folder'){
    when {
        expression { bUploadSharedFolder == "Y" }
    }

    steps{
        script {
            Boolean bUpload = (bUploadSharedFolder == 'Y') ? true : false 
            Copy_To_Window_Shared_Folder(bUpload)
        }
    }
}

'Jenkins' 카테고리의 다른 글

Groovy 기초  (0) 2024.10.04
Jenkins CD (Unreal)  (0) 2023.06.05

+ Recent posts