Rundeck 배포 구성하기

배포 과정을 게임서버 기준으로 설명을 하도록 하겠습니다.

아래의 그림은 배포 과정을 간략하게 정리하였습니다.

1539672269924

배포를 위한 준비

  • 각 노드들은 WinRM 설정이 되어 rundeck 과 연동이 되는지 확인이 필요합니다.

    프로젝트의 [commands] 메뉴의 기능으로 각 설정 되어 있는 노드의 상태를 확인합니다. 1537258291633

    연결이 정상적이지 않다면, 방화벽이 오픈 되어 있는지, 접속 계정 아이디,암호가 옳바른지 확인 합니다.

  • AWS command CLI 설치 Windows 64비트, 32비트
  • S3 cli 사용을 위한 설정이 필요합니다. 윈도우 커맨드창을 실행한 후 aws configure 를 실행하여, Access Key 와 Secret Access Key 를 입력 하시면 됩니다.
  c:\> aws configure
  AWS Access Key ID :
  AWS Secret Access Key :
  Default region name [] :
  Default output format [] : 
  • windows server 2012 인경우 Powershell 실행 권한 부여

    ps>Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
    

rundeck 배포를 위해서는 배포용 파일, 배포를 위한 버전 파일 의 두개 파일이 필요 합니다.

배포용 파일 : 빌드 시스템에서 배포용을 생성되는 파일입니다. 파일명 규칙은 특별히 지정된건 없습니다. 다만 파일명은 배포 버전 파일에 기록에 사용됩니다. ​ 예> GNSS_Game_20180402_1102.zip

배포 버전 파일 : 업로드 된 배포용 파일중 현재 배포를 해야 하는 파일명을 가지고 있습니다.

build_game.xml

<?xml version="1.0" encoding="utf-8"?> 
<File>GNSS_Game_20180402_1102</File> 

배포 파일 생성 및 버전 파일 생성

%DEPLOY_GAME% : 스크립트를 이용하여 배포 파일이 생성되는 경로

%OUTPUT_GAME% : 젠킨스를 이용하여 빌드된 결과 파일과 배포에 필요한 파일이 있는 경로

아래 내용은 젠킨스에서 Execute Windows batch command 항목의 내용입니다.

:: GAME 압축 및 S3 업로드 작업
:: %DEPLOY_GAME% 
:: %OUTPUT_GAME%
:: 압축할 파일 이름에 넣을 날짜, 시간를 설정합니다.
for /f "tokens=1,2 delims=:" %%a in ("%time%") do set hh=%%a&set mm=%%b
SET hh=%hh: =0%
:: 압축 파일 이름입니다.

SET FILENAME=Super_Game_%date:~0,4%%date:~5,2%%date:~8,2%_%hh%%mm%
:: 압축 파일 풀 경로
SET ZIPFILE=%DEPLOY_GAME%\%FILENAME%.zip

if not exist %DEPLOY_GAME%\NUL (
    md %DEPLOY_GAME%
)

:: 배포용 파일 압축
D:\Jenkins\script\7za.exe a %ZIPFILE% %OUTPUT_GAME%\*.* -r -x!*.pdb

:: 버전 파일 생성
SET BUILD_INFO=%DEPLOY_GAME%\build_game.xml
@ECHO Create build_game.xml.
@ECHO ^<?xml version="1.0" encoding="utf-8"?^> > %BUILD_INFO%
@ECHO ^<File^>%FILENAME%^</File^> >> %BUILD_INFO%

cd /D %DEPLOY_GAME%
:: 생성된 파일 S3 업로드
PowerShell.exe -executionpolicy remotesigned -Command D:\Jenkins\script\upload_game_s3.ps1 -file %ZIPFILE% -path %DEPLOY_GAME% -mode "qa"

배포를 위한 S3 폴더 구성

