J-Jobs

Guides -J-Jobs Orchestrator v2.4 How-To 가이드

J-Jobs Orchestrator How-To 가이드

최종 작성일 : 2019년 7월

기준 버전 : J-Jobs v2.4

Copyright ⓒ LG CNS LG CNS의 사전 승인 없이 본 내용의 전부 또는 일부에 대한 복사, 배포 사용을 금합니다.

본 문서는 J-Jobs Orchestrator 사용자의 이해를 돕기 위한 문서로 Manager 의 메뉴 구성 중심으로 작성되어 있다.

J-Jobs for CI/CD

J-Jobs는 On-premise 환경 뿐만 아니라 AWS, Azure, GCP 등 주요 Cloud 플랫폼, Docker 기반의 컨테이너 등 다양한 플랫폼과의 연계를 지원하며, Hybrid Cloud 환경으로 구성된 시스템의 운영 관리에 특화된 기능을 제공하는 솔루션이다. J-Jobs는 CI/CD를 위한 다양한 기능을 제공한다.

  • 시각화 편집도구를 이용한 CI/CD 작업 흐름(Pipeline) 관리

  • On-Premise, Cloud(AWS, Azure, GCP), 컨테이너(Docker) 환경으로 배포

  • 실행/제어/모니터링, 병렬처리, 수동 승인, 스케줄, 알림(E-MAIL, SMS등) 기능 제공

CI/CD 작업에 필요한 Build, Test, Deploy 관련 소프트웨어(git, gradle, mvn, npm 등)를 사용할 수 있는 환경이 구성되어 있어야 한다.

CI/CD를 위한 J-Jobs 구성

CI/CD 작업을 통합 관리하기 위하여 J-Jobs를 사용하고자 하는 경우에 On-premise, Cloud, Container 환경 뿐만 아니라 하이브리드 Cloud 환경에서도 다양하게 구성할 수 있다.

본 문서에서 사용되는 용어는 다음과 같이 정의한다.

  • jjobs-instance : J-Jobs 풀버전이 설치되어 있는 Host/VM인스턴스임

    단, J-Jobs Manager 사용을 위하여 방화벽 설정을 이용하여 외부에서 접근 가능하도록 포트(7065)를 열어둔다. 필요에 따라 J-Jobs Server를 위한 포트(7075)도 열어둔다.

  • Internal IP : 내부 망에서 할당된 IP (예, AWS의 경우 Private IP)

  • External IP : 외부 망에서 할당된 IP (예, AWS의 경우 Public IP)

On-premise/VM 환경에서 J-Jobs 구성

On-premise/VM 환경에서 개발, 검수, 운영 환경에 다수의 Host가 존재할 때, 다음과 같이 구성할 수 있다.

  • (develop/staging/prod)-group : 개발(develop), 검수(staging), 운영(prod) 환경을 구분하기 위한 에이전트 그룹
  • jjobs-(dev/staging/prod)-agent00~NN : J-Jobs Agent가 설치된 Host/VM인스턴스로서, J-Jobs Agent는 각각의 환경에 맞는 에이전트 그룹에 포함됨

하이브리드 Cloud 환경에서 J-Jobs 구성

운영 환경을 하이브리드 Cloud로 구성한 경우, 여러 Cloud 환경을 대상으로 CI/CD 작업 수행이 필요하다. 예를 들어 운영환경이 AWS, Azure, GCP에 삼중화된 경우, 다음과 같이 구성할 수 있다.

  • (aws/azure/gcp)-group : 각 AWS, Azure, GCP 환경의 인스턴스를 구분하기 위한 에이전트 그룹
  • jjobs-(aws/azure/gcp)-agent00~NN : J-Jobs Agent가 설치된 인스턴스로서, J-Jobs Agent는 각각의 환경에 맞는 에이전트 그룹에 포함됨

Container 환경에서 J-Jobs 구성

Docker 기반의 Container 환경에서 개발, 검수, 운영 환경에 다수의 Host/VM인스턴스가 존재할 때, 다음과 같이 구성할 수 있다. Kubernetes와 같은 Container Orchestration Platform은 추후 지원 예정이다.

  • (develop/staging/prod)-cluster: 개발(develop), 검수(staging), 운영(prod) 환경을 구분하기 위한 에이전트 그룹
  • jjobs-(dev/staging/prod)-agent00~NN : J-Jobs Agent가 설치된 Host/VM인스턴스 혹은 jjobs-agent-image를 이용하여 J-Jobs Agent 실행중인 Container, J-Jobs Agent는 각각의 환경에 맞는 에이전트 그룹에 포함됨
  • jjobs-agent-image : J-Jobs Agent가 설치된 Docker 이미지
  • Docker Registry : Docker Hub 혹은 프로젝트 자체적으로 사용중인 Docker Registry
  • Docker Image : Docker Hub에서 다운로드 받은 이미지 + Docker build를 사용해서 생성된 사용자 이미지

CI/CD 사용 예시를 위한 J-Jobs 구성

본 문서에서 CI/CD를 위한 J-Jobs 사용 방법을 설명하기 위해 구성하고자 하는 아키텍처는 다음 그림과 같다.

J-Jobs 설치

기본 유틸 설치

J-Jobs 의 원할한 설치를 위해 아래 명령을 실하여 필요한 유틸을 설치한다.

  • sudo yum install zip -y

  • sudo yum install unzip -y

  • sudo yum install java-1.8.0-openjdk-devel.x86_64 -y

  • javac 의 경로를 확인하고 link 명령을 사용하여 설치된 jdk의 절대 경로를 확인한다. 추후 J-Jobs 설치 시에 사용된다.

    [jjobs@jjobs-instance ~]$ which javac
    /usr/bin/javac
    [jjobs@jjobs-instance ~]$ readlink -f /usr/bin/javac
    /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/bin/javac
    

J-Jobs Meta DB 설치 (PostgreSQL)

J-Jobs에서 사용하는 기본 DB(PostgreSQL)를 설치하여 사용하는 것을 기본으로 설명한다. 실제 프로젝트에서는 Oracle, MariaDB, H2, MS-SQL 등 타 DB 사용이 가능하다.

  • DB설치를 위해 전달 받은 설치파일(jjob_DB_installer_linux_x64.sh)을 jjobs-instance에 복사하고 실행 권한을 부여한다.

    [jjobs@jjobs-instance ~]$ chmod 755 jjob_DB_installer_linux_x64.sh
    [jjobs@jjobs-instance ~]$ ll
    total 22064
    -rwxr-xr-x. 1 jjobs jjobs 22591109 Jul  9 06:10 jjob_DB_installer_linux_x64.sh
    [jjobs@jjobs-instance ~]$
    
  • 필요한 폴더를 미리 만들어 둔다.

    [jjobs@jjobs-instance ~]$ mkdir pgsql
    [jjobs@jjobs-instance ~]$ cd pgsql/
    [jjobs@jjobs-instance pgsql]$ mkdir engn && mkdir data && mkdir log
    [jjobs@jjobs-instance pgsql]$ ll
    total 0
    drwxrwxr-x. 2 jjobs jjobs 6 Jul  9 06:22 data
    drwxrwxr-x. 2 jjobs jjobs 6 Jul  9 06:22 engn
    drwxrwxr-x. 2 jjobs jjobs 6 Jul  9 06:22 log
    [jjobs@jjobs-instance pgsql]$ cd ..
    [jjobs@jjobs-instance ~]$
    
  • 다음과 같이 제공된 설치 파일을 실행하여 DB를 설치한다.

    [jjobs@jjobs-instance ~]$ ./jjob_DB_installer_linux_x64.sh \
    --base_path /home/jjobs/pgsql \
    --install_kind B \
    --db_home_path /home/jjobs/pgsql/engn \
    --db_data_path /home/jjobs/pgsql/data \
    --db_log_path /home/jjobs/pgsql/log \
    --db_ip 127.0.0.1 \
    --db_port 5432 \
    --db_user jjobs \
    --db_pswd jjobs1234 \
    --db_name jjobs \
    --db_vip 127.0.0.1
    
  • 라이선스 승인 단계에서 y를 입력하여 설치를 진행하여 아래와 같이 나오면 성공이며, jjobs 롤이 이미 있다는 에러는 넘겨도 상관없다.

    ...
    waiting for server to start.... done
    server started
    createuser: creation of new role failed: ERROR:  role "jjobs" already exists
    ALTER ROLE
    CREATE ROLE
    CREATE ROLE
    waiting for server to shut down.... done
    server stopped
    waiting for server to start.... done
    server started
    waiting for server to shut down.... done
    server stopped
       ...... Done
    =======================================================
     Program Install Success
    =======================================================
    [jjobs@jjobs-instance ~]$
    

