| 현상

 

macOS 업데이트 후, il2cpp 빌드 중 clang++와 같은 ndk 관련 툴 사용 중 위와 같은 에러가 발생

stdout:
Building libil2cpp.so with AndroidToolChain
    Output directory: /Users/<usr>/.jenkins/workspace/<job>/Temp/StagingArea/assets/bin/Data/Native/armeabi-v7a
    Cache directory: /Users/<usr>/.jenkins/workspace/<job>/Library/il2cpp_android_armeabi-v7a/il2cpp_cache
ObjectFiles: 998 of which compiled: 371
    Time Compile: 74211 milliseconds Il2CppTypeDefinitions.cpp
    Time Compile: 68481 milliseconds Il2CppMethodPointerTable.cpp
    Time Compile: 55285 milliseconds Il2CppAttributes.cpp
    Time Compile: 41421 milliseconds Il2CppMetadataUsage.cpp
    Time Compile: 26292 milliseconds Il2CppInvokerTable.cpp
    Time Compile: 17629 milliseconds Il2CppGenericMethodPointerTable.cpp
    Time Compile: 12918 milliseconds Il2CppGenericClassTable.cpp
    Time Compile: 10404 milliseconds Bulk_Assembly-CSharp_26.cpp
    Time Compile: 9629 milliseconds Bulk_Assembly-CSharp_49.cpp
    Time Compile: 9063 milliseconds Bulk_Assembly-CSharp_144.cpp
Total compilation time: 98643 milliseconds.
il2cpp.exe didn't catch exception: Unity.IL2CPP.Building.BuilderFailedException: /Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ @"/var/folders/wp/pskqw4ns3cn27r6k10158xkc0000gn/T/tmpWedXj6.tmp" -o "/Users/<usr>/.jenkins/workspace/<job>/Library/il2cpp_android_armeabi-v7a/il2cpp_cache/linkresult_6F0877EF66902EFEC137A171BB702A20/libil2cpp.so" -shared -Wl,-soname,libil2cpp.so -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--gc-sections -Wl,--build-id --sysroot "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/platforms/android-16/arch-arm" -gcc-toolchain "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64" -target armv7-none-linux-androideabi -Wl,--wrap,sigaction -L "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a" -lgnustl_static -llog -rdynamic -fuse-ld=gold
 