S3 버킷의 폴더 구성은 아래의 이미지와 같습니다. /build 이하에 각 서버별 배포 파일을 보관 할 수 있는 폴더와, 각 서버별 버전 xml 파일로 구성 되어 집니다.

1537256535052

Rundeck Node(Windows) 폴더 구성

배포를 위해서는 각 노드들의 경로를 통일 시켜야 합니다. Rundeck은 각노드들의 일괄 명령 처리로 동작을 하기 때문에 서버 배포 위치를 아래의 그림과 같이 드라이버 폴더 구성을 통일 시켜야 합니다.

/script : 배포에 필요한 파일들이 위치합니다. 배포 스크립트, 압축 파일등

/work : 배포 스크립트에서 사용되며, 배포 파일을 임시로 다운로드 및 압축, 백업 등에 사용됩니다.

/Gnss_Game : 게임 서버 배포가 되는 위치 입니다. 각 종 설정 파일과 게임에 필요한 파일들이 위치하며, 배포 스크립트에서 경로를 설정하면 자동 생성 됩니다.

/Gnss_Auth : 인증 서버 배포 되는 위치입니다. 게임서버와 동일하게 필요 파일들이 위치하며, 역시 스크립트에서 자동 생성됩니다.

1537257386654

배포를 위한 스크립트 구성

deploy_build_game.ps1 파일의 내용입니다. 아래의 스크립트를. [script] 폴더에 생성한 후에 필요 항목들을 수정 하시면 됩니다.

param([Parameter(Mandatory=$false)][string]$mode="qa" )

$ErrorActionPreference = "Stop"

$DEBUG_MODE = 1
# 1. Argument set #

$GAME_BUILDZONE = $mode
$GAME_BUILDTYPE = "Super_Game"

# S3 bucket set #
$AWS_S3_ADDR = "s3://super-build"
$AWS_S3_REGION = "us-east-1"

# 2. define variable #
write-output "."
write-output "[INFO][1] Define Variable..."
$TIME_CUR = Get-Date -UFormat '%Y-%m-%d %H:%M:%S'
write-output "[INFO] Start TIME : $TIME_CUR"
write-output "."

# 2-1. get hostname #
$HOSTNAME = hostname
# 2-2. get date / custom type #
$DATE_CUR = Get-Date -UFormat '%Y%m%d-%H%M'
$TIME_CUR = Get-Date -UFormat '%Y-%m-%d %H:%M:%S'

# 2-3. default PATH #
$DEF_FILE_INFO = "build_game.xml"
$DEF_FILE_INFO_SAMPLE = "build_game_sample.xml"
$DEF_PATH_BASE = "super"
$DEF_PATH_SCRIPT = "script"
#$DEF_PATH_SERVER = $GAME_BUILDTYPE
$DEF_PATH_BACKUP = Join-Path "work" "backup"
$DEF_PATH_WORK = Join-Path "work" "download"
$DEF_PATH_TMP = join-path "work" "tmp"

$DriveLetter = $PSCommandPath[0]

$PATH_BASE = $DriveLetter + ":\" + $DEF_PATH_BASE
$PATH_SCRIPT = join-path $PATH_BASE $DEF_PATH_SCRIPT

$PATH_SERVER =  join-path $PATH_BASE $GAME_BUILDTYPE
$PATH_SERVER_CONF = join-path $PATH_SERVER "conf"
$PATH_CONF = join-path $PATH_BASE "conf_game"

$PATH_BACKUP = join-path $PATH_BASE $DEF_PATH_BACKUP
$PATH_WORK = join-path $PATH_BASE $DEF_PATH_WORK
$PATH_WORK_SERVER = join-path $PATH_WORK $GAME_BUILDTYPE

$PATH_WORK_SERVER_CONF = $PATH_WORK_SERVER
$PATH_TMP = join-path $PATH_BASE $DEF_PATH_TMP

