SlideShare uma empresa Scribd logo
1 de 23
Baixar para ler offline
Envoy 를 이용한 코드 배포
Appkr <juwonkim@me.com>
Modern PUG 2016년 1월 정기 모임
자료: bit.ly/code-deploy-with-envoy
오늘 이야기할 것들
• 코드 배포 원칙
• Git 을 이용한 일반적인 코드 배포 전략
• Envoy
• Envoy 를 이용한 코드 배포 자동화
코드 배포 원칙
1. 배포하려는 브랜치에 있는 모든 파일이 

배포할 디렉토리로 복사되어야 한다.
2. 지난 릴리즈 이후, Repo 에서 삭제된 파일이 있다면, 

배포 디렉토리에서도 삭제되어야 한다.
3. Tracking 되는 파일 중 배포 디렉토리에 변경이 있다면 

무시되어야 한다 (덮어쓰기).
4. 배포 디렉토리에 있는 Untracked 파일은 

그대로 두어야 한다.
참고자료: http://gitolite.com/deploy.html
Git 배포 - Git 을 이용한 코드 배포의 장단점
• 변경된 파일만 배포하므로, 빠르다.
• 이전 릴리즈로 롤백이 용이하다. (git checkout)
• Git Hook 을 이용, 배포 후 작업을 자동화할 수도 있다.
• Git 은 File Permission 을 추적하지 않는다.
• Git 은 빈 디렉토리를 추적하지 않는다.
• Database 배포나 migration 을 지원하지 않는다.
Git 배포 - (1) SSH in to server then git pull
서버에 SSH 로그인 한 후
가장 간단한 방법이긴한데…
서버에서 Conflict Merge 를 해야할 가능성이 크다.
$ git pull
Git 배포 - (2) Push to bare remote with Git Hook
로컬에서
만 하면 되는데….
Conflict 는 여전히 발생할 수 있다.
$ git push
Git 배포 - (2) Push to bare remote with Git Hook
ssh in for initialize
bare remote 

website.git
document root 

/var/www
# set up a bare Git repo on the remote machine

$ mkdir website.git && cd website.git

$ git init --bare

# create a post-receive hook

$ cp hooks/post-receive.sample hooks/post-receive

$ chmod +x hooks/post-receive

# hooks/post-receive

#!/bin/sh

GIT_WORK_TREE=/var/www git checkout -f
local

~/website
Git 배포 - (2) Push to bare remote with Git Hook
bare remote 

website.git
local workspace

~/website
# add a new remote to your local repo

$ git remote add web git@myserver.com:website.git

# set a branch to push to remote

$ git push web +master:refs/heads/master

# deploy !!!

$ git push web
post-receive hook
doc. root 

/var/www
Git 배포 - (3) Git clone
서버에 SSH 로그인 한 후
Clone 후 새로운 Document Root 로 웹 서버 설정 변경 등
가장 번거로운 방법이긴 하지만, Conflict Zero.
$ git clone git@myserver.com:website.git
“흠, pull/checkout 보다 clone 전략이 더 좋다는데…”
“썸 귀찮단 말이야.. 어떻게 하지?”
“게다가 리모트에 로그인없이
로컬에서 하면 더 좋겠는데”
이럴 때 필요한 것이 배포 자동화 툴!!!
Capistrano (ruby), Fabric (python) 등등.
퍽! 퍽! 우린 PHP 개발자잖아~
deployer, envoy
Envoy - 먹는건가요?
1. PHP 언어로 쓰여진 SSH Task Runner
• Laravel 의 Blade 유사 템플릿 문법 채용
• {{ $var }}, @task @endtask, @if @endif, …

2. Laravel 프로젝트가 아니어도 쓸 수 있다.

3. 배포 툴은 아니다. 배포 자동화를 위해 쓸 수도 있다.
Envoy - 설치 및 실행
1. 설치



2. Task 정의 - envoy.blade.php

3. Task 실행
$ composer global require "laravel/envoy=~1.0"

$ envoy --version # Laravel Envoy version 1.0.25
$ cd ~/website && envoy init
$ envoy run taskName
Envoy- envoy.blade.php
@servers(['web' => 'git@mywebserver.com'])