clang++: error: unable to execute command: Killed: 9
clang++: error: linker command failed due to signal (use -v to see invocation)
 
 
   at Unity.IL2CPP.Building.CppProgramBuilder.PostprocessObjectFiles(HashSet`1 objectFiles, CppToolChainContext toolChainContext)
   at Unity.IL2CPP.Building.CppProgramBuilder.Build(IBuildStatistics& statistics)
   at il2cpp.Program.DoRun(String[] args)
   at il2cpp.Program.Run(String[] args)
   at il2cpp.Program.Main(String[] args)
stderr:
 
Unhandled Exception: Unity.IL2CPP.Building.BuilderFailedException: /Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ @"/var/folders/wp/pskqw4ns3cn27r6k10158xkc0000gn/T/tmpWedXj6.tmp" -o "/Users/<usr>/.jenkins/workspace/<job>/Library/il2cpp_android_armeabi-v7a/il2cpp_cache/linkresult_6F0877EF66902EFEC137A171BB702A20/libil2cpp.so" -shared -Wl,-soname,libil2cpp.so -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--gc-sections -Wl,--build-id --sysroot "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/platforms/android-16/arch-arm" -gcc-toolchain "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64" -target armv7-none-linux-androideabi -Wl,--wrap,sigaction -L "/Users/<usr>/Library/Android/sdk/ndk/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a" -lgnustl_static -llog -rdynamic -fuse-ld=gold
 
clang++: error: unable to execute command: Killed: 9

 

 

| 원인

 

macOS Catalina 업데이트 후 보안이 강화되었다.

확인되지 않은 개발자의 앱을 열려는 경우, 경고 팝업이 발생.

 

 

| 해결방법

 

차단된 앱을 허용하기 위해선 시스템 환경 설정 > 보안 및 개인 정보 보호 > 일반 > 확인 없이 허용 버튼을 눌러서 차단을 해제하는 방법도 있지만 NDK에서 새로운 앱을 사용할때마다 차단을 하나하나 해줘야하는 번거로움이 있습니다.

보안엔 안좋을 수 있지만, 아래 방법을 통해서 앱에 해당 보안 설정을 모두 허용해주도록 합니다.

sudo spctl --master-disable

해당 명령어를 터미널에서 입력 후 적용을 위해서 재부팅 필요.

 

반응형

| 플러그인 설치

 

  • Jenkins > Jenkins 관리 > 플러그인 관리 > Available plugins > S3 검색
  • S3 Publisher 설치

 

| 환결성정

 

  • Jenkins > Jenkins 관리 > 시스템 설정 > Amazon S3 profiles > '추가' 버튼 클릭
  • 아래와 같이 Profile name / Access key / Secret key를 입력

 

| JOB 설정

 

  • 사용할 Profile을 선택
  • Source: 업로드할 파일의 경로를 입력 (ant glob syntax를 따름)
  • Exclude: 제외되어야 할 파일 경로 혹은 패턴
  • Destination bucket: 파일을 업로드할 위치
  • Storage class: 아마존 S3 스토리지 클래스 [자세히 알아보기]
  • Bucket Region: ap-northest-2 [Asia Pacific (Seoul) Region]

 

| 참고

 

 

 

객체 스토리지 클래스 – Amazon S3

 

aws.amazon.com

 

 

아시아 태평양(서울) 리전 - AWS CloudFormation

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

 

FileSet Type

erroronmissingdir Specify what happens if the base directory does not exist. If true a build error will happen, if false, the fileset will be ignored/empty. Since Apache Ant 1.7.1 No; defaults to true (for backward compatibility reasons)

ant.apache.org

 

반응형

| 패키치 설치

 

brew install akamai

특정 버전 설치의 경우: brew install akamai@{version} 
e.g. brew install akamai@1.2.1

패키지 설치 후 커맨드도 별도로 설치가 필요하다

 

Usage:
  akamai [global flags] command [command flags] [arguments...]
 
Commands:
  config
  install (alias: get)
  list
  search
  uninstall
  update
  upgrade
  help
 
Global Flags:
  --edgerc value, -e value                 Location of the credentials file [$AKAMAI_EDGERC]
  --section value, -s value                Section of the credentials file [$AKAMAI_EDGERC_SECTION]
  --accountkey value, --account-key value  Account switch key [$AKAMAI_EDGERC_ACCOUNT_KEY]
  --help                                   show help (default: false)
  --bash                                   Output bash auto-complete (default: false)
  --zsh                                    Output zsh auto-complete (default: false)
  --proxy value                            Set a proxy to use
  --version                                Output CLI version (default: false)
 
Copyright (C) Akamai Technologies, Inc

 

 

| 커맨드 설치

 

akamai install purge

 

 

| Authentication credentials 만들기

 

 

Create authentication credentials

Follow these steps to create an authentication credential that contains the client token and client secret required to authenticate Akamai API, CLI, or Terraform requests.👍In order to complete these steps, you need access to Akamai Control Center and a

techdocs.akamai.com

 

 

| 자격증명 설정

 

cli를 실행하기 위해선 위에서 만든 인증 자격증명 파일을 이용해 인증을 하게 된다. 
(이때 커스텀 HTTP 요청 서명 프로토콜인 EdgeGrid를 이용)

인증 자격증명 파일은 클라이언트 토큰/시크릿 , 호스트, 액세스 토큰 등의 내용이 기입된다.

 

[ccu]
client_secret = {client_secret}
host = {host}
access_token = {access_token}
client_token = {client_token}

 

 

| 젠킨스 설정

 

 

  1. 젠킨스 > 잡 > 설정 
  2. 파라미터 추가 > 문자열 파라미터 CACHE_URL 추가
  3. 빌드 스탭 > Exectue Shell 추가
  4. akamai purge delete $CACHE_URL 기입
반응형

| 현상

 

젠킨스에서 Subversion 플러그인으로 체크아웃을 받는 도중 E175002 SVNException 에러가 발생하는 현상

ERROR: Failed to check out https://URL@REVISION
org.tmatesoft.svn.core.SVNException: svn: E175002: Connection reset
svn: E175002: REPORT request failed on '/svn/REPO/!svn/vcc/default'
    at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:112)
    at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:96)
    at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:765)
    at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:352)
    at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:340)
    at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.performHttpRequest(DAVConnection.java:910)
    at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.doReport(DAVConnection.java:363)
    ...중략...
Caused by: java.net.SocketException: Connection reset
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:323)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
    at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
   ...중략...
Caused: org.tmatesoft.svn.core.SVNException: svn: E175002: Connection reset
svn: E175002: REPORT request failed on '/svn/REPO/!svn/vcc/default'
    at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:112)
    at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:96)
    at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:765)
    at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:352)
    at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:340)
    ...중략...
Caused: java.io.IOException: Failed to check out https://URL@REVISION
    at hudson.scm.subversion.CheckoutUpdater$SubversionUpdateTask.perform(CheckoutUpdater.java:150)
    at hudson.scm.subversion.WorkspaceUpdater$UpdateTask.delegateTo(WorkspaceUpdater.java:168)
    at hudson.scm.subversion.WorkspaceUpdater$UpdateTask.delegateTo(WorkspaceUpdater.java:176)
    at hudson.scm.subversion.UpdateUpdater$TaskImpl.perform(UpdateUpdater.java:191)
    at hudson.scm.subversion.WorkspaceUpdater$UpdateTask.delegateTo(WorkspaceUpdater.java:168)
    ...중략...
Archiving artifacts
Finished: FAILURE

 

| 해결방법

 

1. /usr/local/opt/jenkins 혹은 /usr/local/Cellar/jenkins 폴더에서 homebrew.mxcl.jenkins.plist 파일 열기

(homebrew 설치 기준)
2. ProgramArguments에 위 사진과 같이 옵션 입력
3. 젠킨스 재시작

반응형

'Workspace > Jenkins' 카테고리의 다른 글

[Jenkins] AWS S3 통합 가이드  (0) 2023.08.21
[Jenkins] akamai cli 통합 가이드  (0) 2023.08.18
[Jenkins] AppCenter 연동  (0) 2023.03.27
[Jenkins] akamai cli 통합 가이드  (0) 2023.03.24
[Jenkins] 원결 빌드 유발  (0) 2023.03.23

앱센터란 어플리케이션 빌드, 테스트 및 배포 솔루션으로 분석 및 진단 서비스도 제공되어 상태나 사용량을 모니터링할 수 있다.

앱센터는 전신격이라고 할 수 있는 하키앱이란 서비스를 기능을 확장/개편하면서 Visual Stuido App Center라는 새 간판을 달았다.

2014년 하키앱이 MS에 인수되고, 2019년 11월 앱센터로 전환되었다.
 

홈페이지 개요를 보면 빌드에서 배포, 테스트까지 할 수 있는 거 같은데

필자는 젠킨스와 애증의 관계로 빌드는 젠킨스, 빌드 배포는 앱센터로 하기로 한다.

 

| 회원가입

 
 

App Center

 

appcenter.ms

우선 위 홈페이지로 가서 회원가입을 해준다.

 

| 조직 설정

빈 화면이 우리를 반겨주니 어서 앱 혹은 조직을 추가해보자.

우측 상단 Add new 버튼을 클릭하여 [앱] 혹은 [조직]을 추가하자.

 

※별도의 조직 없이 앱을 추가할 수 도 있다.

(조직과 앱에 대한 자세한 내용은 따로 다뤄보도록 한다.)

 

| 앱 설정

  • 앱명과 아이콘, Release 타입, OS 그리고 플랫폼을 입력
  • Add new app 버튼 클릭
제안된 릴리즈 타입, 원하는 것이 없다면 Custom을 이용

앱 설정까지 끝냈다면 기반은 완성이다.

이제 빌드 결과물 업로드, 배포 그룹 설정, 릴리즈 버전 관리 등의 작업이 가능하다.

 

| API 설정방법

이제 생성된 [조직] 혹은 [앱]에 젠킨스를 통해서 업로드하는 설정을 해볼 것이다.

우선 선행되어야하는 것이 API 토큰을 생성하는 것이다.

 

  1. API 토큰 생성
 
  • 생성된 앱 > Settings > App API tokens > New API tokens 버튼 클릭
토큰은 다시 확인할 수 없으니 반드시 백업이 필요하다.

대충 토큰 명을 입력하고, 권한을 설정하고 토큰을 Add new API token버튼 클릭하면 아래와 같은 팝업이 뜬다.

 

 

| 젠킨스 설정

1. App Center 플러그인 설치

Manage Jenkins Manage Plugins > Available plugins > App center 입력 > 플러그인 설치

 

2. 잡 설정

  • Post-build Actions에 Upload app to AppCenter 추가
 
  • 추가된 빌드 액션에 아래 값들을 설정 (필수 입력 값: API Token, Owner Name, App Name, Path To App, Distribution Groups, 나머지는 선택적 입력 값)
 
 
 
변수명
비고
API Token
위에서 발급한 API Token
40자리
Owner Name
유저명
생성한 앱의 URL 참조
App Name
앱명
생성한 앱의 URL 참조
Path To App
빌드파일의 상대 경로
 
Distribution Groups
배포 그룹
그룹명 혹은 멤버명
(콤마(,)로 추가) ex) Collaborators, QA
Mandatory Update
강제업데이트 여부
 
Notify Testers
알림 여부
 
Build Version
빌드 버전
 
Path To Debug Symbols
디버그용 심볼 경로
 
Branch Name
깃 브랜치명
origin/master or $GIT_BRANCH
Commit Hash
깃 커밋 해쉬값
$GIT_COMMIT
Release Notes
릴리즈 노트
5000자 제한
Release Notes From A File
릴리즈 노트 파일 경로
path/${NOTES}.md

 

3. URL 설정

Owner Name, App Name은 각각 생성한 앱 URL을 참조하여 입력한다.

조직내 앱을 추가한 경우)

https://appcenter.ms/orgs/${OwnerName}/apps/${AppName}

 

#조직 없이 앱을 생성한 경우)

https://appcenter.ms/users/${OwnerName}/apps/${AppName}

 

반응형

| 패키지 설치

 

brew install akamai
 

특정 버전 설치의 경우: brew install akamai@{version}

e.g. brew install akamai@1.2.1

 

패키지 설치 후 커맨드도 별도로 설치가 필요하다

Usage:
  akamai [global flags] command [command flags] [arguments...]
 
Commands:
  config
  install (alias: get)
  list
  search
  uninstall
  update
  upgrade
  help
 
Global Flags:
  --edgerc value, -e value                 Location of the credentials file [$AKAMAI_EDGERC]
  --section value, -s value                Section of the credentials file [$AKAMAI_EDGERC_SECTION]
  --accountkey value, --account-key value  Account switch key [$AKAMAI_EDGERC_ACCOUNT_KEY]
  --help                                   show help (default: false)
  --bash                                   Output bash auto-complete (default: false)
  --zsh                                    Output zsh auto-complete (default: false)
  --proxy value                            Set a proxy to use
  --version                                Output CLI version (default: false)
 
Copyright (C) Akamai Technologies, Inc
 

| 커맨드 설치

akamai install purge
 

| Authentication credentials 만들기

| 자격 증명 설정

cli를 실행하기 위해선 위에서 만든 인증 자격증명 파일을 이용해 인증을 하게 된다.

(이때 커스텀 HTTP 요청 서명 프로토콜인 EdgeGrid를 이용)

 

인증 자격증명 파일은 클라이언트 토큰/시크릿 , 호스트, 액세스 토큰 등의 내용이 기입된다.

 

[ccu]
client_secret = {client_secret}
host = {host}
access_token = {access_token}
client_token = {client_token}
 

위 내용이 작성된 파일을 /Users/{username}/.edgerc 경로에 저장

 

| 젠킨스 설정

 

  1. 젠킨스 > 잡 > 설정
  2. 파라미터 추가 > 문자열 파라미터 CACHE_URL 추가
  3. 빌드 스탭 > Exectue Shell 추가
  4. akamai purge delete $CACHE_URL 기입

 

반응형

 

| 개요

젠킨스를 사용하다 보면 원격으로 빌드를 유발이 필요한 경우가 생기는데, 다행히도 해당 기능을 제공하고 있다.

원격 빌드를 유발하는 방법에 대해 간단히 서술하고자 한다.

 

| JOB 설정

우선 원격 빌드를 유발할 잡 설정(Configure)으로 들어가서 `Build Triggers` 섹션으로 가면 `Trigger builds remotely (e.g., from scripts)` 토글을 켜면 Token을 입력할 수 있다.

 

  • JOB 설정 > 빌드 유발(Build Triggers) > 빌드 원격으로 유발 (Trigger build remotly) > Authentication Token

 

 

| 호출 URL

위에서 설정한 TOKEN은 query string형태로 함께 넘겨주면 되고, paramerter가 있을 경우에도 함께 넘겨 주면 된다. URL 아래와 같다.

// 파라미터가 없는 경우
{JENKINS_URL}/job/{JOB_NAME}/build?token={TOKEN_NAME}

// 파라미터가 있는 경우
{JENKINS_URL}/job/{JOB_NAME}/buildWithParameters?&token={TOKEN}&{KEY1}={VALUE1}&{KEY2}={VALUE2}
 

| API Token 생성 및 설정

보안 설정에 따라서 로그인 인증이 필요한 경우가 있다. 로그인 인증을 위해선 우선 API Token 발급이 필요하다.

 

※로그인 인증 과정을 생략해주는 플러그인도 있다.

 

  • People > {USER_ID} > Configure > API Token 섹션 > Add new Token

({JENKINS_URL}/user/{USER_ID}/configure)

 

이제 발급된 API Token과 함께 URL을 호출해주면 된다.

// 파라미터가 없는 경우
http://{USER_ID}:{API_TOKEN}@{JENKINS_URL}/job/{JOB_NAME}/build?token={TOKEN_NAME}

// 파라미터가 있는 경우
http://{USER_ID}:{API_TOKEN}@{JENKINS_URL}/job/{JOB_NAME}/buildWithParameters?&token={TOKEN}&{KEY1}={VALUE1}&{KEY2}={VALUE2}
 

| 참고

  • https://wiki.jenkins.io/display/JENKINS/Remote+access+API

 

 

반응형

| 개요

 

젠킨스에선 프로젝트를 주기적으로 실행할 수 있는 기능을 제공한다.
(리눅스 크론의 그것과 유사)

크론문법과 호환이 되며 간단하게 스케쥴링을 할 수 있고,
Parameterized Scheduler 플러그인을 사용하여 빌드에 인자를 주는 것 또한 가능하다.

하지만, 변경점이 없는 경우에도 지정된 스케쥴에 따라 반복 빌드 되기 때문에
‘지속적인 통합’이라는 관점에서 적합하지 않다.

(젠킨스에서도 SCM(SVN, GIT등)에서 변경점을 폴링하여 빌드가 되도록 구축할 것을 권장한다.)

그럼에도 데일리 빌드와 같은 간단한 작업을 예약하는데 유용하기 때문에
이 기능을 사용할 것이며, 이에 사용법에 대해 설명하려고 한다.

 

| 설정방법

1. 프로젝트 구성

  • 프로젝트 > 설정
  • [Build Triggers]에서 Build periodically with parameters 선택
  • Schedule란에 주기 설정

 

2. 주기 설정 방법

각각 5개(분, 시간, 일, 월, 요일)의 주기를 지정하고
사이사이 공백이나 탭을 두어 구분하여 구성하면 된다.

 

예) 45 9 * * 1-5

 

  • 분 시간 일 월 요일 순서
  • 분 (0-59), 시간 (0-23), 일 (1-31), 월 (1-12), 요일 (0-7)
  • 와일드 카드는 * 로 지정
  • N-N2: N과 N2사이의 범위를 지정
  • N-N2/X 혹은 */X: X의 간격을 지정 (X마다)
  • N,N1,N2…NM: 여러개의 값을 지정
  • 월요일: 1 ~ 토요일: 6, 0 또는 7: 일요일
주기를 설정할 경우 'H' 심볼 사용을 권장하는데, 이는 빌드가 고루 분산되어 실행되는 효과를 얻을 수 있다.
즉 젠킨스가 리소스나 부하의 정도에 따라 시간을 결정한다.

 

| 예제

1. 간격 시간 지정

# 매 30분 마다 실행
H/30 * * * *

# 매일 오전 9시, 오후 7시 실행
* 9,12 * * *

2. 특정 시간 지정

# 금요일 오후 7시 마다 실행(주중 결산)
H 19 * * 5

# 주중(월-금) 오전 8시 마다 실행
H 8 * * 1-5

3. 파라미터 지정

# 월-금, 오전 10시부터 오후 6시 중 매 2시간 마다 실행
H 10-18/2 * * 1-5 %PARAM_NAME1=PARAM1;PARAM_NAME2=PARAM2

# 예시
H 10-18/2 * * 1-5 %APP_VERSION=1.5.7;ASSET_BUNDLE_BUILD=true

4. 기타 예제

# 매 15분 마다
H/15 * * * *

# 매 시간 0 ~ 30분 사이의 10분 마다
H(0-29)/10 * * * *

# 매주 평일 오전 9시 45분 ~ 오후 3시 45분 사이의 매 2시간 마다
45 9-16/2 * * 1-5

# 매주 평일 오전 8시 ~ 오후 4시 사이 2시간 마다 1번
H H(8-15)/2 * * 1-5

# 12월을 제외한 매달 1일과 15일마다 1번
H H 1,15 1-11 *

 

반응형

+ Recent posts