$FILE_BUILD_INFO = join-path $PATH_SERVER $DEF_FILE_INFO
if($DEBUG_MODE = 1) {
  write-output "[DEBUG] FILE_BUILD_INFO : $FILE_BUILD_INFO"
}
$FILE_BUILD_INFO_SAMPLE = join-path $PATH_SCRIPT $DEF_FILE_INFO_SAMPLE
if($DEBUG_MODE = 1) {
  write-output "[DEBUG] FILE_BUILD_INFO_SAMPLE : $FILE_BUILD_INFO_SAMPLE"
}

$FILE_BUILD_INFO_TMP = join-path $PATH_WORK_SERVER $DEF_FILE_INFO
if($DEBUG_MODE = 1) {
  write-output "[DEBUG] FILE_BUILD_INFO_TMP : $FILE_BUILD_INFO_TMP"
}

$PATH_S3_BUILD = "$AWS_S3_ADDR/" + "$GAME_BUILDZONE/" + "build/"
$PATH_S3_BUILD_CONF = "$AWS_S3_ADDR/" + "$GAME_BUILDZONE/" + "conf/"
$PATH_S3_SERVER = "$AWS_S3_ADDR/" + "$GAME_BUILDZONE/" + "build/" + "$GAME_BUILDTYPE/"
$PATH_S3_SERVER_CONF = "$AWS_S3_ADDR/" + "$GAME_BUILDZONE/" + "conf/" + "$GAME_BUILDTYPE/"
$FILE_S3_BUILD_INFO = "$AWS_S3_ADDR/" + "$GAME_BUILDZONE/" + "build/" + "$DEF_FILE_INFO"


if(!(Test-Path -Path $PATH_SERVER)){ mkdir $PATH_SERVER }
if(!(Test-Path -Path $PATH_BACKUP)){ mkdir $PATH_BACKUP }
if(!(Test-Path -Path $PATH_WORK)){ mkdir $PATH_WORK }
if(!(Test-Path -Path $PATH_WORK_SERVER)){ mkdir $PATH_WORK_SERVER }
if(!(Test-Path -Path $PATH_TMP)){ mkdir $PATH_TMP }

if(Test-Path $FILE_BUILD_INFO_TMP){
    remove-Item -force $FILE_BUILD_INFO_TMP
    write-output "[INFO] Completed for del to buildinfo.xml Temporary File"
}

if($DEBUG_MODE = 1) {
    write-output "[DEBUG] DEBUG MODE : On"
    if(Test-Path $FILE_BUILD_INFO){
      #remove-Item -force $FILE_BUILD_INFO
    }
    write-output "[DEBUG] Completed for del to buildinfo.xml File"
}

# 2. Download & Check for buildinfo.xml #
write-output "."
write-output "[INFO] BUILD Version Downloading & Checking Version..."
write-output "."


if(!(Test-Path $FILE_BUILD_INFO)){
    write-output "[INFO] File not found buildinfo.xml for Current BUILD"
    write-output "[INFO] Copy from Sample buildinfo.xml file"

    if(!(Test-Path -Path $PATH_SERVER)){ mkdir $PATH_SERVER }
    copy-item $FILE_BUILD_INFO_SAMPLE $FILE_BUILD_INFO
}

if(!(Test-Path $FILE_BUILD_INFO_TMP)){
    write-output "[INFO] Download from buildinfo.xml for NEW BUILD"

    aws s3 cp --region $AWS_S3_REGION $FILE_S3_BUILD_INFO $FILE_BUILD_INFO_TMP   > $null
    if($DEBUG_MODE = 1) {
      write-output "[DEBUG] aws s3 cp --region $AWS_S3_REGION $FILE_S3_BUILD_INFO $FILE_BUILD_INFO_TMP"
    }
}

[xml]$xml_cur_buildinfo = get-content $FILE_BUILD_INFO
$cur_ver = $xml_cur_buildinfo.File
[xml]$xml_new_buildinfo = get-content $FILE_BUILD_INFO_TMP
$new_ver = $xml_new_buildinfo.File

