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

23
Envoy 를 이용한 코드 배포 Appkr <[email protected]> Modern PUG 2016년 1월 정기 모임 자료: bit.ly/code-deploy-with-envoy

Upload: juwon-kim

Post on 08-Jan-2017

1.771 views

Category:

Technology


0 download

TRANSCRIPT

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

Envoy 를 이용한 코드 배포Appkr <[email protected]>

Modern PUG 2016년 1월 정기 모임

자료: bit.ly/code-deploy-with-envoy

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

오늘 이야기할 것들

• 코드 배포 원칙

• Git 을 이용한 일반적인 코드 배포 전략

• Envoy

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

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

코드 배포 원칙

1. 배포하려는 브랜치에 있는 모든 파일이 배포할 디렉토리로 복사되어야 한다.

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

3. Tracking 되는 파일 중 배포 디렉토리에 변경이 있다면 무시되어야 한다 (덮어쓰기).

4. 배포 디렉토리에 있는 Untracked 파일은 그대로 두어야 한다.

참고자료: http://gitolite.com/deploy.html

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

Git 배포 - Git 을 이용한 코드 배포의 장단점

• 변경된 파일만 배포하므로, 빠르다.

• 이전 릴리즈로 롤백이 용이하다. (git checkout)

• Git Hook 을 이용, 배포 후 작업을 자동화할 수도 있다.

• Git 은 File Permission 을 추적하지 않는다.

• Git 은 빈 디렉토리를 추적하지 않는다.

• Database 배포나 migration 을 지원하지 않는다.

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

Git 배포 - (1) SSH in to server then git pull

서버에 SSH 로그인 한 후

가장 간단한 방법이긴한데…

서버에서 Conflict Merge 를 해야할 가능성이 크다.

$ git pull

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

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

로컬에서

만 하면 되는데….

Conflict 는 여전히 발생할 수 있다.

$ git push

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

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/shGIT_WORK_TREE=/var/www git checkout -f

local~/website

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

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 [email protected]: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

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

Git 배포 - (3) Git clone

서버에 SSH 로그인 한 후

Clone 후 새로운 Document Root 로 웹 서버 설정 변경 등

가장 번거로운 방법이긴 하지만, Conflict Zero.

$ git clone [email protected]:website.git

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

“흠, pull/checkout 보다 clone 전략이 더 좋다는데…” “썸 귀찮단 말이야.. 어떻게 하지?”

“게다가 리모트에 로그인없이 로컬에서 하면 더 좋겠는데”

이럴 때 필요한 것이 배포 자동화 툴!!! Capistrano (ruby), Fabric (python) 등등.

퍽! 퍽! 우린 PHP 개발자잖아~ deployer, envoy

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

Envoy - 먹는건가요?

1. PHP 언어로 쓰여진 SSH Task Runner

• Laravel 의 Blade 유사 템플릿 문법 채용

• {{ $var }}, @task @endtask, @if @endif, …

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

3. 배포 툴은 아니다. 배포 자동화를 위해 쓸 수도 있다.

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

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

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

Envoy- envoy.blade.php

@servers(['web' => '[email protected]'])

@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

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

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

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

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

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

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

github.com

dev machine production server

$ git push (1) $ git clone (3)

$ envoy run release (2)

appkr/envoy - Envoy Use Case Demo

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

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

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

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 동작 원리

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

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 동작 원리

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

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

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

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

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

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 로 연결

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

고맙습니다.Appkr <[email protected]>