envoy + atlassian bamboo 로 laravel 디플로이 하기
개요
Atlassian bamboo 는 Jira, Confluence 로 유명한 아틀라시안사의 지속적인 통합(Continuous Integration)과 지속적인 배포(Continuous Deployment) 를 지원하는 제품입니다.
유명한 오픈소스인 Jenkins 나 Hudson 과 같은 역할을 수행하지만 JIRA 같은 Atlassian 제품과 긴밀한 통합을 지원(빌드 실패시 JIRA 이슈 등록, 해당 빌드와 관련된 JIRA 이슈 확인등)하며 Jenkins 보다 예쁘므로 개인적으로 선호하는 제품입니다.
뱀부는 지속적인 통합 제품답게 maven, gradle 같은 자바 기반의 빌드 유틸리티를 지원하며 여러가지 command 나 task 를 실행하고 결과를 취합하는 기능을 제공하고 있습니다.
envoy는 라라벨 5에 포함된 task runner 로 라라벨 app 배포시 유용하게 사용할 수 있지만 이를 bamboo 를 통해 실행하려는 이유는 다음과 같습니다.
- 운영 장비에 디플로이하는 작업은 보안과 안정성을 위해 개발자의 PC 보다는 격리된 특정 서버(CI 서버)에서 수행하는게 좋습니다.
- envoy 를 통해 배포한 이력을 관리하기 위해서는 envoy 의 구동 이력과 결과를 별도로 보관하고 검색하는 기능이 필요하나 이를 직접 만들다 보면 본질과 동떨어진 야크 털깍기가 될 수 있습니다.
뱀부같은 CI 는 모든 빌드 이력을 보관하고 손쉽게 찾아볼 수 있으므로 envoy 를 통한 배포 이력 관리 용도로 활용할 수 있습니다.
사전 작업
빌드는 많은 리소스를 사용하는 작업이므로 여러 대의 빌드 서버를 두는 경우가 많고 뱀부같은 상용 CI 는 빌드 서버의 대수에 따라 라이센스를 책정합니다. 분산된 개별 빌드 서버를 agent 라 하며 각각 agent는 빌드에 필요한 도구(JDK, ant, maven 등)이 설치되어야 합니다.
디플로이할 app 는 라라벨이므로 빌드 agent 서버에는 PHP 와 composer 그리고 envoy 가 설치되어야 합니다.
envoy 설치 및 bamboo capability 추가
envoy 설치는 laravel envoy 사용하기 를 참고하세요.
설치된 envoy는 bamboo 가 실행할 수 있도록 Add capability 메뉴를 통해 등록해야 합니다. 빌드할 agent 서버에서 envoy 를 설치한 후에 Executable label 에 envoy 를 등록합니다. (뱀부 관리자 권한이 필요합니다.)
envoy script 생성
그리고 배포하려는 프로젝트의 소스에는 Envoy.blade.php 가 추가되어 있어야 합니다.
@setup
$appdir = '/var/www/laravel-app';
$branch = 'master';
@endsetup
## servers 설정은 한 줄에 써야 함.
@servers(['real1' => 'laravel@192.168.10.1', 'real2' => 'laravel@192.168.10.2',])
@task('foo-real', ['on' => ['real1', 'real2']])
echo 'Working on ' . `hostname`
ls -la
@endtask
@task('pull-on-real', ['on' => ['real1', 'real2']])
echo 'Working on ' . `hostname`
cd {{ $appdir }}
php artisan down
git pull origin {{ $branch }}
composer install
composer dump-autoload
php artisan optimize
php artisan config:cache
php artisan up
echo "rev hash :" `git rev-parse --verify HEAD`
@endtask
실행할 task 는 pull-on-real 이며 다음 명령어를 실행하면 됩니다.
envoy run pull-on-real
Plan 설정
뱀부 상단 메뉴의 Create -> Create a new plan 을 선택해서 새로운 PLAN 을 생성합니다.
git 저장소 설정
이제 생성된 플랜에서 Plan Configuration 을 선택하고 Repositories 를 클릭해서 git 저장소를 설정해 줍니다.
Stage 생성
Stage -> Create Stage 를 클릭하여 새로운 Stage 를 생성해 줍니다.
Tasks 등록
- Tasks -> Add Task 를 클릭하여 새로운 task를 등록합니다. 빌드시 제일 먼저 해야할 일은 Source Checkout 이므로 Task type 에서 Source Control 을 선택합니다.
- Repository 에서 위에서 생성한 저장소를 선택하고 Save 를 눌러서 저장합니다.
- 이제 envoy 명령을 통해 배포 작업을 추가할 순서입니다. 뱀부의 Task types 에는 Deployment 항목이 별도로 있지만 PHP 나 envoy 는 없으므로 일반적인 command 를 추가해 주면 됩니다.
- Task Types 창에서 All 을 클릭하고 Command 를 선택합니다.
Executable 에서 envoy 를 선택하고 Argument 에는 envoy 실행시 넘길 아규먼트를 설정합니다. 여기서는 run pull-on-real 를 입력해 주면 됩니다.
envoy 가 보이지 않는다면 사전 작업에서 bamboo capability 에 envoy 를 추가했는지 확인해 보세요.
실행
- 상단의 Run 을 클릭하면 task 를 실행합니다.
- Build summary 에서는 해당 빌드 시간, 관련된 커밋등 빌드에 대한 개괄적인 정보를 볼수 있습니다.
- Logs 탭은 실행한 명령어의 결과를 볼수 있으므로 envoy 의 실행에 따른 콘솔 출력 결과를 확인할 수 있습니다. 위에서 작성한 Envoy 스크립트의 echo 나 git pull 의 실행 결과를 나중에 볼 필요가 있을 경우 Logs 탭에서 확인하면 됩니다.
- Issues 탭은 JIRA 이슈를 표시하며 빌드가 실패하는등 이슈 추가가 필요할 경우 뱀부에서 바로 JIRA 이슈를 등록할 수 있습니다.
같이 보기