write-output "[INFO] +BUILD (Current Ver) = $cur_ver"
write-output "[INFO] +BUILD (New Ver) = $new_ver"


# -le means <=
if ($cur_ver -ne $new_ver) {
    Write-output "[INFO] Deploy start"

	
	$PATH_WORK_UNZIP = join-path $PATH_WORK_SERVER $new_ver
	if(!(Test-Path -Path $PATH_WORK_UNZIP)){ mkdir $PATH_WORK_UNZIP }

	
    #Download (BUILD)
    write-output "."
    write-output "[INFO] Downloading Build..."
    write-output "."

    # "GameServer-2016110300".zip/.tar.gz/
    $FILENAME_BUILD = "$new_ver" + ".zip"
    if($DEBUG_MODE = 1) {
    write-output "[DEBUG] FILENAME_BUILD : $FILENAME_BUILD"
    }
	
    $FILE_BUILD_WORK = join-path $PATH_WORK $FILENAME_BUILD
	
    if($DEBUG_MODE = 1) {
    write-output "[DEBUG] FILE_BUILD_WORK : $FILE_BUILD_WORK"
    }
    $FILE_S3_BUILD = "$PATH_S3_SERVER" + "$FILENAME_BUILD"
    if($DEBUG_MODE = 1) {
    write-output "[DEBUG] FILE_S3_BUILD : $FILE_S3_BUILD"
    }

    #download
    write-output "[INFO] Download to $FILE_S3_BUILD"
    aws s3 cp --region $AWS_S3_REGION $FILE_S3_BUILD $PATH_WORK > $null
    if($DEBUG_MODE = 1) {
    write-output "[DEBUG] aws s3 cp --region $AWS_S3_REGION $FILE_S3_BUILD $PATH_WORK"
    }
    $exe_zip = "$PATH_SCRIPT\unzip.exe"
    #uncompress
    #$exe_zip -x $FILE_BUILD_WORK $PATH_WORK_SERVER
	Invoke-Expression "& `"$exe_zip`" -o $FILE_BUILD_WORK -d $PATH_WORK_UNZIP"

    #Download (CONF)
    write-output "."
    write-output "[INFO] Downloading Build Configuration..."
    write-output "."
  
	
	
    $TARGET_PATH = join-path $PATH_WORK_UNZIP "."
	xcopy /E /Y $PATH_CONF\. $TARGET_PATH
    #aws s3 cp --region $AWS_S3_REGION --recursive $PATH_S3_SERVER_CONF $TARGET_PATH > $null
    if($DEBUG_MODE = 1) {
    write-output "[DEBUG] aws s3 cp --region $AWS_S3_REGION --recursive $PATH_S3_SERVER_CONF $TARGET_PATH"
    }

    #Deploy
    write-output "."
    write-output "[INFO] Deploying build..."
    write-output "."

    copy-item -recurse $PATH_WORK_UNZIP $PATH_SERVER
    write-output "[INFO] deploy source complted"
    copy-item -force $FILE_BUILD_INFO_TMP $PATH_SERVER
    write-output "[INFO] deploy buildinfo.xml complted"

    #clean
    write-output "."
    write-output "[INFO] Cleaning Work Build..."
    write-output "."

    if(Test-Path $FILE_BUILD_INFO_TMP){
        remove-item -force $FILE_BUILD_INFO_TMP
    }
	
    if(Test-Path -Path $PATH_WORK_SERVER){
        remove-item -recurse -force -path $PATH_WORK_SERVER
    }

    $TIME_CUR = Get-Date -UFormat '%Y-%m-%d %H:%M:%S'
    write-output "[INFO] END TIME : $TIME_CUR"
    Write-output "[INFO] Deploy done."

} else {

    Write-output "[INFO] Current BUILD is same or high version. Deploy cancel!!"
    $TIME_CUR = Get-Date -UFormat '%Y-%m-%d %H:%M:%S'
    write-output "[INFO] END TIME : $TIME_CUR"
}

Rundeck Job 설정하기

기본적으로 배포를 위한 rundeck 프로젝트는 설정되어 있는 상태를 가정합니다.

프로젝트의 화면에서 [Create Job] 을 클릭하여, 신규 Job 을 생성합니다.

1538052845860

Job Name : 작업의 간략한 이름을 설정 합니다.

Description : 작업에 대한 처리 내용을 간략히 작성하여, 다른 작업자 분들이 해당 작업이 어떤 내용들을 수행하는지 작성해주시면 됩니다.

Group : 작업을을 한 그룹으로 묶어서 화면에 표시 되게 됩니다. 게임 관련 작업이면, GAME 등으로 식별이 가능한 이름을 작성하시면 됩니다.

1538053123551

해당 노드들에게 실행할 커맨드를 입력을 하기 위해서 [Command] 버튼을 클릭합니다.

1538055789901

Command : 실행할 Windows Command 명령을 입력 하시면 됩니다. 우리는 배포를 위해서 작성해 놓은 파워쉘 스크립트 파일명을 입력 하시면됩니다.

1538055944987

Node Filter : 위의 명령을 수행할 노드들을 선택합니다. Rundeck 노드 설정에서 입력 한 값을 이용하여, 배포할 노드들을 선택 할수 있습니다.

Matched Nodes : 입력된 필터에 맞는 결과 노드들이 표시 되며, 작업을 수행시 이 노드들에 대해서 수행을 하게 됩니다.

1538055989937

기본적인 입력항목은 작성이 되었습니다. 추가 적으로 작업의 성공 실패 여부를 Dooray 등으로 출력을 위해서는.

Send Notification [Yes] 를 클릭 후, Http Notification 을 선택하신 후에 항목들을 입력 하시면 됩니다.

마지막

이제 생성된 Jobs 을 이용해서 배포를 진행 하도록 하겠습니다. 위 방법으로 작업이 생성되면 아래의 그림과 같은 메뉴들을 볼수 있습니다. [GAME_DEPLOY] 를 클릭하여 배포를 진행 하도록 합니다.

1538059516647

배포할 Nodes 를 선택한 후 [Run Job Now] 를 클릭합니다.

1538059595584

정상적으로 실행된다면, 아래의 그림과 같이 수행되는 콘솔로그를 [Log Output] 탭에서 확인 할 수 있습니다.

1538059753322

Continue reading

Jenkins Unity3D 빌드하기 on MacOS

MacOS 에서 Jenkins 설치는 Jenkins 설치 on MacOS 를 참고하세요.  

진행하기 앞서 MacOS Xcode , Unity3D 는 먼저 설치가 되어 있어어야 합니다. 이 부분은 여기서 다루지 않겠습니다.

준비하기 - plugin 설치

[Jenkins 관리] => [플러그인 관리] 에서 Unity3D, xcode 플러그인을 설치 하도록 합니다.

  • Xcode integration
  • Unity3d plugin 해당 플러그인이 설치가 정상적이라면, 다음 단계 설정 부분으로 넘어갑니다.

Unitdy3D 설정

[Jenkins 관리] => [Global Tool Configuration] 들어가자 Unity3D 설치 경로를 입력합니다.

기본 설치를 진행 하였다면, 입력된 경로에 설치 되어 있을 것입니다.

1536163078204

Jenkins 프로젝트 설정

[Jenkins] 의 [새로운 item] 메뉴를 이용하여, 프로젝트를 구성을 합니다. 기본적인 General , 소스 코드 관리 프로젝트에 맞게 설정 하시면 됩니다.

Build-Invoke Unity3d Editor

[Add Build Step] 메뉴에서 [Invoke Unity3d Editor] 항목 선택합니다.

  • Unity3d installation name : Unity3d 설정에서 입력한 항목을 선택 합니다.
  • Editor command line arguments 유니티 콘솔 빌드시 입력되는 항목입니다.

    -quit -batchmode  -stackTraceLogType Full -projectPath "$WORKSPACE" -buildTarget ios -executeMethod NUnityBuilder.BatchRun GNSS.ios.qa.ini -logFile $WORKSPACE/build_unitylog.txt
    

1536163014173

빌드 옵션은 Unity3d 문서를 참고 하시면 자세한 내용을 확인 할 수 있습니다.

Build - Xcode

[Add Build Step] 메뉴에서 [xcode] 항목을 선택합니다. 그러면 아래와 같은 항목이 추가 됨을 확인 할 수 있습니다. 추가 내용에 대해서는 아래의 스텝으로 설정 하시면 됩니다.

1536162685234

General build settings

  • Development Team ID : 애플 개발자 사이트에서 발급된 아이디를 입력합니다.
  • Target : Unity 빌드시 생성된 xcode 프로젝트의 Target 을 입력합니다. 기본적으로 Unity-iPhone 으로 설정 되어 있습니다.
  • Configuration : Release 입력합니다.
  • Xcode Schema File : Target 에 입력한 내용을 입력 합니다.

1536161595719

  • Export method : 배포를 위한 방법을 선택합니다. 개발자 배포 관련 항목은 사업팀 혹은 플랫폼팀으로 문의 하시면 됩니다.
  • .ipa filename pattern : 생성될 ipa 파일의 이름을 지정합니다.

1536161882553

  • Application URL : manifest.plist 파일의 [software-package] 항목에 사용되는 URL 입니다.

  • Display image URL : manifest.plist 파일의 [display-image] 항목에 사용되는 URL 입니다.

  • Full size image URL : manifest.plist 파일의 [full-size-image] 항목에 사용되는 URL 입니다.

image 파일은 꼭 해당 주소에 존재 하지 않아도 됩니다. 하지만 항목이 누락되면. 빌드시 실패 할수 있으니. 확인하시고 입력 해주시면 됩니다.

1537186825330

Code signing & OS X keychain options

  • Bundle ID :
  • Provisioning profile UUID :
  • Keychain path :
  • Keychain password :

1536162101035

Advanced Xcode build options

  • Xcode Project Directory : xcode 프로젝트 파일이 위치한 젠킨스 프로젝트 작업디렉토리를 기준으로 상대 경로를 입력합니다.
  • Build output directory : 빌드 후 결과물이 저장 되는 경로입니다.

1536162459493

Continue reading

Jenkins 설치 하기 on MacOS

MacOS Jenkins 설치하기

homebrew 를 이용하여 쉽게 설치가 가능합니다.

Homebrew 설치 하기

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$brew install jenkins

유저 계정으로 다시 실행하기

$launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
$launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
$brew services stop jenkins

젠킨스를 설치하고 실행후 접속해보자

http://127.0.0.1:8080 또는 http://localhost:8080 으로 접속 할 수 있다.

Jenkins 설정하기

초기 설치 암호는 화면의 경로에 있는 파일을 열어 입력할 수 있다. 화면을 따라 설치 하면 어렵지 않게 설정을 진행 할 수 있다.

로컬 호스트 이외의 도메인이나 IP로 접속하기 위해선 다음 경로의 파일을 수정해야한다.

$ cd /usr/local/opt/jenkins
$ vi homebrew.mxcl.jenkins.plist

파일에서 127.0.0.1 부분을 0.0.0.0 으로 변경 후 저장한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>homebrew.mxcl.jenkins</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/bin/java</string>
      <string>-Dmail.smtp.starttls.enable=true</string>
      <string>-jar</string>
      <string>/usr/local/opt/jenkins/libexec/jenkins.war</string>
      <string>--httpListenAddress=127.0.0.1</string>
      <string>--httpPort=8080</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>



편집 후 젠킨스를 재시작 한다.

$ brew services restart jenkins

Jenkins 제거

아래의 명령으로 간단하게 제거 가능하다.

$ brew services stop jenkins
$ brew remove jenkins

사용 되었던 데이터까지 모두 삭제를 원한다면, 계정의 홈디렉토리에서 .jenkins 디렉토리를 삭제 하면된다.

$ rm -rf ~/home_account/.jenkins

Aws CLI 설치

참고 URL https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-macos.html#install-bundle-macos

Python Pip 로 설치 하는 방법이 있지만, 번들 설치 관리자를 사용 하여 설치합니다.

위 가이드대로 설치 한다면, aws 설치 경로는 /usr/local/aws 이 될 것입니다.

Continue reading

명령창 열기 Windows 10 context menu

윈도우즈 10은 기본적으로 context menu 에서 ‘여기에서 명령창 열기’ 가 사라지고 Powershell 열기가 생겼다. 많은 작업을 cmd 로 하는 중 점점 불편함을 느끼기 시작하여, 추가 하는 방법을 작성 한다.

Context Menu 추가하기

경고 - 레지스트리를 수정하기 때문에 반드시 백업후에 아래의 스텝을 수행하시기 바랍니다.

  1. 윈두우키 + R 을 입력하여, 실행 창을 오픈한다.
  2. regedit 을 입력하여 레지스트리 에디터를 실행한다.
  3. 아래의 경로를 찾는다.
    HKEY_CLASSES_ROOT\Directory\shell\cmd
    
  4. cmd 폴더를 마우스 우클릭 , 사용 권한을 클릭한다.

    1531270186812

  5. 고급 버튼을 클릭한다.

    1531270456051

  6. cmd 고급 보안 설정에서 변경 을 클릭한다.

    1531270638094

  7. 사용자 계정을 입력후 이름 확인을 눌러 확인후 확인 버튼을 누른다.

    1531270675420

  8. 하위 컨테이너와 개체의 소유자 바꾸기 항목을 체크후 적용 및 확인 버튼을 누른다.

    1531270788136

    1531270810132

  9. cmd 의 HideBasedOnVelocityId 의 이름을 ShowBasedOnVelocityId 로 변경한다.

    1531272384763

Continue reading

Unity3D 2017 StructLayout 버그

Unity3D StructLayout 버그

개발중에 AOS mono 빌드로 테스트 중 발견된 내용입니다.

사용환경 : Unit3D 2017.3 0f3 .net 3.5

아래와 같읕 통신을 위한 구조체에 값을 대입시 대입한 값이 달라지는 현상이 발생한다.

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DataInfo
{
    public short Val1;
    public short Val2;
    public short Val3;
    public byte Val3;
    public Int64 Val4;
    public int Val5;
    public byte Grade;
    public short Level;
    public byte AWake;
    public float Scale;
}
DataInfo info = new DataInfo();
info.Val1 = 1;
info.Val2 = 1;
info.Val3 = 1;
info.Val4 = 1;
info.Val5 = 1;
info.Grade = 1;
info.Level = 25;   // 이 값이 대입되면, Scale 값이 이상한 값으로 셋팅됨
info.AWake = 1;
info.Scale = 1f; // 이 값이 대입되면, Level = 0, AWake = 128 으로 값이 셋팅됨

이 현상은 mono 빌드에서 발생하며, 에디터와, IL2CPP 에서는 오류 없이 정상 동작한다.

mono의 낮은 버전으로 발생되는 현상으로 보이는데, 닷넷 버전을 4.6으로 설정후 테스트 해볼 예정이다.

Continue reading

Rundeck 설정하기

다운로드

https://www.rundeck.com/open-source

설치하기

java 8이 설치 되어 있는지 확인을 합니다. 최신 버전의 자바를 설치시 rundeck 설치가 안 될수 있습니다.

설치 파일을 복사한 후 아래의 명령을 실행합니다.

c:\rundeck> java -jar rundeck-launcher-2.11.3.jar -d

명령을 실행하면 아래의 이미지와 같은 폴더가 생성되어야 합니다. 아래와 같은 폴더가 생성되지 않았다면, 설치시 문제가 발생하였을 것입니다.

1536242386748

etc\profile.bat 파일을 열어 사용 메모리수치를 수정합니다.

set RDECK_CLI_OPTS=-Xms512m -Xmx1024m

Rundeck 을 Windows Service 로 등록하기

NSSM (the Non-Sucking Service Manager) 을 이용하여 등록하자 다운로드

윈도우즈 커맨드 창에 nssm install [서비스명] 을 입력하면 아래와 같은 GUI 화면을 볼수 있다.

c:\rundeck>nssm install rundeck

1536048864250

  • start-rundeck.bat 을 아래와 같이 작성한다.
set CURDIR=%~dp0
call %CURDIR%etc\profile.bat
java %RDECK_CLI_OPTS% %RDECK_SSL_OPTS% -jar rundeck-launcher-2.11.3.jar --skipinstall -d
  • 방화벽 오픈 윈도우는 기본적으로 방화벽 기능이 활성화 되어 있으므로. 서비스를 위해서. 방화벽 오픈이 필요합니다. 윈도우 명령창에서 아래의 명령을 입력하세요.
방화벽 오픈
netsh advfirewall firewall add rule name="rundeck Http Port : 4440" dir=in action=allow protocol=TCP localport=4440

Rundeck node 추가

노드는 프로젝트에서 사용될 배포하게될 해당 머신을 뜻하며, 노드 추가를 위해선 먼저 프로젝트가 생성되어야 합니다. 프로젝트가 생성되어 있다면, 아래의 경로에 파일을 수정하여 노드를 추가 합니다.

[rundeck 설치 경로]\projects\[프로젝트명]\[etc]\resources.xml

<node name="GAME-01"
    connectionType="WINRM_NATIVE"
    node-executor="overthere-winrm"
    winrm-password-option="winrmPassword"
    winrm-protocol="http"
    winrm-auth-type="basic"
    username="접속 아이디"
    winrmPassword="암호"
    description="ZK Game sever"
    tags="game"
    hostname="10.0.0.228:5985"
    osArch="x86_64"
    osFamily="windows"
    osName="Microsoft Windows Server 2016"
    osVersion="Microsoft Windows Server 2016" />

name : 노드를 표현하는 이름입니다. 배포 구성시 필터에 사용됩니다.

tags : 배포 구성시 필터에 사용되며, 구성을 표현할 수 있는 키워드라고 생각하시면 됩니다.

winrmPassword

현재 버전에서는 node 정보에 wirm-password-option 을 이용하여 암호 설정을 하여도 적용 되지 않는 문제가 있습니다.

오른쪽 상단의 설정에서 [Key Storage] 메뉴를 이용하여 암호를 설정합니다.

프로젝트 설정에서 [Default Node Executor] -> [WinRM] 옵션을 활성화 후 아까 생성한 키를 선택합니다.

윈도우 노드의 winrm 설정

Winrm 이란 Windows 원격 관리 명령줄 도구이며, Microsoft가 구현한 WS-Management 프토콜로서, 웹 서비스를 이용하여 로컬 및 원격 컴퓨터와 안전하게 통신을 할 수 있는 방법입니다.

윈도우 노드 설정

winrm qc
winrm set winrm/config/client/auth @{Basic="true"}
winrm set winrm/config/service/auth @{Basic="true"}
winrm set winrm/config/service @{AllowUnencrypted="true"}

Windows server 2012 인 경우 powershell 실행 권한이 필요합니다.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Continue reading

Pagination


© 2018. by brian jung

Powered by storm