시작하기에 앞서...

우리가 웹 어플리케이션을 개발할 때 배포라는 굉장히 반복적인 작업입니다.

아래는 보통의 배포 프로세스입니다.

  1. git push
  2. 로드벨런서에서 인스턴스 분리
  3. 원격지 서버에서 git 소스 다운로드
  4. maven or gradle 로 소스 build
  5. build된 jar 파일 실행
  6. 실행 확인 후 다음 서버에서 2번부터 다시

한두대의 서버라면 문제가 없겠지만 서버가 수십, 수백대일 경우 굉장히 오랜 시간이 걸리며 사람이 수행할 경우 실수가 발생할 수 있습니다.
그래서 이번 시리즈에서는 개발된 소스코드를 빠르고 안전하게 빌드 & 테스트 & 배포를 하는 방법을 알아보겠습니다.

사용 기술

  1. AWS EC2, S3, CodePipeline, CodeDeploy, IAM AWS-CLI
  2. GitLab, GitLab CI, GitLab Runner
  3. Spring boot, maven

** 본 포스트에서는 Spring boot + maven을 사용하지만 다른언어 (ex javascript, python등)을 사용하셔도 상관없습니다.

아래는 앞으로 구성할 배포 프로세스입니다.
process.png

  1. 개발한 코드를 GitLab push합니다.
  2. GitLab CIBuild&Test 를 수행해줍니다.
  3. GitLab CI 에서 S3로 빌드된 파일과 설정들을 업로드합니다.
  4. CloudWatch에서 S3에 파일이 올라온걸 감지해서 CodePipeline을 실행합니다.
  5. CodePipeline에서 CodeDeploy를 실행합니다.
  6. CodeDeploy에서 빌드된 파일을 EC2에 업로드합니다.
  7. EC2에서 어플리케이션을 실행합니다.

Gitlab CI 사용하기

가장먼저 git clone -b step1 https://github.com/KingCjy/Spring-Ci.git 명령어를 실행하여 코드를 다운받고 본인의 GitLab Repository를 생성합니다.

위의 프로젝트는 간단한 ping pong 어플리케이션입니다.

@SpringBootApplication
@RestController
public class DeployApplication {
    public static void main(String[] args) {
        SpringApplication.run(DeployApplication.class, args);
    }

    @GetMapping("/ping")
    public String ping() {
        return "pong";
    }
}

GitLab Runner 설치하기

GitLab Runner은 실제로 우리가 명세한 CI 작업을 수행하고 결과를 GitLab으로 보내는데 사용되는 오픈소스 프로젝트입니다.

GitLab 원격지서버에서 아래의 작업을 수행합니다.

  1. GitLab Repository를 추가합니다.

    curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
  2. GitLab Runner을 설치합니다.

    sudo yum install gitlab-runner
  3. GitLab Runner계정을 생성합니다.

    sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
  4. GitLab Runner을 설치하고 실행합니다.

    sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
    sudo gitlab-runner start
  5. GitLab Runner을 등록합니다.
    원격지 서버 주소, 토큰은 Settings > CI/CD > Runners settings > Specific Runners 에서 확인하실 수 있습니다.

sudo gitlab-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): # GitLab의 서버 주소를 입력합니다.
ex) $: http://192.168.0.2/
Please enter the gitlab-ci token for this runner: # GitLab 토큰을 입력합니다.
ex) $: asdf0asdkjfbFAS
Please enter the gitlab-ci description for this runner: # Runner에 대한 설명을 작성합니다.
ex) $: GitLab Runner
Please enter the gitlab-ci tags for this runner (comma separated): # 태그를 작성합니다. (중요)
ex) $: maven
Please enter the executor: docker-ssh, ssh, virtualbox, docker, parallels, shell, docker+machine, docker-ssh+machine, kubernetes: # Runner의 작동 방식을 선택합니다. shell을 선택합니다
$: shell

Runner가 오류 없이 등록었다면 Settings > CI/CD > Runners settings > Specific Runners 에서 Runner가 정상적으로 등록되었는지 확인 할 수 있습니다.
스크린샷 2019-04-25 오후 5.52.21.png

.gitlab-ci.yml 설정하기

.gitlab-ci.ymlGitLab CI의 행동을 정의해주는 설정파일입니다.
프로젝트의 Root 폴더에 deploy 폴더와 .gitlab-ci.yml 파일을 생성해 준 후 아래와 같이 작성합니다.

cache:
  paths:
    - ./.m2/repository

maven_build:
  stage: deploy
  tags:
    - maven
  script:
    - mvn clean install
    - echo "success"
  • cachemavenrepository들을 캐싱합니다.
  • maven_build: 임의로 지은 job의 이름입니다.
  • tags: 태그를 가진 runner를 사용합니다
  • script: runner에서 실행할 스크립트를 정의합니다.

확인

지금까지 작성한 코드를 commit하고 push합니다.

git add .
git commit -m 'deploy-test'
git push origin master

push한 후 GitLab에서 CI/CD > Jobs로 들어가면 아래와 같이 빌드가 성공한 걸 볼 수 있습니다.
스크린샷 2019-04-25 오후 6.50.34.png
여기서 passed를 클릭하면 아래와 같이 빌드 로그를 확인할 수 있습니다.

...
Downloaded from central: https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-loader-tools/2.1.4.RELEASE/spring-boot-loader-tools-2.1.4.RELEASE.jar (149 kB at 475 kB/s)
[INFO] Replacing main artifact with repackaged archive
[INFO] 
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ deploy ---
[INFO] Installing /home/gitlab-runner/builds/3d60ee87/0/KingCjy/deploy-test/target/deploy-0.0.1-SNAPSHOT.jar to /home/gitlab-runner/.m2/repository/com/kingcjy/deploy/0.0.1-SNAPSHOT/deploy-0.0.1-SNAPSHOT.jar
[INFO] Installing /home/gitlab-runner/builds/3d60ee87/0/KingCjy/deploy-test/pom.xml to /home/gitlab-runner/.m2/repository/com/kingcjy/deploy/0.0.1-SNAPSHOT/deploy-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  28.746 s
[INFO] Finished at: 2019-04-25T18:17:07+09:00
[INFO] ------------------------------------------------------------------------
$ echo "success"
success
Creating cache default...
Runtime platform                                    arch=amd64 os=linux pid=24557 revision=3001a600 version=11.10.0
WARNING: ./.m2/repository: no matching files       
No URL provided, cache will be not uploaded to shared cache server. Cache will be stored only locally. 
Created cache
Job succeeded

이렇게 GitLab CIRunner의 설정을 완료했습니다.
다음 포스트에서는 AWS CLI, IAM, CodeDeploy, CodePipelineaws 설정을 다뤄보겠습니다.

감사합니다.

모든 소스 코드는 GITHUB에있습니다.
현재까지의 코드 : https://github.com/KingCjy/Spring-Ci/tree/post1

참고자료