J-Jobs 기본 설치

사전에 jjobs-instance라고 정의한 J-Jobs 풀버전이 설치되어 있는 Host/VM인스턴스를 구성하고자 하므로, 설치 파일의 Full 옵션을 이용해 한번에 Manager, Server, Agent를 설치한다. J-Jobs 설치와 관련된 자세한 사항은 설치_가이드를 참고한다.

  • 설치파일(jjob_installer_linux_x64_2.3.5_yyyymmdd)을 jjobs-instance에 복사하고 실행 권한을 부여한다.

    [jjobs@jjobs-instance ~]$ chmod 755 jjob_installer_linux_x64_2.3.5_20190704
    [jjobs@jjobs-instance ~]$ ll
    total 337944
    -rwxr-xr-x. 1 jjobs jjobs  22591109 Jul  9 06:10 jjob_DB_installer_linux_x64.sh
    -rwxr-xr-x. 1 jjobs jjobs 323460257 Jul  9 06:36 jjob_installer_linux_x64_2.3.5_20190704
    drwxrwxr-x. 5 jjobs jjobs        65 Jul  9 06:25 pgsql
    [jjobs@jjobs-instance ~]$
    
  • 전체 설치 스크립트를 실행한다. java_path 항목은 미리 확인해둔 java 설치 경로를 이용한다.

    jdbc_url 의 DB IP는 127.0.0.1 이 아닌 Host/VM인스턴스의 Internal IP를 사용해야 한다.

    이유는 다른 Host/VM인스턴스에 설치된 J-Jobs Agent가 접속할 수 있도록 설정하기 위함이다.

    [jjobs@jjobs-instance ~]$ ./jjob_installer_linux_x64_2.3.5_20190704 \
    --base_path /home/jjobs/jjobs \
    --install_kind F \
    --install_mode I \
    --java_path /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64 \
    --use_postgresql \
    --jdbc_url 'jdbc:postgresql://10.146.0.2:5432/jjobs' \
    --dbms_user jjobs \
    --dbms_pswd jjobs1234 \
    --use_dedicated_man_was \
    --man_web_port 7065 \
    --svr_service_web_port 7075 \
    --svr_cotrol_base_port 17075 \
    --agnt_name agent1 \
    --agnt_svr_group 1 \
    --agnt_group 0 \
    --agnt_startup_svc_protocol http \
    --agnt_startup_svc_context jjob-server \
    --agnt_startup_svc_domain 127.0.0.1 \
    --agnt_startup_svc_port 7075
    
  • 라이선스 승인 단계에서 y를 입력하여 설치를 진행하여 아래와 같이 나오면 성공이다.

    1. Loading information.
       ...... Done
    2. Making configuration.
       ...... Done
    3. Preparing installation.
    unpacking.... jjob-server
    done.
    unpacking.... jjob-manager
    done.
    repacking.... jjob-server
    done.
    repacking.... jjob-manager
    done.
       ...... Done
    4. Installing.
       ...... Done
    =======================================================
     Program Install Success
    =======================================================
    [jjobs@jjobs-instance ~]$
    
  • jjobs 폴더 하위에는 manager, server, agent 폴더로 구성되어 있으며 각각 실행, 중지 스크립트가 생성되었음을 확인한다.

    [jjobs@jjobs-instance ~]$ cd jjobs
    [jjobs@jjobs-instance jjobs]$ ll
    total 32
    drwxrwxr-x. 16 jjobs jjobs  194 Jul  9 06:41 agent
    -rw-r--r--.  1 jjobs jjobs 5550 Aug  5  2018 License.txt
    drwxrwxr-x.  9 jjobs jjobs  160 Jul  9 06:41 manager
    drwxrwxr-x.  2 jjobs jjobs    6 Jul  9 06:41 mft
    drwxrwxr-x.  9 jjobs jjobs  160 Feb 13 15:37 server
    -rwxr-xr-x.  1 jjobs jjobs  204 Jul  9 06:41 start_agent.sh
    -rwxr-xr-x.  1 jjobs jjobs  185 Jul  9 06:41 start_manager.sh
    -rwxr-xr-x.  1 jjobs jjobs  459 Jul  9 06:41 start_server.sh
    -rwxr-xr-x.  1 jjobs jjobs  167 Jul  9 06:41 stop_agent.sh
    -rwxr-xr-x.  1 jjobs jjobs  134 Jul  9 06:41 stop_manager.sh
    -rwxr-xr-x.  1 jjobs jjobs  349 Jul  9 06:41 stop_server.sh
    [jjobs@jjobs-instance jjobs]$
    

J-Jobs Agent 추가 설치

사전에 jjobs-dev-agent00, jjobs-staging-agent00, jjobs-prod-agent00 ~ jjobs-prod-agentNN으로 정의한 J-Jobs Agent가 설치되어 있는 Host/VM인스턴스를 구성하고자 한다. J-Jobs Agent 설치 대상 Host/VM인스턴스에서 다음과 같은 순서로 J-Jobs Agent를 설치한다.

  • 기본 유틸 zip, unzip, openjdk를 설치한다.

  • javac 의 경로를 확인하고 link 명령을 사용하여 설치된 jdk의 절대 경로를 확인한다.

  • 다음과 같이 설치 스크립트를 실행한다. java_path 항목은 미리 확인해둔 java 설치 경로를 이용하고, startup_url 항목은 jjobs-instance의 Internal IP로 설정한다.

    [jjobs@jjobs-dev-agent00 ~]$ ./jjob_installer_linux_x64_2.3.5_20190704 \
    --base_path /home/jjobs \
    --install_kind A \
    --install_mode I \
    --java_path /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64 \ 
    --svr_group 1 --agnt_group 0 --startup_url http://10.146.0.2:7075/jjob-server
    
  • Docker와 Tomcat을 추가로 설치한다. (CI/CD 관련 유틸 준비 장을 참고한다.)

J-Jobs 실행

설정 및 설치가 끝났으면 jjobs-instace로 다시 접속하여 필요한 설정을 마무리 한다.

J-Jobs Meta DB를 실행(PostgreSQL)

[jjobs@jjobs-instance jjobs]$ sh /home/jjobs/pgsql/engn/start_db.sh
waiting for server to start.... done
server started
[jjobs@jjobs-instance jjobs]$

J-Jobs Manager 실행

/home/jjobs/jjobs 에서 실행하며, 중간에 발생하는 에러는 테이블이 존재하지 않아 발생하는 것으로 최초 실행에서는 정상이다. 확인 후 Ctrl+C 로 빠져나온다.

