7. 신속한 배포를 위해서 어떠한 도구가 필요한가?
개발 주도적 세계에서 배포는 다음과 같음 많은 도구를
고려해야 함:
• 소프트웨어 개발, 릴리즈 프로세스 흐름을 관리할 도구
• 코드 흠결 및 잠재적 이슈를 테스트하고 검토할 수 있는
적합한 도구
• 어플리케이션을 배포할 도구
8. 개발 주기는 점점 빨라지고 있음
게임 소프트웨어 개발 및 배포는
쉬워지면서 더욱 가속화 됨:
• 모바일 게임의 생명주기는 아주 짧음
• 고객의 이벤트 및 요구에 따라 잦은 패치 및
업데이트가 필요
• 수백만명에게 게임을 전달하는 것이 아주
쉬운 환경
• 개발 속도를 높이는 것은 중간 방해물과의
싸움
10. 시작하기 앞서, 소프트웨어
릴리즈 프로세스에 대한
이해가 필요
https://www.flickr.com/photos/jurvetson/5201796697/
11. • Integration
tests with
other systems
• Load testing
• UI tests
• Penetration
testing
릴리즈 프로세스의 4개 주요 단계
소스 빌드 테스트 프로덕션
• Check-in
source code
such as .java
files.
• Peer review
new code
• Compile code
• Unit tests
• Style checkers
• Code metrics
• Create
container
images
• Deployment
to production
environments
12. 릴리즈 프로세스 단계
소스 빌드 테스트 프로덕션
지속 통합 (Continuous integration)
지속 전달 (Continuous delivery)
지속 배포 (Continuous deployment)
13. Release Processes levels
Source Build Test Production
Continuous integration
Continuous deployment
오늘 살펴볼 단계
지속 전달 (Continuous delivery)
14. 지속 전달의 잇점
개발자 생산성 향상 버그를 특정하고
찾아서 쉽게 해결
업데이트를 보다
빠르게 전달
지속적인 소프트웨어
릴리즈 프로세스
26. 지금까지 매우 우수하게 지속적으로 작동:
2014 년:
• Amazon의 수천개 서비스 팀
• Microservices 를 개발
• 지속전달을 실제로 적용
• 많은 환경 (스테이징, 베타, 프로덕션)
50 million deploys
27. 지금까지 매우 우수하게 지속적으로 작동 :
매년 Amazon에서는 우리의 소프트웨어 개발자에게
서베이를 수행. 2014년 결과에서는 보다 행복한 개발자와
통계적으로 관련이 있는 하나의 개발 툴/서비스가
발견되었다.
그것은 바로
pipelines 서비스!
continuous delivery == happier developers!
34. 8. Retrieve build artifact
EC2 instance
CodePipeline
Source
Source
GitHub
Build
JenkinsOnEC2
Jenkins
Deploy
JavaApp
Elastic Beanstalk
Source Artifact
S3
Build Artifact
S3
5. Get source artifact
1. Get Changes
6. Store build artifact
3. Poll for Job
4. Acknowledge Job
7. Put Success
9. Deploy build artifact
Elastic Beanstalk
Web container
Java App
MyApplication
35. 매우 다양한 파트너가 존재, 계속 증가
Source Build Test Deploy
36. AWS 서비스 통합
소스 로직 호출 배포
AWS Elastic BeanstalkAmazon S3
AWS CodeDeploy
AWS Lambda
37. 게임 어플리케이션 개발
릴리즈 파이프 라인을 생성
https://www.flickr.com/photos/seattlemunicipalarchives/12504672623/
38. 게임 어플리케이션 빌드 &
테스트
https://secure.flickr.com/photos/spenceyc/7481166880
39. 코드 빌딩
코드 “빌딩”은 전형적으로 컴파일이 필요한
언어에 대해 수행 :
• .NET : C#, F#, VB.net, etc.
• Java 와 관련 유사언어 : Java, Scala, JRuby
• Go
• iOS : Swift, Objective-C
“빌딩”이란 표현은 Docker 컨테이너 이미지를
만들때도 사용한다
EC2
40. 빌딩 단계가 필요 없는 경우
많은 다른 언어들은 빌딩 단계가 필요없음.
주로 이들은 인터프리터 언어로 개발된 경우에
해당:
• PHP
• Ruby
• Python
• Node.js
이 경우 단순 배포만!
EC2
41. 코드 테스팅
테스팅은 과학과 예술 두 측면을 모두 가짐
코드 테스팅의 목표:
• 원하는 기능에 대한 구현 확인
• 프로그램의 문법 에러 찾기
• 코드 패턴과 포맷에 대한 표준화
• 원치 않은 어플리케이션 사용법과 로직상의
흠결로 인한 버그 감소
• 어플리케이션을 좀 더 보안성 높게 만듬
42. 테스팅의 출발점
1. 일반적인 사소한 문법 오류
• 브라켓, 코마 등을 빠뜨리고 있지 않은가?
2. 전체 소프트웨어의 가장 윗 단계 부분인 유저가 사용하는
화면에서 부터 시작
• 각 게임 화면이 정확하게 보여지고 있는가?
• 화면별로 렌더링은 잘 수행되고 있는가?
3. 더 깊숙한 UX 및 서비스 체크
• 상호 싱크는 맞는가?
4. 기본 유저 함수의 유닛테스트로부터 더 깊숙한 서버
로직까지 테스트
• 제품화에서의 버그를 찾기 위해 보다 체계화된 방법에
시간을 더 투자
45. 코드 배포를 인스턴스 상관없이 자동화
업데이트 하는 과정의 복잡함을 쉽게 처리
어플리케이션 배포 중 다운타임을 최소화
어떤 언어, 어떤 O/S 라도, Amazon EC2 혹은
온프리미스 서버에도 배포 가능
3rd 파티 툴과 AWS 서비스와 통합
AWS CodeDeploy
47. appspec.yml Example
version: 0.0
os: linux
files:
- source: /
destination: /var/www/html
permissions:
- object: /var/www/html
pattern: “*.html”
owner: root
group: root
mode: 755
hooks:
ApplicationStop:
- location: scripts/deregister_from_elb.sh
BeforeInstall:
- location: scripts/install_dependencies.sh
ApplicationStart:
- location: scripts/start_httpd.sh
ValidateService:
- location: scripts/test_site.sh
- location: scripts/register_with_elb.sh
• Remove/add instance to ELB
• Install dependency packages
• Start Apache
• Confirm successful deploy
• More!
• Send application files to one
directory and configuration
files to another
• Set specific permissions on
specific directories & files
48. v2 v2 v2 v2 v2 v2
one at a time
half at a time
all at once
v2 v2 v2 v1 v1 v1
v2 v1 v1 v1 v1 v1 Agent Agent
Dev Deployment group
OR
Prod Deployment group
Agent
AgentAgent
Agent Agent
Agent
배포 속도와 그룹을 선택
50. 프로덕션으로 런칭
어플리케이션을 빌드하고 테스트하고 나서
다행스럽게 몇 단계의 전-프로덕션 단계를 거치고 난
이후에는, 실제 배포를 진행
다음을 고려:
• 고객에 대한 영향
• 인프라에 대한 영향
• 비지니스에 대한 영향
어떻게 이 과정을 추적하고 배포간에 상호 동작을
하게 할 것인가?
51. 커스텀 액션을 이용한 CodePipeline 확장
티켓 업데이트 리소스 프로비저닝
업데이트 대쉬보드 고객에게 알림 보안 스캔
모바일 테스팅
53. Source
Source
GitHub
Build
JenkinsOnEC2
Jenkins
Deploy
MyAction
AWS Lambda
JavaApp
Elastic Beanstalk
2. Perform Job
1. Invoke Lambda function
3. PutJobSuccessResult
MyApplication
CodePipeline AWS Lambda 기반 액션으로,
AWS CodePipeline 이 Lambda와의 통합을
주도하고, Lambda를 통해서 다른
어플리케이션과 서비스를 연결한다
AWS
Lambda
3. PutJobSuccessResult w/
Continuation Token
4. Invoke Lambda function w/
Continuation Token
5. PutJobSuccessResult #3 & #4 repeat until no continuation
token is sent, signaling the action has
been completed (#5).
54. Lambda 에서의 SNS 호출 구현
var sns = new AWS.SNS();
var datetime = new Date().toISOString().replace(/T/, ' ').replace(/..+/, '')
var params = {
Message: datetime + ' : DevOps deploy is completed', /* required */
Subject: 'Deploy',
TopicArn: 'arn:aws:sns:us-east-1:550xxxxxxxxxx:devops-deploy-topic'
};
sns.publish(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
55. CodePipeline을 위한 Lambda에서 SNS 호출 구현
var codepipeline = new AWS.CodePipeline();
var jobId = event["CodePipeline.job"].id;
var url = event["CodePipeline.job"].data.actionConfiguration.configuration.UserParameters;
var putJobSuccess = function(message) {
var params = {
jobId: jobId
};
codepipeline.putJobSuccessResult(params, function(err, data) {
if(err) context.fail(err);
else context.succeed(message);
});
};
sns.publish(params, function(err, data) {
if (err) putJobFailure(ex);
else putJobSuccess("Tests passed.");
});
56. 각 방법은 어떤 특성이 있는가?
Lambda Custom Action
짧은 시간동안 동작하는 태스크를 아주
쉽게 구현
어떤 형태의 워크로드라도 수행 가능
장기간 동작해야 하는 태스크의 경우
보다 구현 작업이 필요
콘솔에서 각각의 콘트롤간의 링크가
디스플레이 됨
Node.js, Python, Java 지원 어떤 언어든 지원
AWS 상에서 동작 on-premises에서도 동작가능
프로비전이나 매니지할 서비스가
존재하지 않음
컴퓨팅 리소스 필요