::: IT인터넷 :::

Jenkins에 Scala 빌드머신 연동하기 (1) - Docker 컨테이너 실행

곰탱이푸우 2023. 8. 21. 08:20
Scala 빌드 머신의 Docker 이미지를 컨테이너로 실행하여 Jenkins 에 Scala 빌드 에이전트로 등록한다.
 
Scala 빌드머신을 Docker로 생성하는 방법은 아래 문서를 참고한다.
기존에 진행한 Python 빌드를 위한 Docker 컨테이너를 Jenkins에 연동하는 방법과 거의 동일하다.
해당 내용은 아래 문서를 참고한다.
 

실행 스크립트 작성

배포한 Scala 빌드 에이전트의 Docker 이미지를 컨테이너로 실행하는 Bash 스크립트를 작성한다.
 

이미지 정보 작성

먼저 사용할 Docker 이미지 정보를 작성한다.
변수에 값을 할당하고 docker run 명령에 전달한다.
 
코드는 다음과 같다.
#!/bin/bash
REPO_PATH="NexusIP주소:포트"
IMAGE_PATH="ocean/sr-scala-agent"
IMAGE_VER="1.0.0"
 
각각의 의미는 다음과 같다.
  • REPO_PATH - Docker 저장소의 주소와 포트
  • IMAGE_PATH - Docker 이미지 경로 (프로젝트명/이미지명)
  • IMAGE_VER - Docker 이미지 버전
 

컨테이너 설정 정보 작성

Docker 컨테이너를 생성하는데 필요한 정보를 작성한다.
호스트명, 컨테이너 이름, 네트워크 이름, SSH Key 정보 등을 정의한다.
 
코드는 다음과 같다.
HOST_NAME=scala-build01
CONTAINER_NAME=scala-build01
NETWORK_NAME=jenkins-net
SLAVE_SSH_KEY="ssh-rsa AAAAB3NzaC1yc2EAAAADA...생략...rvyPzx96CA2VE="
 
각각의 의미는 다음과 같다.
  • HOST_NAME - Docker 컨테이너에 지정할 호스트명
  • CONTAINER_NAME - Docker 컨테이너의 이름
  • NETWORK_NAME - 이미 생성된 Jenkins의 네트워크 브릿지 이름
  • SLAVE_SSH_KEY - Jenkins 컨테이너에서 생성한 SSH Key 정보
 
 

Jenkins의 Network 이름 확인

NETWORK_NAME에 사용하기 위해 Jenkins의 Docker Network 이름을 확인하는 방법은 다음과 같다.
$ docker network ls
NETWORK ID    NAME          DRIVER    SCOPE
fd.......c43  bridge        bridge    local
d7.......c04  host          host      local
01.......aae  jenkins-net   bridge    local
ec.......d69  none          null      local
 
네트워크 목록에서 jenkins-net을 확인할 수 있다.
 

Jenkins의 SSH KEY 확인 방법

SLAVE_SSH_KEY를 확인하는 방법은 다음과 같다.
# Jenkins 컨테이너 이름이 jenkins-master인 경우
$ docker exec -it jenkins-master /bin/bash

# id_rsa.pub 내용 출력
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADA...생략...rvyPzx96CA2VE=
 
출력된 ssh-rsa AAA~~ 부분을 복사해서 사용한다.
 
자세한 방법은 아래 문서를 참고한다.

컨테이너 실행 명령 작성

Scala 빌드머신 Docker 이미지를 실제 Docker 컨테이너로 실행하는 명령이다.
 
각 의미는 아래 코드의 주석을 참고한다.
docker run -i -t -d -h $HOST_NAME \    # 앞서 작성한 컨테이너의 Hostname 전달
        -p 22 \    # SSH 연결을 할 것이므로 22번 포트 개방
--name $CONTAINER_NAME \    # 앞서 작성한 컨테이너의 이름 전달
        --restart always \    # 컨테이너가 중단되거나 시스템이 재부팅되면 자동으로 재시작
        --net $NETWORK_NAME \    # 앞서 작성한 Jenkins의 네트워크 이름 전달
-e TZ=Asia/Seoul \    # 환경변수로 타임존 정보 전달
-e JENKINS_SLAVE_SSH_PUBKEY="$SLAVE_SSH_KEY" \    # 환경 변수로 SSH KEY 공개키 전달
-v /data/docker/jenkins/scala-build01:/var/jenkins_home \    # 공유 볼륨 지정 (파일 공유 목적)
$REPO_PATH/$IMAGE_PATH:$IMAGE_VER    # 사용할 Docker 이미지 정보 전달
 