@setup // PHP 영역

$now = (new DateTime())->format('c');

@endsetup

@task('foo', ['on' => ‘web']) # Bash 영역

NOW=$(date);

echo "Foo task fired at {{$now}} local time.";

echo "Done at $NOW server time.";

@endtask

@macro(‘bar’) # 미리 정의한 taskName 만 쓸 수 있음

foo

@endmacro
Envoy- 사용 가능한 키워드
// 필수 키워드

@servers(['alias' => 'user@host'])



// PHP 영역에 해당하는 키워드

@setup 

$var = 'val';

@include('path-to.php');

@endsetup



# Bash 영역에서 쓸 수 있는 키워드

{{-- Comment —}} {{ $var }}

@if(/*php expression*/) 

# bash 

@elseif(/*php expression*/) 

# bash 

@else 

# bash 

@endif
Envoy- 사용 가능한 키워드
# Bash 영역에서 쓸 수 있는 키워드

@foreach(/*php expression*/) 

# bash 

@endforeach



@for(/*php expression*/) 

# bash 

@endfor



@while(/*php expression*/) 

# bash 

@endwhile



@after 

# bash

@hipchat('token', 'room', 'Envoy', 'message')

@slack('hook', 'channel', 'message') 

@endafter
Envoy 를 이용한 코드 배포 자동화
github.com
dev machine production server
$ git push (1) $ git clone (3)
$ envoy run release (2)
appkr/envoy - Envoy Use Case Demo
Envoy 를 이용한 코드 배포 자동화
• $ envoy run hello 

SSH Connection 체크
• $ envoy run release 

새로운 코드를 서버에 배포
• $ envoy run list 

릴리즈 목록 보기
• $ envoy run checkout --release=/path/to/release

/path/to/release 릴리즈로 체크아웃
• $ envoy run prune --keep=n

최근 n 개릐 릴리즈만 남기고 오래된 릴리즈 삭제
appkr/envoy - 사용 가능한 Task
Envoy 를 이용한 코드 배포 자동화
• $ envoy run release 는 아래 작업을 순차적으로 수행
• 필요한 디렉토리 생성 (www, www/shared, www/releases)
• Git clone (www/releases/release_YmdHis)
• release_YmdHis 디렉토리에서 Composer install
• release_YmdHis 디렉토리 아래에 shared 디렉토리 심볼릭 링크
• release_YmdHis 디렉토리를 웹 서버 Document Root 로 심볼릭 링크
• release_YmdHis 디렉토리 권한 변경
appkr/envoy - release 동작 원리
Envoy 를 이용한 코드 배포 자동화
# 서버에 아래와 같은 구조로 코드 배포됨.

web

├── releases

│ └── release_YmdHis

│ ├── # other files

│ └── shared -> /home/username/web/shared

├── shared

└── my_domain_name -> /home/username/web/releases/release_YmdHis
appkr/envoy - release 동작 원리
Envoy 를 이용한 코드 배포 자동화
# 필요 파일 다운로드

$ cd project

$ wget https://raw.githubusercontent.com/appkr/envoy/master/envoy.blade.php

appkr/envoy - 프로젝트에 시전해 보려면,
// envoy.blade.php 파일 수정

@servers(['web' => ‘username@host’)



@setup 

$path = [‘base’ => ‘/home/deployer/web’, ‘…’ => ‘…’];

// ...

@endsetup
Envoy 를 이용한 코드 배포 자동화
// envoy.blade.php 파일도 필요하다면 입맛에 맞게 수정

@servers(['web' => ‘username@host’])

@task('hello', ['on' => ['web']])

HOSTNAME=$(hostname);

echo "Hello Envoy! Responding from $HOSTNAME";

@endtask
appkr/envoy - 프로젝트에 시전해 보려면,
# Task 실행

$ envoy run hello

$ envoy run deploy
Envoy 를 이용한 코드 배포 자동화
appkr/envoy - 보너스
• $ bash scripts/provision.sh {username}

LNMP 서버를 빠르게 프로비저닝하는 도구
• username 계정을 이용
• Build tool, Git, Composer 등 설치 및 설정
• Nginx, PHP5, MySql 설치 및 설정
• $ bash scripts/serve.sh {domain} {/path/to/docroot}

Nginx 사이트를 빠르게 생성해 주는 도구
• /path/to/docroot 를 domain 의 document root 로 연결
고맙습니다.
Appkr <juwonkim@me.com>

Mais conteúdo relacionado

Mais procurados

Docker + Kubernetes를 이용한 빌드 서버 가상화 사례
Docker + Kubernetes를 이용한 빌드 서버 가상화 사례Docker + Kubernetes를 이용한 빌드 서버 가상화 사례
Docker + Kubernetes를 이용한 빌드 서버 가상화 사례NAVER LABS
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기AWSKRUG - AWS한국사용자모임
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용흥배 최
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Masahito Zembutsu
 
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理Yuki Hattori
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
 
Dockers and containers basics
Dockers and containers basicsDockers and containers basics
Dockers and containers basicsSourabh Saxena
 
200 verteilte Oracle- Server mit Ansible ausrollen
200 verteilte Oracle- Server mit Ansible ausrollen200 verteilte Oracle- Server mit Ansible ausrollen
200 verteilte Oracle- Server mit Ansible ausrollenUwe Küchler
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advanceDaeMyung Kang
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버Heungsub Lee
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDeleteYu Yamada
 
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성KwangSeob Jeong
 
俺のサイジング
俺のサイジング俺のサイジング
俺のサイジングToru Makabe
 
ASP.NETの進化とASP.NET Core Blazorの凄さ
ASP.NETの進化とASP.NET Core Blazorの凄さASP.NETの進化とASP.NET Core Blazorの凄さ
ASP.NETの進化とASP.NET Core Blazorの凄さSho Okada
 
Introduction to jenkins
Introduction to jenkinsIntroduction to jenkins
Introduction to jenkinsAbe Diaz
 
신입 개발자 생활백서 [개정판]
신입 개발자 생활백서 [개정판]신입 개발자 생활백서 [개정판]
신입 개발자 생활백서 [개정판]Yurim Jin
 
Docker and Go: why did we decide to write Docker in Go?
Docker and Go: why did we decide to write Docker in Go?Docker and Go: why did we decide to write Docker in Go?
Docker and Go: why did we decide to write Docker in Go?Jérôme Petazzoni
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムKouhei Sutou
 

Mais procurados (20)

Docker + Kubernetes를 이용한 빌드 서버 가상화 사례
Docker + Kubernetes를 이용한 빌드 서버 가상화 사례Docker + Kubernetes를 이용한 빌드 서버 가상화 사례
Docker + Kubernetes를 이용한 빌드 서버 가상화 사례
 
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
Spark + S3 + R3를 이용한 데이터 분석 시스템 만들기
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용
 
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
 
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
Azure SecOps! Azure Key Vaultを用いたクラウドのキー管理
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
Dockers and containers basics
Dockers and containers basicsDockers and containers basics
Dockers and containers basics
 
200 verteilte Oracle- Server mit Ansible ausrollen
200 verteilte Oracle- Server mit Ansible ausrollen200 verteilte Oracle- Server mit Ansible ausrollen
200 verteilte Oracle- Server mit Ansible ausrollen
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDelete
 
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성
Atlassian confluence WIKI를 활용한 공유와 협업 환경 구성
 
俺のサイジング
俺のサイジング俺のサイジング
俺のサイジング
 
ASP.NETの進化とASP.NET Core Blazorの凄さ
ASP.NETの進化とASP.NET Core Blazorの凄さASP.NETの進化とASP.NET Core Blazorの凄さ
ASP.NETの進化とASP.NET Core Blazorの凄さ
 
Introduction to jenkins
Introduction to jenkinsIntroduction to jenkins
Introduction to jenkins
 
신입 개발자 생활백서 [개정판]
신입 개발자 생활백서 [개정판]신입 개발자 생활백서 [개정판]
신입 개발자 생활백서 [개정판]
 
Docker and Go: why did we decide to write Docker in Go?
Docker and Go: why did we decide to write Docker in Go?Docker and Go: why did we decide to write Docker in Go?
Docker and Go: why did we decide to write Docker in Go?
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
 
What is Docker
What is DockerWhat is Docker
What is Docker
 
NiFi 시작하기
NiFi 시작하기NiFi 시작하기
NiFi 시작하기
 

Semelhante a Envoy 를 이용한 코드 배포 자동화

[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기Chanwoong Kim
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래NAVER D2
 
Yobi-hands-on-lab-at-d2fest
Yobi-hands-on-lab-at-d2festYobi-hands-on-lab-at-d2fest
Yobi-hands-on-lab-at-d2festinsanehong Kim
 
[D2 fest 2014]yobi hands on lab
[D2 fest 2014]yobi hands on lab[D2 fest 2014]yobi hands on lab
[D2 fest 2014]yobi hands on labNAVER D2
 
강분도 - 공개SW개발과 우분투 (2010Y10M05D)
강분도 - 공개SW개발과 우분투 (2010Y10M05D)강분도 - 공개SW개발과 우분투 (2010Y10M05D)
강분도 - 공개SW개발과 우분투 (2010Y10M05D)Ubuntu Korea Community
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기Sumin Byeon
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In ProductionMooYeol Lee
 
Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성 Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성 rockplace
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: YeomanJae Sung Park
 
DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기SeungYong Baek
 
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발Jinuk Kim
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 YoungSu Son
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows TerminalOnGameServer
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자Sewon Ann
 
Internship backend
Internship backendInternship backend
Internship backendYein Sim
 
2022.08 멘토링 자료.pptx
2022.08 멘토링 자료.pptx2022.08 멘토링 자료.pptx
2022.08 멘토링 자료.pptxssuserf875e6
 
Openstack에 컨트리뷰션 해보기
Openstack에 컨트리뷰션 해보기Openstack에 컨트리뷰션 해보기
Openstack에 컨트리뷰션 해보기영우 김
 
제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기Mario Cho
 

Semelhante a Envoy 를 이용한 코드 배포 자동화 (20)

[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래
 
Yobi-hands-on-lab-at-d2fest
Yobi-hands-on-lab-at-d2festYobi-hands-on-lab-at-d2fest
Yobi-hands-on-lab-at-d2fest
 
[D2 fest 2014]yobi hands on lab
[D2 fest 2014]yobi hands on lab[D2 fest 2014]yobi hands on lab
[D2 fest 2014]yobi hands on lab
 
강분도 - 공개SW개발과 우분투 (2010Y10M05D)
강분도 - 공개SW개발과 우분투 (2010Y10M05D)강분도 - 공개SW개발과 우분투 (2010Y10M05D)
강분도 - 공개SW개발과 우분투 (2010Y10M05D)
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
 
AngularJS In Production
AngularJS In ProductionAngularJS In Production
AngularJS In Production
 
Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성 Jenkins를 활용한 Openshift CI/CD 구성
Jenkins를 활용한 Openshift CI/CD 구성
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman
 
DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기
 
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
 
ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자ant로 안드로이드 앱을 자동으로 빌드하자
ant로 안드로이드 앱을 자동으로 빌드하자
 
Internship backend
Internship backendInternship backend
Internship backend
 
2022.08 멘토링 자료.pptx
2022.08 멘토링 자료.pptx2022.08 멘토링 자료.pptx
2022.08 멘토링 자료.pptx
 
Openstack에 컨트리뷰션 해보기
Openstack에 컨트리뷰션 해보기Openstack에 컨트리뷰션 해보기
Openstack에 컨트리뷰션 해보기
 
JetsonTX2 Python
 JetsonTX2 Python  JetsonTX2 Python
JetsonTX2 Python
 
Docker osc 0508
Docker osc 0508Docker osc 0508
Docker osc 0508
 
제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기제로부터시작하는 Git 두번째 이야기
제로부터시작하는 Git 두번째 이야기
 

Último

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 

Último (6)

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 

Envoy 를 이용한 코드 배포 자동화

  • 1. Envoy 를 이용한 코드 배포 Appkr <juwonkim@me.com> Modern PUG 2016년 1월 정기 모임 자료: bit.ly/code-deploy-with-envoy
  • 2. 오늘 이야기할 것들 • 코드 배포 원칙 • Git 을 이용한 일반적인 코드 배포 전략 • Envoy • Envoy 를 이용한 코드 배포 자동화
  • 3. 코드 배포 원칙 1. 배포하려는 브랜치에 있는 모든 파일이 
 배포할 디렉토리로 복사되어야 한다. 2. 지난 릴리즈 이후, Repo 에서 삭제된 파일이 있다면, 
 배포 디렉토리에서도 삭제되어야 한다. 3. Tracking 되는 파일 중 배포 디렉토리에 변경이 있다면 
 무시되어야 한다 (덮어쓰기). 4. 배포 디렉토리에 있는 Untracked 파일은 
 그대로 두어야 한다. 참고자료: http://gitolite.com/deploy.html
  • 4. Git 배포 - Git 을 이용한 코드 배포의 장단점 • 변경된 파일만 배포하므로, 빠르다. • 이전 릴리즈로 롤백이 용이하다. (git checkout) • Git Hook 을 이용, 배포 후 작업을 자동화할 수도 있다. • Git 은 File Permission 을 추적하지 않는다. • Git 은 빈 디렉토리를 추적하지 않는다. • Database 배포나 migration 을 지원하지 않는다.
  • 5. Git 배포 - (1) SSH in to server then git pull 서버에 SSH 로그인 한 후 가장 간단한 방법이긴한데… 서버에서 Conflict Merge 를 해야할 가능성이 크다. $ git pull
  • 6. Git 배포 - (2) Push to bare remote with Git Hook 로컬에서 만 하면 되는데…. Conflict 는 여전히 발생할 수 있다. $ git push
  • 7. Git 배포 - (2) Push to bare remote with Git Hook ssh in for initialize bare remote website.git document root /var/www # set up a bare Git repo on the remote machine $ mkdir website.git && cd website.git $ git init --bare # create a post-receive hook $ cp hooks/post-receive.sample hooks/post-receive $ chmod +x hooks/post-receive # hooks/post-receive #!/bin/sh GIT_WORK_TREE=/var/www git checkout -f local ~/website
  • 8. Git 배포 - (2) Push to bare remote with Git Hook bare remote website.git local workspace ~/website # add a new remote to your local repo $ git remote add web git@myserver.com:website.git # set a branch to push to remote $ git push web +master:refs/heads/master # deploy !!! $ git push web post-receive hook doc. root /var/www
  • 9. Git 배포 - (3) Git clone 서버에 SSH 로그인 한 후 Clone 후 새로운 Document Root 로 웹 서버 설정 변경 등 가장 번거로운 방법이긴 하지만, Conflict Zero. $ git clone git@myserver.com:website.git
  • 10. “흠, pull/checkout 보다 clone 전략이 더 좋다는데…” “썸 귀찮단 말이야.. 어떻게 하지?” “게다가 리모트에 로그인없이 로컬에서 하면 더 좋겠는데” 이럴 때 필요한 것이 배포 자동화 툴!!! Capistrano (ruby), Fabric (python) 등등. 퍽! 퍽! 우린 PHP 개발자잖아~ deployer, envoy
  • 11. Envoy - 먹는건가요? 1. PHP 언어로 쓰여진 SSH Task Runner • Laravel 의 Blade 유사 템플릿 문법 채용 • {{ $var }}, @task @endtask, @if @endif, …
 2. Laravel 프로젝트가 아니어도 쓸 수 있다.
 3. 배포 툴은 아니다. 배포 자동화를 위해 쓸 수도 있다.
  • 12. Envoy - 설치 및 실행 1. 설치
 
 2. Task 정의 - envoy.blade.php
 3. Task 실행 $ composer global require "laravel/envoy=~1.0" $ envoy --version # Laravel Envoy version 1.0.25 $ cd ~/website && envoy init $ envoy run taskName
  • 13. Envoy- envoy.blade.php @servers(['web' => 'git@mywebserver.com']) @setup // PHP 영역 $now = (new DateTime())->format('c'); @endsetup @task('foo', ['on' => ‘web']) # Bash 영역 NOW=$(date); echo "Foo task fired at {{$now}} local time."; echo "Done at $NOW server time."; @endtask @macro(‘bar’) # 미리 정의한 taskName 만 쓸 수 있음 foo @endmacro
  • 14. Envoy- 사용 가능한 키워드 // 필수 키워드
 @servers(['alias' => 'user@host'])
 
 // PHP 영역에 해당하는 키워드
 @setup $var = 'val'; @include('path-to.php'); @endsetup
 
 # Bash 영역에서 쓸 수 있는 키워드
 {{-- Comment —}} {{ $var }}
 @if(/*php expression*/) # bash @elseif(/*php expression*/) # bash @else # bash @endif
  • 15. Envoy- 사용 가능한 키워드 # Bash 영역에서 쓸 수 있는 키워드
 @foreach(/*php expression*/) # bash @endforeach 
 @for(/*php expression*/) # bash @endfor 
 @while(/*php expression*/) # bash @endwhile 
 @after # bash @hipchat('token', 'room', 'Envoy', 'message')
 @slack('hook', 'channel', 'message') @endafter
  • 16. Envoy 를 이용한 코드 배포 자동화 github.com dev machine production server $ git push (1) $ git clone (3) $ envoy run release (2) appkr/envoy - Envoy Use Case Demo
  • 17. Envoy 를 이용한 코드 배포 자동화 • $ envoy run hello 
 SSH Connection 체크 • $ envoy run release 
 새로운 코드를 서버에 배포 • $ envoy run list 
 릴리즈 목록 보기 • $ envoy run checkout --release=/path/to/release
 /path/to/release 릴리즈로 체크아웃 • $ envoy run prune --keep=n
 최근 n 개릐 릴리즈만 남기고 오래된 릴리즈 삭제 appkr/envoy - 사용 가능한 Task
  • 18. Envoy 를 이용한 코드 배포 자동화 • $ envoy run release 는 아래 작업을 순차적으로 수행 • 필요한 디렉토리 생성 (www, www/shared, www/releases) • Git clone (www/releases/release_YmdHis) • release_YmdHis 디렉토리에서 Composer install • release_YmdHis 디렉토리 아래에 shared 디렉토리 심볼릭 링크 • release_YmdHis 디렉토리를 웹 서버 Document Root 로 심볼릭 링크 • release_YmdHis 디렉토리 권한 변경 appkr/envoy - release 동작 원리
  • 19. Envoy 를 이용한 코드 배포 자동화 # 서버에 아래와 같은 구조로 코드 배포됨. web ├── releases │ └── release_YmdHis │ ├── # other files │ └── shared -> /home/username/web/shared ├── shared └── my_domain_name -> /home/username/web/releases/release_YmdHis appkr/envoy - release 동작 원리
  • 20. Envoy 를 이용한 코드 배포 자동화 # 필요 파일 다운로드 $ cd project $ wget https://raw.githubusercontent.com/appkr/envoy/master/envoy.blade.php appkr/envoy - 프로젝트에 시전해 보려면, // envoy.blade.php 파일 수정 @servers(['web' => ‘username@host’)
 
 @setup $path = [‘base’ => ‘/home/deployer/web’, ‘…’ => ‘…’]; // ... @endsetup
  • 21. Envoy 를 이용한 코드 배포 자동화 // envoy.blade.php 파일도 필요하다면 입맛에 맞게 수정 @servers(['web' => ‘username@host’]) @task('hello', ['on' => ['web']]) HOSTNAME=$(hostname); echo "Hello Envoy! Responding from $HOSTNAME"; @endtask appkr/envoy - 프로젝트에 시전해 보려면, # Task 실행 $ envoy run hello $ envoy run deploy
  • 22. Envoy 를 이용한 코드 배포 자동화 appkr/envoy - 보너스 • $ bash scripts/provision.sh {username}
 LNMP 서버를 빠르게 프로비저닝하는 도구 • username 계정을 이용 • Build tool, Git, Composer 등 설치 및 설정 • Nginx, PHP5, MySql 설치 및 설정 • $ bash scripts/serve.sh {domain} {/path/to/docroot}
 Nginx 사이트를 빠르게 생성해 주는 도구 • /path/to/docroot 를 domain 의 document root 로 연결