[Jenkins] Slave(Agent) 노드 추가하기 (via SSH)
이번 포스트에서는 SSH 방식으로 통신하는 젠킨스 Slave(Agent) 노드를 추가하는 방법을 정리하겠습니다.
Jenkins Slave(Agent) 노드에 SSH 키 설정하기
Master 노드에서 Slave 노드에 접속해서 사용하기 위해서는 Master노드와 Slave 노드가 SSH 통신
을 할 수 있도록 만들어 주어야 합니다.
그러므로, Slave 노드에 SSH 키 생성
을 하는 것 부터 시작하겠습니다.
1. 홈 디렉토리에 .ssh 디렉토리를 생성
# ~/.ssh 디렉토리 생성(이미 존재한다면 생략)
$ mkdir ~/.ssh
먼저, 연결할 Slave 노드의 터미널에서 mkdir 명령어로 홈 디렉토리에 .ssh 디렉토리를 생성해줍니다.
2. SSH 키 쌍 생성하기
# SSH 키 페어 생성
$ ssh-keygen -t rsa -C "The access key for Jenkins slaves"
$ ssh-keygen -t rsa 명령어
로 RSA 방식의 공개 키/개인 키 페어를 생성해줍니다.
이 명령어는 기본적으로 SSH 키 페어를 생성하고 홈 디렉토리의 .ssh 디렉터리에 저장합니다.
SSH 키 페어로는 개인 키(id_rsa)
와 공개 키(id_rsa.pub)
가 생성됩니다.
명령어를 입력하면 여러가지 질문이 나오며 일반적인 경우에는 모두 엔터키를 입력하고 id_rsa라는 이름의 SSH 키 쌍을 생성하면 됩니다.
하지만, 저의 경우에는 다른 곳에서 사용할 SSH 키를 생성할 때마다 덮어 씌워지는 것을 고려하여 jenkins_agent_key라는 이름의 SSH 키 쌍을 만들도록 설정했습니다.
(그러므로 이제부터는 SSH 키 페어의 이름을 jenkins_agent_key로 설명하겠습니다.)
# SSH 키 페어 생성
$ ssh-keygen -t rsa -C "The access key for Jenkins slaves"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/seunghwan/.ssh/id_rsa): /Users/seunghwan/.ssh/jenkins_agent_key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/seunghwan/.ssh/jenkins_agent_key
Your public key has been saved in /Users/seunghwan/.ssh/jenkins_agent_key.pub
The key fingerprint is:
SHA256:pv0LjmS6kzD5YhUvB8FXsu/0mXH4dnCkUZpr1SXKw7w The access key for Jenkins slaves
The key's randomart image is:
+---[RSA 3072]----+
| . ... o .|
| o .o + = o.|
| o. X o .|
| o . . O |
| . + S o E . |
| + o o* . B o |
| = ++ + + o . |
| o ++ o o . . |
| . .oo. . o. |
+----[SHA256]-----+
# 생성한 공개 키 확인
$ cat ~/.ssh/jenkins_agent_key.pub
ssh-rsa AAAAB3
# 생성한 개인 키 확인
$ cat ~/.ssh/jenkins_agent_key
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAA ...
3. authorized_keys 파일에 생성한 공개 키 복사해서 붙여넣기
$ cat ~/.ssh/jenkins_agent_key.pub >> ~/.ssh/authorized_keys
생성한 공개 키를 authorized_keys 파일에 복사해서 붙여 넣어줍니다.
4. 개인 키 복사하기(아래에서 사용)
$ cat ~/.ssh/jenkins_agent_key
젠킨스 설정에서 사용하기 때문에 cat 명령어로 출력된 개인 키를 복사해줍니다.
Jenkins Credentials 추가
이제 SSH 키를 가지고 Jenkins Credentials를 등록해주겠습니다.
[Dashboard] - [Manage Jenkins] - [Manage Credentials] - [System] - [Global credentials] - [Add Credentials] 에 들어가줍니다.
각각의 항목에 아래의 내용을 입력해줍니다.
Kind
-> SSH Username with private key를 선택해줍니다.
Scope
-> Global(Jenkins, nodes, items, all child items, etc)을 선택해줍니다
ID
-> 원하는 Credentials의 ID를 입력해줍니다.
Username
-> 접속할 Slave의 계정을 입력해줍니다.
Private Key
-> 위에서 복사한 개인 키를 붙여넣기 해줍니다.
[Create] 버튼을 누른 뒤에 Credentials가 생성된 것을 확인해줍니다.
Jenkins Node 추가 및 실행
이제 Jenkins Node를 추가해주겠습니다.
[Dashboard] - [Manage Jenkins] - [Nodes and Clouds] - [New Node]에 들어가 줍니다.
원하는 노드 이름을 입력해주고 [Create] 버튼을 눌러줍니다.
각각의 항목에 아래의 내용들을 입력해줍니다.
Name
-> Agent의 이름을 입력해줍니다.
Description
-> Agent에 대한 설명을 입력해줍니다.
Number of excecutor
-> Jenkins가 이 노드에서 실행할 수 있는 최대 동시 빌드 수를 입력해줍니다.
Remote root directory
-> Agent에는 Jenkins 전용 디렉토리가 있어야 하므로 Agent에서 디렉토리를 생성한 후에 디렉토리 경로를 입력해줍니다.
Label
-> Label은 여러 Agent를 하나의 논리 그룹으로 그룹화하는데 사용됩니다. 구분할 수 있는 Label의 이름을 입력해줍니다.
Usage
-> Jenkins가 이 노드로 어떻게 빌드 스케줄링을 제어할 것인지를 정합니다. "Use this node as much as possible"은 디폴트 설정이며 Jenkins가 이 노드를 자유롭게 사용할 수 있습니다. 디폴트 설정으로 선택하고 넘어가겠습니다.
Launch method
-> SSH 방식으로 통신할 것이므로 "Launch agents via SSH"를 선택합니다.
Host
-> 연결할 Agent의 호스트 이름 혹은 IP 주소를 입력합니다.
Port
-> 일반적으로는 SSH의 포트 번호인 22번을 입력합니다. 하지만, 저의 경우는 이더넷이 아닌 DHCP를 통해서 IP가 할당이 되는 Macbook Pro 환경이므로 포트포워딩을 해준 후에 설정한 포트 번호를 입력해주었습니다. 혹은 DDNS 설정 등의 방법도 좋은 방법일 것 같습니다.
Credentials
-> 위에서 만든 SSH 키를 이용한 Credentials를 선택해줍니다.
Host Key Verification Strategy
-> SSH 키에 대한 원격 호스트의 신뢰성을 확인하는 프로세스를 선택합니다. 예를 들면, "Known hosts file Verification Strategy"는 ~/.ssh/known_hosts 파일에 호스트 키를 저장하고 연결할 때 마다 기존 호스트 키와 비교하여 일치하는지 확인하여 신뢰성을 확인합니다. 하지만, 간단한 예제이므로 Non verifying Verification Strategy를 선택하고 넘어갑니다. (일반적으로는 해킹에 대한 공격을 방지하려면 호스트 키 확인 전략을 선택하는 것이 좋습니다.)
Availability
-> Jenkins가 Agent와의 연결을 얼만큼 유지할 것인지를 선택합니다. 이번에는 실행 되고 있는지를 확인하기 위해 "Keep this agent online as much as possible"를 선택하지만 항상 연결이 되어있을 필요가 없다면 다른 선택지를 선택하면 될 것 같습니다.
Environment variables
-> 노드에서 사용할 환경 변수를 입력해줍니다.
전부 입력했으면 [Save] 버튼을 눌러줍니다.
노드를 생성하면 Build Executor Status에 방금 생성한 노드인 제가 사용하고 있는 맥북프로인 Macbook-Pro가 추가되고 위와 같이 launching... 상태로 변경됩니다.
그리고 시간이 지나고 노드의 로그를 보면 연결이 성공되었다는 메세지를 확인할 수 있고, 생성한 노드가 성공적으로 온라인 상태로 연결된 것을 확인할 수 있습니다!