Gitlab CI

Gitlab을 통해 자동 CI와 Spark Submit 까지 진행해보았다.

Gitlab에 프로젝트를 생성 후 WordCount 예제를 작성한다.

package com.example.test

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD.rddToPairRDDFunctions

object WordCount {
  def main(args: Array[String]): Unit =
    {
      // input, output 경로를 파라미터로 받는다.
      val inputPath = args(0)
      val outputPath = args(1)

	  // yarn위에서 spark를 동작시키고 싶다면 setMaster를 yarn으로 한다.
      //val conf = new SparkConf().setMaster("yarn").setAppName("wordCount")
      val conf = new SparkConf().setMaster("master").setAppName("wordCount")
      val sc = new SparkContext(conf)
	  sc.setLogLevel("ERROR")

      val fileRDD = sc.textFile(inputPath)
      val resultRDD = fileRDD.flatMap(line => line.split(" "))
        .map(word => (word, 1)).reduceByKey(_ + _)
        
      // 결과를 console에 출력함 
      //resultRDD.foreach(tuple => println(tuple._1, tuple._2)) 
      resultRDD.saveAsTextFile(outputPath)        
    }
}

기본적으로 Gitlab CI를 통작하기 위해 아래 두가지가 필요하다.

  1. 프로젝트 루트 디렉토리에 Config 파일을 작성해야 한다. (.gitlab-ci.yml)
  2. CI 를 실제 수행할 프로세스인 Gitlab Runner를 등록해야한다.

gitlab ci를 위한 config 작성

.gitlab-ci.yml을 생성 후 아래 코드를 저장한다.

stages:
  - build
  - submit

# 변수 정의
variables:
  GIT_STRATEGY: none
  GIT_CHECKOUT: "false"
  MAVEN_CLI_OPTS: "-DskipTests=true"

# 다음 stage로 넘어갈 때, build 결과를 submit stage에서 사용할 수 있다.
cache:
  untracked: true

build:
  stage: build
  script:
    - mvn clean compile package
  variables:
    GIT_STRATEGY: fetch
    GIT_CHECKOUT: "true"
  tags:
    - build

submit:
  stage: submit
  when: manual
  script:
    - cd target/classes
    - $SPARK_HOME/bin/spark-submit
      --class test.jgb710.WordCount
      --master yarn
      --deploy-mode cluster
      --num-executors 1 --executor-cores 1 --executor-memory 1g
      --driver-cores 1 --driver-memory 1g
      --packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.0
      ../wordCount.jar
  tags:
    - build

Stage는 크게 Build, Submit 과정으로 순차적으로 진행한다. 즉, Build를 수행 완료해야 Submit을 수행한다.

Build는 Maven을 사용한다. mvn clean compile package 명령을 통해 최종 .jar 파일을 생성한다.

Submit은 생성한 .jar파일을 Spark Submit을 통해 실행한다. 필요한 옵션은 알아서 설정한다.

Build, Submit 아래 tags: build가 정의되어있는데, 이는 build라는 tags를 가진 gitlab runner에서 동작한다는 의미이다.

gitlab runner 등록

gitlab runner는 공식문서를 참고하여 서버에 runner를 등록한다(sudo gitlab-runner register를 사용한다).

settings - CI/CD - Runners settings 에 runner 등록을 위한 URL과 token 정보가 있음으로 이를 참고한다.

등록 하면 아래와 같이 Runner가 등록되었음을 볼 수 있다. 정상동작중이라면 녹색으로 표시된다. 만약 정상 동작을 하지 않는 다면 재시작 해본다. (sudo gitlab-runner restart)

gitlab-1

자동 빌드

변경된 코드를 Gitlab에 커밋하면 자동으로 CI가 발생한다.

CI 발생은 Repository - Commits에 들어가면 CI 가 실행중임을 알 수 있다.

gitlab-2

Parallel Gitlab runner

여러 Gitlab Runner를 동시에 시작하고 싶을 때가 있다.

이럴 경우 추가로 Gitlab runner 등록해야한다. 이후 .gitlab-ci.yml을 아래와 같이 변경한다.

stages:
  - build
  - submit

variables:
  GIT_STRATEGY: none
  GIT_CHECKOUT: "false"
  MAVEN_CLI_OPTS: "-DskipTests=true"

cache:
  untracked: true

build:
  stage: build
  script:
    - mvn clean compile package
  variables:
    GIT_STRATEGY: fetch
    GIT_CHECKOUT: "true"
  tags:
    - build

submit_1:
  stage: submit
  when: manual
  script:
    - cd target/classes
    - $SPARK_HOME/bin/spark-submit
      --class test.jgb710.WordCount
      ../wordCount.jar
  tags:
    - submit_1

submit_2:
  stage: submit
  when: manual
  script:
    - cd target/classes
    - $SPARK_HOME/bin/spark-submit
      --class test.jgb710.WordCount
      ../wordCount.jar
  tags:
    - submit_2

아래 submit이 submit_1, submit_2로 나뉜 것을 볼 수 있고 각 tags도 submit_1, submit_2로 새로 등록했다. (총 3개의 Runner가 있음.)

이후 리눅스 기준으로 /etc/gitlab-runner/config.toml에서 Parallel 하게 동작시킬 수 있게 concurrent값을 3으로 바꿔준다.

실행 결과 아래와 같이 동작하는 것을 볼 수 있다.

gitlab-3

Comments