참고로 주석 작성을 위해 개별 옵션마다 줄 바꿈을 했지만, 실제로는 읽기에 불편함이 없는 정도에서 줄 바꿈을 하면 된다.
 
--net $NETWORK_NAME 옵션을 통해 생성되는 컨테이너는 Jenkins의 네트워크에 자동으로 추가된다.
아래 명령과 동일하다.
# docker network connect 네트워크이름 컨테이너이름

$ docker network connect jenkins-net scala-build01
 
네트워크 이름으로 조회해보면 해당 컨테이너가 추가 된 것을 확인할 수 있다.
$ docker network inspect jenkins-net
    ... 생략 ...
    "da747f1c2f13de18cf97f0e5003cc06b6acb06ec3d7d39e73075b4c7e396dc00": {
        "Name": "scala-build01",
        "EndpointID": "b4baf903e9136679e4b540f041fe6663a162f30211e8318736223bdf2beef0e3",
        "MacAddress": "02:42:ac:13:00:04",
        "IPv4Address": "172.19.0.4/16",
        "IPv6Address": ""
    }
 

전체 코드

위의 정리 된 내용으로 작성 된 전체 코드는 다음과 같다. 
더보기
필요에 맞게 수정하여 사용한다. 
$ vi run-scala-agent.sh

#!/bin/bash
REPO_PATH="NexusIP주소:포트"
IMAGE_PATH=ocean/sr-scala-agent
IMAGE_VER=1.0.0

HOST_NAME=scala-build01
CONTAINER_NAME=scala-build01
NETWORK_NAME=jenkins-net
SLAVE_SSH_KEY="ssh-rsa AAAAB3NzaC1yc2EAAAADA...생략...rvyPzx96CA2VE="

docker run -i -t -d -h $HOST_NAME -p 22 \
--name $CONTAINER_NAME --restart always --net $NETWORK_NAME \
-e TZ=Asia/Seoul \
-e JENKINS_SLAVE_SSH_PUBKEY="$SLAVE_SSH_KEY" \
-v /data/docker/jenkins/scala-build01:/var/jenkins_home \
$REPO_PATH/$IMAGE_PATH:$IMAGE_VER
 
 

컨테이너 실행과 확인

컨테이너 실행

아래와 같이 bash 스크립트에 실행 권한을 부여하고 실행한다.
$ chmod +X run-scala-agent.sh
$ ./run-scala-agent.sh
 
컨테이너가 실행되면 내부 정보 확인을 위해 컨테이너 내부로 진입한다.
$ docker exec -it -u jenkins /bin/bash

 

.ssh 폴더 확인

.ssh 폴더의 소유자와 권한이 정상적으로 설정되지 않으면 Jenkins에서 연결할 때 오류가 발생한다.
$ ls -alh ~/.ssh
total 12K
drwx------ 2 jenkins root 4.0K Jul 14 18:01 .
drwx------ 9 jenkins root 4.0K Jul 15 13:56 ..
-rwx------ 1 jenkins root  553 Jul 14 18:01 authorized_keys
 
폴더와 파일 권한은 700 (rwx------)이고 소유자는 jenkins인 것을 확인할 수 있다.
그룹 계정은 root이다.
 

.sbt 폴더 파일 확인

.sbt 폴더에 파일들이 정상적으로 생성되었는지 확인한다.
$ ls -alh ~/.sbt
total 32K
drwxr-xr-x 4 jenkins jenkins 4.0K Jul 14 18:13 .
drwx------ 9 jenkins root    4.0K Jul 15 13:56 ..
drwxr-xr-x 4 jenkins jenkins 4.0K Jul 14 18:02 1.0
drwxr-xr-x 3 jenkins jenkins 4.0K Jul 14 18:01 boot
-rw-r--r-- 1 jenkins jenkins  135 Jul 14 18:13 credentials
-rw-r--r-- 1 jenkins jenkins  371 Jul 14 16:53 credentials.sbt
-rw-r--r-- 1 jenkins jenkins  182 Jul 14 16:53 nexus-url
-rw-r--r-- 1 jenkins jenkins  922 Jul 14 16:53 repositories
 
credentials, credentials.sbt, nexus-url, repositories 파일이 정상적으로 생성되었다.
Dockerfile을 작성할 때 소유자와 그룹을 jenkins로 지정한 부분도 정상적으로 적용된 것을 확인할 수 있다.
 
 

credentials 비밀번호 수정

Dockerfile을 작성할 때 추가한 credentials 파일 내용은 다음과 같다.
realm=Sonatype Nexus Repository Manager
host=NexusIP주소
user=please_modify
password=please_modify
 
위의 파일을 열고 user와 password 부분을 Nexus의 실제 계정 정보로 수정한다.
$ vi ~/.sbt/credentials