[jjobs@jjobs-instance jjobs]$ ./start_manager.sh
Using CATALINA_BASE:   /home/jjobs/jjobs/manager
Using CATALINA_HOME:   /home/jjobs/jjobs/manager
Using CATALINA_TMPDIR: /home/jjobs/jjobs/manager/temp
Using JRE_HOME:        /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
Using CLASSPATH:       /home/jjobs/jjobs/manager/bin/bootstrap.jar:/home/jjobs/jjobs/manager/bin/tomcat-jul i.jar
Tomcat started.
...
...
...
[M][2019-07-09 07:01:08,802][INFO ] HV000001: Hibernate Validator 5.2.1.Final
[M][2019-07-09 07:01:10,430][INFO ] Looking for @ControllerAdvice: WebApplicationContext for namespace 'servlet-servlet': startup date [Tue Jul 09 07:01:05 UTC 2019]; parent: Root WebApplicationContext
[M][2019-07-09 07:01:10,573][INFO ] Looking for @ControllerAdvice: WebApplicationContext for namespace 'servlet-servlet': startup date [Tue Jul 09 07:01:05 UTC 2019]; parent: Root WebApplicationContext
[M][2019-07-09 07:01:10,737][INFO ] Mapped URL path [/repository/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'
[M][2019-07-09 07:01:20,200][INFO ] FrameworkServlet 'servlet': initialization completed in 15155 ms
09-Jul-2019 07:01:20.245 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /home/jjobs/jjobs/manager/webapps/jjob-manager.war has finished in 37,784 ms
09-Jul-2019 07:01:20.259 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-7065"]
09-Jul-2019 07:01:20.293 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-6994"]
09-Jul-2019 07:01:20.295 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 37949 ms
^C
[jjobs@jjobs-instance jjobs]$
  • http://ExternalIP:7065/jjob-manager 접속하여 로그인 화면에서 root/jjobs1234 계정으로 로그인하면 메타테이블이 없음 확인창이 뜬다. (해당 메시지는 최초 설치후 실행에서만 볼 수 있다)

  • 확인을 눌러 메타 테이블 생성을 진행한다.

  • 우측 상단의 로그인 화면으로 이동을 눌러 다시 root계정으로 로그인을 한다.
  • 설치/제거 메뉴의 우측 상단의 초기화 마법사를 눌러 초기화를 진행한다 (설치_가이드에서 상세 확인할 수 있다.)

라이선스는 j-jobs@lgcns.com 으로 문의하여 발급 받아야 한다.

  • 로그아웃을 하고 ADMINISTRATOR계정으로 로그인을 한다. (초기화 마법사에서 설정한 ID/PW를 이용한다.)

  • 관리자 > 시스템설정 > 서버설정 화면에서 서버 편집을 눌러 통신정보 탭의 최대 연결수를 조정한다.

    하나의 에이전트는 3개의 tcp라인을 사용하기에 기본설정 10은 최대 3개의 에이전트가 연결될 수 있다. (Bad case)

J-Jobs Server 실행

/home/jjobs/jjobs 에서 실행하며 아래처럼 에러없이 로그가 보이면 성공이다

[jjobs@jjobs-instance jjobs]$ ./start_server.sh
Using CATALINA_BASE:   /home/jjobs/jjobs/server
Using CATALINA_HOME:   /home/jjobs/jjobs/server
Using CATALINA_TMPDIR: /home/jjobs/jjobs/server/temp
Using JRE_HOME:        /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
Using CLASSPATH:       /home/jjobs/jjobs/server/bin/bootstrap.jar:/home/jjobs/jjobs/server/bin/tomcat-juli.jar
Using CATALINA_PID:    server.pid
Existing PID file found during start.
Removing/clearing stale PID file.
Tomcat started.
[S][2019-07-09 08:17:00,652][INFO ] Closing Root WebApplicationContext: startup date [Tue Jul 09 08:16:51 UTC 2019]; root of context hierarchy
[S][2019-07-09 08:17:00,672][INFO ] Shutting down EhCache CacheManager
...
...
...
[S][2019-07-09 08:30:52,637][INFO ] HV000001: Hibernate Validator 5.2.1.Final
[S][2019-07-09 08:30:53,971][INFO ] Looking for @ControllerAdvice: WebApplicationContext for namespace 'servlet-servlet': startup date [Tue Jul 09 08:30:49 UTC 2019]; parent: Root WebApplicationContext
[S][2019-07-09 08:30:54,090][INFO ] Looking for @ControllerAdvice: WebApplicationContext for namespace 'servlet-servlet': startup date [Tue Jul 09 08:30:49 UTC 2019]; parent: Root WebApplicationContext
[S][2019-07-09 08:30:54,204][INFO ] Mapped URL path [/repository/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'
[S][2019-07-09 08:30:54,405][INFO ] FrameworkServlet 'servlet': initialization completed in 4542 ms
09-Jul-2019 08:30:54.432 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /home/jjobs/jjobs/server/webapps/jjob-server.war has finished in 29,214 ms
09-Jul-2019 08:30:54.451 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-7075"]
09-Jul-2019 08:30:54.601 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-7004"]
09-Jul-2019 08:30:54.734 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 29614 ms
  • 서버 기동 정상여부는 모니터링 > 서버 화면에서 확인 할 수 있다.

J-Jobs Agent 실행

먼저 start_agent.sh 파일의 마지막 내용이 아래와 같은지 확인하고 아니라면 수정하여 저장한다.

...

./startdaemon.sh 0 1 http x.x.x.x 7075 /jjob-server jjob 0 agent

  • /home/jjobs/jjobs 에서 실행하며 프로세스 확인은 설치_가이드를 참고한다.

    [jjobs@jjobs-instance jjobs]$ ./start_agent.sh
    JAVA_HOME = /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
    BATCH_HOME = /home/jjobs/jjobs/agent
     ready to stop
    ... cleaning PID
    [jjobs@jjobs-instance jjobs]$
    
  • 정상 실행이 되었다면 모니터링 > 서버 화면에서 다음처럼 확인 할 수 있다.

추가 설치한 J-Jobs Agent 실행

jjobs-dev-agent00, jjobs-staging-agent00, jjobs-prod-agent00 ~ jjobs-prod-agentNN에 접속하여 앞서 설명한 방법과 유사하게 J-Jobs Agent를 실행한다. 먼저 start_agent.sh 파일을 확인하고 필요하다면 수정한다.

start_agent.sh 하단에 표시된 IP가 jjobs-instance의 Internal IP로 설정되어 있어야 한다.

예를 들어, 다음과 같이 표기되어 있어야 한다.

./startdaemon.sh 0 1 http 10.146.0.2 7075 /jjob-server jjob 0 agent

에이전트 그룹 설정

운영자 가이드에서 관리자 > 에이전트 설정 설명을 참고하여 개발/검수/운영 환경의 에이전트 그룹을 추가한다. J-Jobs Agent가 구동되면 기본적으로 해당 Agent 정보가 추가되고 DEFAULT_GROUP에 속한다. CI/CD 사용 예시를 위한 J-Jobs 구성을 참고하여 각각의 J-Jobs Agent를 적절한 에이전트 그룹으로 이동한다.

CI/CD 관련 유틸 준비

본 문서에서는 CentOS 7을 기준으로 설치 과정을 설명한다.

CI/CD 작업에 사용되는 유틸(소프트웨어)은 다음과 같이 설치되어야 한다.

jjobs-instancejjobs-dev-agent00jjobs-staging-agent00jjobs-prod-agent00
~ jjobs-prod-agentNN
mavenO
gitO
TomcatOOO
DockerOOOO
SFTPserverclientclientclient

maven

  1. jdk가 설치되어 있어야 하므로, jdk 유무를 확인한다.

    jdk가 없으면 J-Jobs 설치에서 설명한 방법대로 jdk를 설치한다.

  2. wget을 설치한다.

    [jjobs@jjobs-instance ~]$ sudo yum install wget -y
    
  3. 엔진 폴더 디렉토리를 생성한다. (예, /engn001)

  4. maven 설치버전을 다운로드 받는다.

    만약, 링크를 찾을 수 없다는 오류가 발생하면 Maven 홈페이지(https://maven.apache.org/)에서 다운로드 받거나 다른 버전의 URL로 변경한다.

    [jjobs@jjobs-instance engn001]$ wget http://www-eu.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
    
  5. 다운로드 받은 maven 설치 파일의 압축을 푼다.

    [jjobs@jjobs-instance engn001]$ tar xvfz apache-maven-3.6.1-bin.tar.gz
    
  6. maven을 다른 폴더에서도 사용할 수 있도록 환경변수의 PATH 설정을 변경한다. (/home/jjobs/.bash_profile)

    MAVEN_HOME=/engn001/apache-maven-3.6.1
    export MAVEN_HOME
    
    PATH=$PATH:$HOME/.local/bin:$HOME/bin:$MAVEN_HOME/bin
    
  7. .bash_profile 파일을 반영해주고 maven이 정상적으로 설치되었음을 확인한다.

    [jjobs@jjobs-instance ~]$ source /home/jjobs/.bash_profile
    [jjobs@jjobs-instance ~]$ mvn -version
    Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-04T19:00:29Z)
    Maven home: /engn001/apache-maven-3.6.1
    Java version: 1.8.0_212, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64/jre
    Default locale: en_US, platform encoding: UTF-8
    OS name: "linux", version: "3.10.0-957.1.3.el7.x86_64", arch: "amd64", family: "unix"
    

git

  1. Git을 설치한다.

    [jjobs@jjobs-instance ~]$ sudo yum install git -y
    
  2. 소스 폴더 디렉토리를 생성한다. (예, /sorc001)

  3. Git Hub에서 Web Application 샘플을 다운로드 한다.

    본 문서에서사용하는 예제는 Spring MVC Showcase 이지만, 다른 샘플로 대체 가능하다.

    소스 코드가 변경되었을 때, 개발/검수/운영 서버에 제대로 반영되는지 확인하고자 한다면, Git Hub에서 다운로드 받은 샘플을 개인 Git Hub 혹은 Git Repository에 업로드 한 뒤에, 다음 예시의 git clone을 개인 Git Hub 혹은 Git Repository의 URL로 변경하여 수행한다.

    [jjobs@jjobs-instance sorc001]$ git clone git://github.com/SpringSource/spring-mvc-showcase.git
    Cloning into 'spring-mvc-showcase'...
    remote: Enumerating objects: 1099, done.
    remote: Total 1099 (delta 0), reused 0 (delta 0), pack-reused 1099
    Receiving objects: 100% (1099/1099), 676.09 KiB | 346.00 KiB/s, done.
    Resolving deltas: 100% (341/341), done.
    [jjobs@jjobs-instance sorc001]$ ll
    total 0
    drwxrwxr-x. 4 centos centos 79 Jul 19 01:06 spring-mvc-showcase
    
  4. 다운로드 받은 샘플 repository로 이동하고 구동을 확인한다.

    [jjobs@jjobs-instance sorc001]$ cd spring-mvc-showcase
    [jjobs@jjobs-instance spring-mvc-showcase]$ mvn jetty:run
    [INFO] Scanning for projects...
    [WARNING]
    [WARNING] Some problems were encountered while building the effective model for org.springframework.samples:spring-mvc-showcase:war:1.0.0-BUILD-SNAPSHOT
    ....
    ....
    01:46:18.426 [main] DEBUG org.springframework.web.servlet.DispatcherServlet - Servlet 'dispatcher' configured successfully
    [INFO] Started o.e.j.m.p.JettyWebAppContext@2b037cfc{/spring-mvc-showcase,file:///sorc001/spring-mvc-showcase/src/main/webapp/,AVAILABLE}{file:///sorc001/spring-mvc-showcase/src/main/webapp/}
    [INFO] Started ServerConnector@7eae55{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
    [INFO] Started @13339ms
    [INFO] Started Jetty Server
    
  5. Jetty Server가 정상적으로 구동되었다는 로그가 나오면, http://ExternalIP:8080/spring-mvc-showcase/로 접속할 수 있다.

Tomcat

  1. 엔진 폴더 디렉토리를 생성한다. (예, /engn001)

  2. tomcat 설치버전을 다운로드 받는다.

    만약, 링크를 찾을 수 없다는 오류가 발생하면 Maven 홈페이지(https://tomcat.apache.org/)에서 다운로드 받거나 다른 버전의 URL로 변경한다.

    [jjobs@jjobs-dev-agent00 engn001]$ wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.43/bin/apache-tomcat-8.5.43.tar.gz
    
  3. 다운로드 받은 tomcat 설치 파일의 압축을 푼다.

    [jjobs@jjobs-dev-agent00 engn001]$ tar xvfz apache-tomcat-8.5.43.tar.gz
    
  4. Tomcat 서버가 정상적으로 설치되었는지 구동하여 확인한다.

    [jjobs@jjobs-dev-agent00 engn001]$ cd apache-tomcat-8.5.43
    [jjobs@jjobs-dev-agent00 apache-tomcat-8.5.43]$ cd bin
    [jjobs@jjobs-dev-agent00 bin]$ ./startup.sh
    Using CATALINA_BASE:   /engn001/apache-tomcat-8.5.43
    Using CATALINA_HOME:   /engn001/apache-tomcat-8.5.43
    Using CATALINA_TMPDIR: /engn001/apache-tomcat-8.5.43/temp
    Using JRE_HOME:        /usr
    Using CLASSPATH:       /engn001/apache-tomcat-8.5.43/bin/bootstrap.jar:/engn001/apache-tomcat-8.5.43/bin/tomcat-juli.jar
    Tomcat started.
    
  5. Tomcat Server가 정상적으로 구동되었다는 로그가 나오면, http://ExternalIP:8080/로 접속할 수 있다.

Docker

Docker CE를 설치한다. 설치에 관한 자세한 사항은 Docker 가이드를 참고한다.

단, Docker CE 18 이상 설치를 권장한다.

Docker CE 17 이하 버전에서는 Docker 템플릿에서 제공되는 Dockerfile 편집 기능 사용 시에 Docker 내부 오류가 발생할 수 있다. 예를 들어 임시로 생성되는 Dockerfile의 절대경로와 Dockerfile 경로/Container 작업 디렉토리 항목에서 설정된 경로와 다른 경우 오류가 발생한다.

  • 기존에 설치된 버전을 삭제한다. 설치된 버전을 찾을 수 없다는 오류는 무시하면 된다.

    [jjobs@jjobs-instance ~]$ sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  • 필수 패키지를 설치한다.

    [jjobs@jjobs-instance ~]$ sudo yum install -y yum-utils \
      device-mapper-persistent-data lvm2
    
  • Docker CE 설치 파일을 제공하는 저장소를 등록한다.

    [jjobs@jjobs-instance ~]$ sudo yum-config-manager \
        --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
  • Docker CE와 containerd, Docker CLI를 최신 버전으로 설치한다.

    [jjobs@jjobs-instance ~]$ sudo yum install docker-ce docker-ce-cli containerd.io
    

    Docker CE의 특정 버전을 설치하고자 하는 경우에는 다음과 같이 입력한다.

    sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
    
  • Docker를 구동한다.

    [jjobs@jjobs-instance ~]$ sudo systemctl start docker
    
  • hello-world 이미지를 실행하여, Docker가 정상적으로 설치되었음을 확인한다.

    [jjobs@jjobs-agent00 ~]$ sudo docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    1b930d010525: Pull complete
    Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    
    
  • Docker를 root가 아닌 특정 사용자가 사용하기 위해, 다음 명령을 수행하여 docker 그룹에 특정 사용자(jjobs)를 추가한다. 사용자 계정으로 로그아웃 한 뒤, 다시 로그인하면 적용된다.

    [jjobs@jjobs-instance ~]$ sudo usermod -aG docker jjobs
    

SFTP

  1. jjobs-instance가 SFTP Server 역할을 수행한다. SFTP 전용 포트 사용 유무, SFTP 접속 계정 등을 생성/설정한다.
  2. jjobs-dev-agent00, jjobs-staging-agent00, jjobs-prod-agent00 ~ jjobs-prod-agentNN에서는 SFTP Client 역할을 수행한다. jjobs-instance로 SFTP로 접속 가능한지 확인한다.

CI/CD를 위한 J-Jobs 활용 예

CI/CD Sample Job 생성 및 실행, 실행 내역 확인 방법에 대하여 설명한다.

Sample Job 정의

CI/CD를 위한 J-Jobs 사용 방법을 설명하기 위해 CI/CD 샘플 작업을 크게 다음과 같이 구성하고, 각 Job에서 하는 일을 간략하게 요약하면 다음과 같다.

  • (tomcat/docker)-build-job : CI/CD Process 과정 중 빌드 작업에 해당하며, jjobs-instance에서 수행함
    • git에서 변경소스 다운로드
    • maven을 이용하여 war를 생성
    • (docker) war를 이용하여 docker image를 생성
  • (tomcat/docker)-deploy-dev-job : 배포 작업 중 개발 환경 배포에 해당하며, jjobs-dev-agent00에서 수행함
    • Tomcat이나 Container를 중지
    • (tomcat/docker)-build-job에서 생성된 war 파일 다운로드/배포
    • Tomcat이나 Container를 재구동
    • Tomcat이나 Container를 구동 확인 (URL)
  • (tomcat/docker)-deploy-staging-job : 배포 작업 중 검수 환경 배포에 해당하며, jjobs-staging-agent00에서 수행함
  • (tomcat/docker)-deploy-prod*(00~NN)*-job : 배포 작업 중 운영 환경 배포에 해당하며, jjobs-prod-agent00 ~ jjobs-prod-agentNN 에서 수행함
  • (tomcat/docker)-cicd-job : 빌드 작업 + 개발/검수/운영 배포 작업을 수행함

Sample Job 생성

기설치된 Tomcat에 war 배포하는 예제

개발/검수/운영 환경에 설치된 Tomcat 서버에 변경된 war 파일을 배포하는 샘플은 크게 다음과 같이 구성된다.

  • tomcat-build-job
    • git에서 변경된 소스 다운로드 : git pull
    • maven을 이용해 war 생성 : mvn build
  • tomcat-deploy-dev-job
    • Tomcat 중지 : tomcat shutdown
    • tomcat-build-job에서 생성된 war 파일 다운로드/배포 : sftp download
    • Tomcat 재구동 : tomcat startup
    • Tomcat 구동 확인 (URL) : curl http://localhost:8080/spring-mvc-showcase/
  • tomcat-deploy-staging-job : tomcat-deploy-dev-job 과 세부 과정 동일함
  • tomcat-deploy-prod*(00~NN)*-job : tomcat-deploy-dev-job과 세부 과정 동일하고, 실행구역 별로 다수의 Job으로 구성됨
  • tomcat-cicd-job : 빌드 작업 + 개발/검수/운영 배포 작업을 수행함
1. tomcat-cicd 폴더 생성

Job > 편집 화면의 왼쪽 Job 폴더 트리에서 최상단 폴더에 우클릭 메뉴를 이용하여 tomcat-cicd 폴더를 생성한다. tomcat-cicd 폴더 선택 후, 추가를 클릭하여 새로운 Job을 등록한다.

2. tomcat-build-job 생성

Git에서 변경된 소스코드를 다운로드 받은 뒤, maven을 이용하여 war를 생성하는 Job을 등록하는 과정은 다음과 같다.

  1. Job > 편집 화면에서 추가 버튼을 클릭하여, 신규 Job을 생성한다.

  2. [git pull] Command/Shell 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

| 항목 | 입력 값 | | -------------------- | ------------------------------------------------------------ | | 설명 | git pull | | 입력 유형 | 스크립트 | | 스크립트 | cd $1
git pull | | 아규먼트 | ${PARAM("WORKING_DIR")} | | 사용자 정의 Property | 종류 - 파라미터
이름 - WORKING_DIR
값 - /sorc001/spring-mvc-showcase |

  1. [mvn build] Command/Shell 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

| 항목 | 입력 값 | | --------- | ----------------------- | | 설명 | git pull | | 입력 유형 | 스크립트 | | 스크립트 | cd $1
mvn install | | 아규먼트 | ${PARAM("WORKING_DIR")} |

  1. F4 를 누르고, Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-instance로 지정한다. 다른 J-Jobs Agent에서 수행되지 않도록 하기 위함이다.

  2. Ctrl+S 를 눌러 Job을 저장한다. (Job ID = tomcat-build-job)

3. tomcat-deploy-dev-job 생성

개발 환경에서 구동중인 Tomcat을 중지하고, Tomcat의 webapps에 tomcat-build-job에서 생성된 war 파일을 배포한 뒤에 Tomcat을 재구동하는 Job을 등록하는 과정은 다음과 같다.

  1. Job > 편집 화면에서 추가 버튼을 클릭하여, 신규 Job을 생성한다.

  2. [tomcat shutdown] Command/Shell 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명tomcat shutdown
    입력 유형경로
    커맨드 경로/engn001/apache-tomcat-8.5.43/bin
    커맨드shutdown.sh
  3. [deploy war] SFTP 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    원격접속태그 항목에는 사용하고자 하는 SFTP 인증정보를 선택한다. 단, 사전에 [관리자 > 시스템 설정 > 외부증명소]메뉴에서 sftp 유형의 'ciserver'라는 이름으로 SFTP에 대한 인증정보가 등록되어 있어야 한다.

    항목입력 값
    설명deploy war
    원격접속태그ciserver
    로컬디렉토리/engn001/apache-tomcat-8.5.43/webapps
    원격지디렉토리${PARAM("WORKING_DIR")}/target
    파일명${PARAM("DEPLOY_FILE")}
    메소드(Method)GET
    모드덮어쓰기
    사용자 정의 Property종류 - 파라미터
    이름 - WORKING_DIR
    값 - /sorc001/spring-mvc-showcase

    종류 - 파라미터
    이름 - DEPLOY_FILE
    값 - spring-mvc-showcase.war
  4. [tomcat startup] Command/Shell 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명tomcat startup
    입력 유형경로
    커맨드 경로/engn001/apache-tomcat-8.5.43/bin
    커맨드startup.sh
  5. [wait startup] Dummy 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명wait for startup
    대기시간 (초)5
  6. [curl test] Command/Shell 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명curl test
    입력 유형경로
    커맨드 경로/usr/bin
    커맨드curl
    아규먼트http://localhost:8080/spring-mvc-showcase
  7. F4 를 누르고, Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-dev-agent00로 지정한다. 개발 환경에 설치된 J-Jobs Agent에서 수행되도록 설정하기 위함이다.

  8. Ctrl+S 를 눌러 Job을 저장한다. (Job ID = tomcat-deploy-dev-job)

4. tomcat-deploy-stg-job 생성

tomcat-deploy-dev-job 생성 과정과 유사하게 tomcat-deploy-stg-job을 생성한다. 본 문서에서는 동일한 작업을 jjobs-staging-agent00에서 수행하는 것을 예로 설명하고 있으므로, 다른이름으로 저장기능을 사용한다.

  1. tomcat-deploy-dev-job의 편집화면으로 이동한다.
  2. Ctrl+Shift+S을 누른 뒤, Job을 저장한다. (Job ID = tomcat-deploy-stg-job)
  3. F4 를 누르고, Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-staging-agent00로 지정한다. 검수 환경에 설치된 J-Jobs Agent에서 수행되도록 설정하기 위함이다.
  4. 검수 단계에 필요한 작업(Step)을 추가한다.
  5. Ctrl+S 를 눌러 Job을 저장한다.
5. tomcat-deploy-prod(1/2)-job 생성

tomcat-deploy-stg-job 생성 과정과 동일하게 tomcat-deploy-prod1-job, tomcat-deploy-prod2-job을 생성한다.

  1. tomcat-deploy-dev-job의 편집화면으로 이동한다.
  2. Ctrl+Shift+S을 누른 뒤, Job을 저장한다. (Job ID = tomcat-deploy-prod(1/2)-job)
  3. F4 를 누르고, Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-prod-agent00 또는 jjobs-prod-agent01 로 지정한다. 운영 환경에 설치된 J-Jobs Agent에서 수행되도록 설정하기 위함이다.
  4. 운영 단계에 필요한 작업(Step)을 추가한다.
  5. Ctrl+S 를 눌러 Job을 저장한다.
6. prod-confirm-job 생성

운영 담당자의 수동 승인을 위한 Job을 등록하는 과정은 다음과 같다.

  1. Job > 편집 화면에서 추가 버튼을 클릭하여, 신규 Job을 생성한다.
  2. Dummy 템플릿을 추가한다.
  3. F4 를 누르고, Job 속성 편집 > 실행 정보 > Confirm 여부 항목을 체크한다.
  4. Ctrl+S 를 눌러 Job을 저장한다. (Job ID = prod-confirm-job)

본 문서에서는 운영 환경의 다수의 Host/VM 인스턴스에서 배포 과정이 병렬 처리로 수행되는 것을 예를 들어 설명하므로 아무일도 하지 않고 대기 하는 Job을 추가한 뒤 Confirm 을 설정하였으나, 실제 업무/프로젝트에서는 수동 승인이 필요한 실제 Job에 Confirm 을 설정하는 것이 일반적이다.

7. tomcat-cicd-job 생성

2~6번의 과정을 통해 생성한 Job을 호출하여 CI/CD 작업 흐름을 제어하는 Job을 등록하는 과정은 다음과 같다.

  1. Job > 편집 화면에서 추가 버튼을 클릭하여, 신규 Job을 생성한다.

  2. [build job] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    호출 유형 : 하위 Job의 호출 유형을 선택

    • 새로운 요청: 하위 Job이 별도의 요청 ID가 채번되어 **[즉시실행]**과 동일한 방식으로 Job을 실행
    • 내부 처리: 같은 에이전트에서 하위 Job 을 실행
    항목입력 값
    설명build job
    하위 Job IDtomcat-build-job
    하위 Job 파라미터종류 - 파라미터
    덮어쓰기 - 사용
    추가 버튼을 클릭하면 1개의 property 추가 성공함
    호출 유형새로운 요청
    사용자 정의 Property하위 Job Property 추가 성공한 개수 만큼 사용자 Property에 입력되었음을 확인함
  3. [dev deploy job] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명dev deploy job
    하위 Job IDtomcat-deploy-dev-job
    하위 Job 파라미터종류 - 파라미터
    덮어쓰기 - 사용
    추가 버튼을 클릭하면 2개의 property 추가 성공함
    호출 유형새로운 요청
    사용자 정의 Property하위 Job Property 추가 성공한 개수 만큼 사용자 Property에 입력되었음을 확인함
  4. [staging deploy job] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명staging deploy job
    하위 Job IDtomcat-deploy-stg-job
    하위 Job 파라미터종류 - 파라미터
    덮어쓰기 - 사용
    추가 버튼을 클릭하면 2개의 property 추가 성공함
    호출 유형새로운 요청
    사용자 정의 Property하위 Job Property 추가 성공한 개수 만큼 사용자 Property에 입력되었음을 확인함
  5. [manual confirm] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명manual confirm
    하위 Job IDprod_confirm_job
    호출 유형새로운 요청
  6. 병렬처리 시작 엘리먼트를 추가한다.

  7. [prod-1 deploy job] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명prod-1 deploy job
    하위 Job IDtomcat-deploy-prod1-job
    하위 Job 파라미터종류 - 파라미터
    덮어쓰기 - 사용
    추가 버튼을 클릭하면 2개의 property 추가 성공함
    호출 유형새로운 요청
    사용자 정의 Property하위 Job Property 추가 성공한 개수 만큼 사용자 Property에 입력되었음을 확인함
  8. [prod-2 deploy job] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명prod-2 deploy job
    하위 Job IDtomcat-deploy-prod2-job
    하위 Job 파라미터종류 - 파라미터
    덮어쓰기 - 사용
    추가 버튼을 클릭하면 2개의 property 추가 성공함
    호출 유형새로운 요청
    사용자 정의 Property하위 Job Property 추가 성공한 개수 만큼 사용자 Property에 입력되었음을 확인함
  9. 병렬처리 종료 엘리먼트를 추가한다.

  10. F4 를 눌러 Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-instance으로 지정한다.

  11. Ctrl+S 를 눌러 Job을 저장한다. (Job ID = tomcat-cicd-job)

Container 환경에서 변경된 이미지 배포하는 예제

개발/검수/운영 환경에 설치된 Docker에 변경된 war 파일을 포함한 Docker Image를 생성하여 배포하는 샘플은 크게 다음과 같이 구성된다.

  • docker-build-job
    • git에서 변경된 소스 다운로드 : git pull
    • maven을 이용해 war 생성 : mvn build
    • Docker Image 생성 : docker build
    • Dcoker Image를 Registry에 업로드 : docker push
  • docker-deploy-dev-job
    • Dcoker Image를 Registry에서 다운로드 : docker pull
    • Container를 중지 : tomcat shutdown
    • Container를 재구동 : tomcat startup
    • Container를 구동 확인 (URL) : curl http://localhost:8877/spring-mvc-showcase/
  • docker-deploy-staging-job : docker-deploy-dev-job 과 세부 과정 동일함
  • docker-deploy-prod*(00~NN)*-job : docker-deploy-dev-job과 세부 과정 동일하고, 실행구역 별로 다수의 Job으로 구성됨
  • docker-cicd-job : 빌드 작업 + 개발/검수/운영 배포 작업을 수행함
1. docker-cicd 폴더 생성

Job > 편집 화면의 왼쪽 Job 폴더 트리에서 최상단 폴더에 우클릭 메뉴를 이용하여 docker-cicd 폴더를 생성한다. docker-cicd 폴더 선택 후, 추가를 클릭하여 새로운 Job을 등록한다.

2. docker-build-job 생성

Git에서 변경된 소스코드를 다운로드 받은 뒤, maven을 이용하여 war를 생성하고 이를 Docker Image로 등록하는 Job을 등록하는 과정은 다음과 같다.

  1. Job > 편집 화면에서 추가 버튼을 클릭하여, 신규 Job을 생성한다.

  2. [git pull] Command/Shell 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명git pull
    입력 유형스크립트
    스크립트cd $1
    git pull
    아규먼트${PARAM("WORKING_DIR")}
    사용자 정의 Property종류 - 파라미터
    이름 - WORKING_DIR
    값 - /sorc001/spring-mvc-showcase
  3. [mvn build] Command/Shell 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명git pull
    입력 유형스크립트
    스크립트cd $1
    mvn install
    아규먼트${PARAM("WORKING_DIR")}
  4. [docker build] Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다. Docker 템플릿에 대한 자세한 설명은 Docker 가이드를 참고한다.

    항목입력 값
    설명docker build
    Docker 명령BUILD
    Dockerfile 유형Dockerfile 직접 입력
    Dockerfile 경로/Container 작업 디렉토리${PARAM("WORKING_DIR")}
    Dockerfile ContentsFROM tomcat
    COPY ./target/spring-mvc-showcase.war /usr/local/tomcat/webapps
    Repository/Image${PARAM("IMAGE_NAME")}
    빌드 작업 시, 캐시 사용여부빌드 작업 시, 캐시 사용여부
    Options
    사용자 정의 Property종류 - 파라미터
    이름 - REPOSITORY_NAME
    값 - spring-mvc-showcase

    종류 - 파라미터
    이름 - TAG_ID
    값 - ${AGENT_DATE_ADD_SEC("yyyyMMddHHmmss",-2)}

    종류 - 파라미터
    이름 - IMAGE_NAME
    값 - ${PARAM("REPOSITORY_NAME")}:${PARAM("TAG_ID")}
  5. [docker push] Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다.

    Registry 접속태 항목에는 사용하고자 하는 Registry 인증정보를 선택한다. 단, 사전에 [관리자 > 시스템 설정 > 외부증명소]메뉴에서 registry 유형의 'docker-registry'라는 이름으로 인증정보가 등록되어 있어야 한다.

    프로젝트에서 구성한 Custom Registry가 인증 과정이 없는 경우에, Custom Registry에 push/pull 하는 과정 중에, https 응답 관련 오류가 발생하므로 Custom Registry insecure 설정을 해야 한다. 자세한 설명은 Docker 가이드의 별첨을 참고한다.

    항목입력 값
    설명docker push
    Docker 명령PUSH
    Repository/Image${PARAM("IMAGE_NAME")}
    Registry 유형Custom Registry
    Registry 접속태그docker-registry
    인증 유형에이전트의 ~/.dockercfg credential을 사용
    Options
  6. F4 를 누르고, Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-instance로 지정한다. 다른 J-Jobs Agent에서 수행되지 않도록 하기 위함이다.

  7. Ctrl+S 를 눌러 Job을 저장한다. (Job ID = docker-build-job)

3. docker-deploy-dev-job 생성

개발 환경에서 구동중인 Container를 중지하고, dodcer-build-job에서 생성된 war 파일을 배포한 뒤에 Tomcat을 재구동하는 Job을 등록하는 과정은 다음과 같다.

  1. Job > 편집 화면에서 추가 버튼을 클릭하여, 신규 Job을 생성한다.

  2. [docker pull] Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다.

    Registry 접속태 항목에는 사용하고자 하는 Registry 인증정보를 선택한다. 단, 사전에 [관리자 > 시스템 설정 > 외부증명소]메뉴에서 registry 유형의 'docker-registry'라는 이름으로 인증정보가 등록되어 있어야 한다.

    항목입력 값
    설명docker pull
    Docker 명령PULL
    Repository/Image${PARAM("IMAGE_NAME")}
    Registry 유형Custom Registry
    Registry 접속태그docker-registry
    인증 유형에이전트의 ~/.dockercfg credential을 사용
    Options
    사용자 정의 Property종류 - 파라미터
    이름 - REPOSITORY_NAME
    값 - spring-mvc-showcase

    종류 - 파라미터
    이름 - TAG_ID
    값 - ${AGENT_DATE_ADD_SEC("yyyyMMddHHmmss",-2)}

    종류 - 파라미터
    이름 - IMAGE_NAME
    값 - ${PARAM("REPOSITORY_NAME")}:${PARAM("TAG_ID")}
  3. [docker stop] Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다.

    docker stop 명령의 경우 stop 할 Container가 없을 때 오류가 발생한다. 이 경우, 오류를 무시하고 다음 Step으로 진행시키기 위해 오류 발생 시 Skip 처리를 설정한다.

  4. [docker run] Docker 템플릿을 추가하고 일반 탭에서 다음 항목을 입력한다.

    항목입력 값
    설명docker run
    Docker 명령RUN
    Repository/Image${PARAM("IMAGE_NAME")}
    Detached modedetach on
    컨테이너 이름${JOB_ID}
    Options-p 8877:8080
    추가 아규먼트
  5. [wait startup] Dummy 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명wait for startup
    대기시간 (초)5
  6. [curl test] Command/Shell 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명curl test
    입력 유형경로
    커맨드 경로/usr/bin
    커맨드curl
    아규먼트http://localhost:8877/spring-mvc-showcase
  7. F4 를 누르고, Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-dev-agent00로 지정한다. 개발 환경에 설치된 J-Jobs Agent에서 수행되도록 설정하기 위함이다.

  8. Ctrl+S 를 눌러 Job을 저장한다. (Job ID = docker-deploy-dev-job)

4. docker-deploy-stg-job 생성

docker-deploy-dev-job 생성 과정과 유사하게 docker-deploy-stg-job을 생성한다. 본 문서에서는 동일한 작업을 jjobs-staging-agent00에서 수행하는 것을 예로 설명하고 있으므로, 다른이름으로 저장기능을 사용한다.

  1. docker-deploy-dev-job의 편집화면으로 이동한다.
  2. Ctrl+Shift+S을 누른 뒤, Job을 저장한다. (Job ID = docker-deploy-stg-job)
  3. F4 를 누르고, Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-staging-agent00로 지정한다. 검수 환경에 설치된 J-Jobs Agent에서 수행되도록 설정하기 위함이다.
  4. 검수 단계에 필요한 작업(Step)을 추가한다.
  5. Ctrl+S 를 눌러 Job을 저장한다.
5. docker-deploy-prod(1/2)-job 생성

docker-deploy-stg-job 생성 과정과 동일하게 docker-deploy-prod1-job, docker-deploy-prod2-job을 생성한다.

  1. docker-deploy-dev-job의 편집화면으로 이동한다.
  2. Ctrl+Shift+S을 누른 뒤, Job을 저장한다. (Job ID = docker-deploy-prod(1/2)-job)
  3. F4 를 누르고, Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-prod-agent00 또는 jjobs-prod-agent01 로 지정한다. 운영 환경에 설치된 J-Jobs Agent에서 수행되도록 설정하기 위함이다.
  4. 운영 단계에 필요한 작업(Step)을 추가한다.
  5. Ctrl+S 를 눌러 Job을 저장한다.
6. prod-confirm-job 생성/확인

개발/검수/운영 환경에 설치된 Tomcat에 war 배포하는 예제에서 생성했던 prod-confirm-job을 활용한다.

7. docker-cicd-job 생성

2~6번의 과정을 통해 생성한 Job을 호출하여 CI/CD 작업 흐름을 제어하는 Job을 등록하는 과정은 다음과 같다.

  1. Job > 편집 화면에서 추가 버튼을 클릭하여, 신규 Job을 생성한다.

  2. [build job] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    호출 유형 : 하위 Job의 호출 유형을 선택

    • 새로운 요청: 하위 Job이 별도의 요청 ID가 채번되어 **[즉시실행]**과 동일한 방식으로 Job을 실행
    • 내부 처리: 같은 에이전트에서 하위 Job 을 실행
    항목입력 값
    설명build job
    하위 Job IDdocker-build-job
    하위 Job 파라미터종류 - 파라미터
    덮어쓰기 - 사용
    추가 버튼을 클릭하면 4개의 property 추가 성공함
    호출 유형새로운 요청
    사용자 정의 Property하위 Job Property 추가 성공한 개수 만큼 사용자 Property에 입력되었음을 확인함
  3. [dev deploy job] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명dev deploy job
    하위 Job IDdocker-deploy-dev-job
    하위 Job 파라미터종류 - 파라미터
    덮어쓰기 - 사용
    추가 버튼을 클릭하면 3개의 property 추가 성공함
    호출 유형새로운 요청
    사용자 정의 Property하위 Job Property 추가 성공한 개수 만큼 사용자 Property에 입력되었음을 확인함
  4. [staging deploy job] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명staging deploy job
    하위 Job IDdocker-deploy-stg-job
    하위 Job 파라미터종류 - 파라미터
    덮어쓰기 - 사용
    추가 버튼을 클릭하면 3개의 property 추가 성공함
    호출 유형새로운 요청
    사용자 정의 Property하위 Job Property 추가 성공한 개수 만큼 사용자 Property에 입력되었음을 확인함
  5. [manual confirm] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명manual confirm
    하위 Job IDprod_confirm_job
    호출 유형새로운 요청
  6. 병렬처리 시작 엘리먼트를 추가한다.

  7. [prod-1 deploy job] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명prod-1 deploy job
    하위 Job IDdocker-deploy-prod1-job
    하위 Job 파라미터종류 - 파라미터
    덮어쓰기 - 사용
    추가 버튼을 클릭하면 3개의 property 추가 성공함
    호출 유형새로운 요청
    사용자 정의 Property하위 Job Property 추가 성공한 개수 만큼 사용자 Property에 입력되었음을 확인함
  8. [prod-2 deploy job] Job 템플릿을 추가하고, 일반 탭에 다음의 항목을 입력한다.

    항목입력 값
    설명prod-2 deploy job
    하위 Job IDdocker-deploy-prod2-job
    하위 Job 파라미터종류 - 파라미터
    덮어쓰기 - 사용
    추가 버튼을 클릭하면 3개의 property 추가 성공함
    호출 유형새로운 요청
    사용자 정의 Property하위 Job Property 추가 성공한 개수 만큼 사용자 Property에 입력되었음을 확인함
  9. 병렬처리 종료 엘리먼트를 추가한다.

  10. F4 를 눌러 Job 속성 편집 > 실행 정보 > 실행구역 변경 을 눌러 jjobs-instance으로 지정한다.

  11. Ctrl+S 를 눌러 Job을 저장한다. (Job ID = docker-cicd-job)

Sample Job 실행

등록한 Job을 실행하는 방법은 크게 네 가지가 있다. 자세한 설명은 사용자 가이드를 참고한다.

  1. Job 편집 화면에서 Ctrl+Enter 를 눌러 실행한다.
  2. Job 편집 화면에서 실행관리 > 즉시실행메뉴를 사용하여 실행한다.
  3. Job > 편집 화면 우측에 위치한 Job 목록 화면에서 등록한 Job의 우측에 위치한 즉시실행버튼을 클릭하여 Job을 실행한다.
  4. Job > 실행 메뉴에서 Job을 선택하여 실행할 수 있다.

네 가지 방법 모두 Job을 실행할 때에는 다음과 같이 로그 레벨, 실행구역, 파라미터 값 등을 변경하여 실행할 수 있는 화면에 제공되며, 필요에 따라 변경하여 Job 즉시실행버튼을 클릭하여 Job을 실행한다.

Sample Job 실행내역 확인

결과 > Job 실행내역 화면은 상단의 검색 조건과 실행 내역 목록으로 구성된다.

검색 조건

검색 조건설명
날짜 (필수)검색할 Job 요청 시간 (From ~ To)
기본값으로 어제 ~ 내일이 설정되어 있음
요청 ID요청 ID
인스턴스 IDJob 인스턴스 ID
실행 IDJob 실행 ID
Job IDJob ID
Job 명Job 명. 부분 일치 검색
에이전트 명Job을 실행한 에이전트명
에이전트 그룹 IDJob을 실행한 에이전트 그룹 ID
스케줄 이름실행한 스케줄명
요청 사용자요청 사용자

실행 상태

탭 구분실행 상태설명
전체대기를 제외한 모든 실행 결과가 보이는 탭이다. (기본 선택)
대기Job 요청이 많아 진행되지 못하고 대기중이거나, 스케줄 요청 후 대기중인 실행 목록이 보이는 탭이다.
확인운영자나 관리자의 확인을 받아야 하는 실행 목록이 보이는 탭이다.
진행실행중인 목록만 보이는 탭이다.
오류실패하거나 중지한 실행 목록만 보이는 탭이다.
완료성공적으로 종료한 실행 목록만 보이는 탭이다.

로그 확인

실행 결과 목록에서 상태를 클릭하면 Job의 로그 확인창이 열린다. Job 즉시실행 시에, 로그 모아보기를 사용하여 Job을 실행하였을 경우, Job 로그에서 하위 Step의 로그도 함께 확인할 수 있다. Job이 실행 중인 상태에서 로그를 확인할 경우에도 주기적으로 새로고침하여 준실시간으로 로그를 볼 수 있다.

Sample Job 스케줄링

특정 시간에 혹은 주기적으로 해당 Job을 실행시키고자 할 때, Job에 대한 기본 정보를 저장한 후에 스케줄을 등록한다. 예를 들어 매일 자정에 CI/CD 작업을 수행하고자 하는 경우, (tomcat/docker)-cicd-job에 스케줄을 등록한다. 스케줄과 관련된 자세한 설명은 사용자 가이드를 참고한다.

스케줄 등록

  1. Job에 스케줄을 등록하기 위해서 Job > 편집 화면 우측에 위치한 Job 목록에서 등록한 Job의 우측에 위치한 스케줄버튼을 클릭한다.

  2. Job의 스케줄 목록 팝업 화면에서 스케줄 추가 버튼을 클릭한다.

  3. 날짜 기준으로(Date), 영업일 기준으로(Calendar), 실행 간격 기준으로(Interval) 스케줄링 할 수 있으므로, 원하는 특정 시간이나 주기로 스케줄을 등록한다. 미리보기 버튼을 클릭하면 등록한 스케줄의 예상 수행 일정 확인이 가능하다.

항목설명기본값
유형날짜 지정(Date) 유형, 영업일 기준(Calendar) 유형, 실행 간격(Interval) 유형 중 선택날짜(Date)
유효기간유효기간 사용 여부 & 유효기간 범위 (사용 여부를 체크하면 기간 입력 가능)사용 안함
유효시간유효시간 사용 여부 & 유효시간 범위 (사용 여부를 체크하면 시간 입력 가능)사용 안함
타임존스케줄 시간에 적용할 타임존 사용 여부 & 기등록된 타임존 정보 중 선택Asia/Seoul
알림사용스케줄 알림 사용 여부사용 안함
알림 조건알림을 수신받을 스케줄 관련 이벤트 조건 선택
- 스케줄 시작
- 스케줄 일정 지연
알림수신Email로 알림 수신 여부 선택, 체크하면 수신받을 이메일 주소를 입력 받을 수 있다.

스케줄 시작/중지

스케줄의 기본 정보를 입력하고 저장한 뒤, 스케줄을 시작하거나 중지할 수 있다. 다음은 스케줄의 상태를 나타내는 아이콘이다.

상태 아이콘설명
Job에 스케줄이 등록되어 있지 않음
Job에 스케줄이 등록되어 있지만 중지 중인 상태
Job에 스케줄이 등록되어 있고, 시작하여 실행 중인 상태

스케줄 수정/삭제

스케줄을 수정하고자 할 때는 스케줄 목록 팝업 화면에서 스케줄을 선택 한 뒤에 스케줄의 수정사항을 입력한 뒤 저장을 클릭한다. 스케줄을 수정할 때 실행 중인 상태일 경우, 이전 스케줄 정보에 의해 스케줄링되어 대기 상태에 있는 실행 정보는 삭제되고 새로운 스케줄이 등록된다.

스케줄을 삭제하고자 할 때는 스케줄 목록에서 스케줄의 체크 박스를 선택한 뒤에 삭제를 클릭하면 삭제할 수 있다. 스케줄이 실행상태에서 삭제할 경우, 다음 예정되었던 스케줄 계획도 바로 삭제된다.

스케줄 실행내역

스케줄 팝업 화면에서 실행내역을 클릭하면, 해당 스케줄의 다음 실행 예정 정보와 과거 스케줄 실행 내역을 일자별로 확인할 수 있다.

Sample Job 실행결과 예시

CI/CD Sample Job 실행에 성공하면 개발/검수/운영 환경의 Host/VM 인스턴스의 External IP를 이용하여 다음의 URL에 접속하여 샘플 홈페이지가 정상적으로 표시되는지 확인한다. Git에 변경한 사항이 있다면, 변경 내용이 정상적으로 반영되었는지 확인한다.

tomcat-cicd-job

실행 결과 목록에서 Job ID가 tomcat-cicd-job인 실행내역 중에서 실행 ID를 클릭하면, Job 실행 상세 정보 팝업 창이 열리고 Job/Step 실행 결과, 파라미터 등을 확인할 수 있다. 상태를 클릭하면 Job/Step의 실행 로그를 확인할 수 있다.

Step 실행 탭을 클릭하면 Step 별 상세 실행 내역을 확인할 수 있다.

Diagram 탭을 클릭하면 Step 처리 현황을 확인할 수 있다.

다음은 prod-1 deploy job Step의 상태를 클릭한 Step의 로그 확인 창이며, 화면 하단에 새로운 요청 ID(Requset ID)로 tomcat-deploy-prod1-job이 실행 요청되었음을 확인할 수 있다.

docker-cicd-job

실행 결과 목록에서 Job ID가 docker-cicd-job인 실행내역 중에서 실행 ID를 클릭하면, Job 실행 상세 정보 팝업 창이 열리고 Job/Step 실행 결과, 파라미터 등을 확인할 수 있다. 상태를 클릭하면 Job/Step의 실행 로그를 확인할 수 있다.

Step 실행 탭을 클릭하면 Step 별 상세 실행 내역을 확인할 수 있다.

Diagram 탭을 클릭하면 Step 처리 현황을 확인할 수 있다.

처리 성공한 Step은 녹색, 실패한 경우에는 빨간색으로 표시되며, 실행 대기 상태인 Step은 흰색으로 표현된다.

다음은 prod-1 deploy job Step의 상태를 클릭한 Step의 로그 확인 창이며, 화면 하단에 새로운 요청 ID(Requset ID)로 tomcat-deploy-prod1-job이 실행 요청되었음을 확인할 수 있다.

[별첨]

Confirm 처리

Job 속성 편집 > 실행 정보 > Confirm 여부 항목에 체크 되어있는 Job을 실행하면, 운영자나 담당자의 확인이 있을 때까지 Job이 실제 실행되지 않고 대기한다.

  1. 운영자가 검수 환경에서 필요한 확인이 끝난 뒤에 Job 실행내역 > CONFIRM 탭 목록의 오른쪽에 위치한 체크 박스를 클릭한다.

  2. 확인처리 팝업에서 내용을 확인한 뒤, Confirm 버튼을 클릭하면 Job이 실행된다.

새로운 요청으로 하위 Job 실행한 경우, 요청 ID(Requset ID) 확인하기

새로운 요청으로 하위 Job을 실행하면, 별도의 요청 ID가 채번되어 실행된다. 이때, 하위 Job의 실행내역을 확인하거나 로그 확인을 위해 별도로 채번된 요청 ID를 알아야 한다. Job 실행 후, 하위 Job의 새로운 요청 ID(Requset ID) 확인 방법은 다음과 같다.

  1. Job 실행 상세 정보 > Step 실행 탭 우측에 위치한 Step 실행 상세 정보을 클릭한다.

  2. Step 실행 상세 정보 팝업 화면 하단에 호출 요청 ID가 표시되고, 이를 클릭한다.

  3. 하위 Job으로 실행된 tomcat-deploy-prod1-job의 Job 실행 상세 정보 팝업 창이 열리고 Job/Step 실행 결과와 파라미터 등을 확인할 수 있다.