Jenkins / Linux & Permanent Agent

Flexyz·2024년 1월 21일
0

Jenkins

목록 보기
2/11


공식문서는 언제나(?) 옳다


배경

데브옵스 환경을 구축할 때 주로 리눅스 도커 위에 젠킨스를 컨테이너로 띄웠는데 호스트 환경에 직접 설치하면 더 직관적일 듯하여 linux에 설치를 진행했습니다. 일단 비교를 위해 도커는 설치하지 않고 진행합니다.


젠킨스 & 자바 설치

젠킨스는 자바환경에서 구동되므로 자바와 함께 설치합니다.

# java install
sudo apt -y update
sudo apt -y install fontconfig openjdk-17-jre
java -version

# ubuntu jenkins install
# https://www.jenkins.io/doc/book/installing/linux/
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
  https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]" \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get -y update
sudo apt-get -y install jenkins

# Start Jenkins
sudo systemctl enable jenkins
sudo systemctl start jenkins
sudo systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2024-01-22 14:54:33 UTC; 46s ago
   Main PID: 6941 (java)
      Tasks: 52 (limit: 14204)
     Memory: 3.2G
        CPU: 23.530s
     CGroup: /system.slice/jenkins.service
             └─6941 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080

Jan 22 14:54:23 development jenkins[6941]: 956eaed190fb49a6bc9b8224671f33d0
Jan 22 14:54:23 development jenkins[6941]: This may also be found at: /var/lib/jenkins/secrets/initialAdminPassword
Jan 22 14:54:23 development jenkins[6941]: *************************************************************
Jan 22 14:54:23 development jenkins[6941]: *************************************************************
Jan 22 14:54:23 development jenkins[6941]: *************************************************************
Jan 22 14:54:33 development jenkins[6941]: 2024-01-22 14:54:33.782+0000 [id=33]        INFO        jenkins.InitReactorRunner$1#onAttained: Completed initialization
Jan 22 14:54:33 development jenkins[6941]: 2024-01-22 14:54:33.803+0000 [id=24]        INFO        hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
Jan 22 14:54:33 development systemd[1]: Started Jenkins Continuous Integration Server.
Jan 22 14:54:34 development jenkins[6941]: 2024-01-22 14:54:34.776+0000 [id=49]        INFO        h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
Jan 22 14:54:34 development jenkins[6941]: 2024-01-22 14:54:34.778+0000 [id=49]        INFO        hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1


# Add 8080 port to firewall 
sudo ufw status
sudo ufw enable
sudo ufw allow 8080
sudo ufw allow 22
sudo reboot

# get admin password
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

젠킨스 대시보드 접속

  • http://<리눅스퍼블릭IP>:8080
  • 위에서 조회한 패스워드 입력
  • Customize Jenkins 설치 후 추가적으로 docker, docker pipline 플러그인을 설치합니다.

영구 에이전트 추가

  • 에이전트 구성
    Remote root directory: /home/jenkins/agent
    Launch method: Launch agent by connecting it to the controller
    Use WebSocket: check

  • 에이전트1 추가 & 비활성화 확인 > 에이전트1 클릭하면 나오는 스크립트를 복사
  • 호스트 리눅스 또는 도커가 설치되지 않은 별도의 리눅스 호스트에 터미널에 붙여넣기

    sudo su -
    
    ❯ # 스크립트 붙여넣고 엔터
    
    # 백그라운드 및 노업 실행 시nohup 스크립트 2>&1 &
    
    # 프로세스 확인ps -ef | grep agent1
     root        1825    1676  5 15:21 pts/1    00:00:02 java -jar agent.jar -jnlpUrl http://64.110.88.180:8080/computer/agent1/jenkins-agent.jnlp -secret <비밀키> -workDir /home/jenkins/agent

  • 빌드인 노드의 Number of executors 0으로 수정

  • 에이전트1 활성화 확인


테스트

  • 파이프라인 스크립트 작성 후 저장
    node {
    	stage('Check Docker installation') {
      	  sh 'docker --version || echo "Docker is not installed"'
    	}
    }

  • 지금 빌드 후 콘솔 로그 확인
    Started by user admin
    [Pipeline] Start of Pipeline
    [Pipeline] node
    Running on agent1 in /home/jenkins/agent/workspace/test
    [Pipeline] {
    [Pipeline] stage
    [Pipeline] { (Check Docker installation)
    [Pipeline] sh 
    (+) docker --version
    /home/jenkins/agent/workspace/test@tmp/durable-822f17b6/script.sh: 1: docker: not found
    (+) echo Docker is not installed
    Docker is not installed
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] }
    [Pipeline] // node
    [Pipeline] End of Pipeline
    Finished: SUCCESS

에이전트에 도커가 설치하지 않았음으로 도커를 찾을 수 없다고 나옵니다.


에이전트 호스트에 도커 설치

도커를 설치해 봅시다.

# Setup Docker
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove ; done

sudo apt-get update -y
sudo apt-get install -y ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo   "deb [arch="arm64" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu   "jammy" stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update -y
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo chown ubuntu:ubuntu /var/run/docker.sock
sudo service docker start

다시 빌드 테스트

Started by user admin
[Pipeline] Start of Pipeline
[Pipeline] node
Running on agent1 in /home/jenkins/agent/workspace/test
[Pipeline] {
[Pipeline] stage (hide)
[Pipeline] { (Check Docker installation)
[Pipeline] sh
+ docker --version
Docker version 25.0.0, build e758fe5
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

이번에는 도커 버전이 잘 출력되네요.
영구 에이전트의 호스트에서 도커 컨테이너 에이전트를 자동(?) 생성하여 호스트의 도커 소켓을 공유하게 되었는데요.


jenkins/inbound-agent 도커 이미지로 에이전트 실행

인바운드 에이전트 이미지를 이용해서 빌드한 컨테이너 에이전트를 사용하면 어떻게 될까요?

# jenkins/inbound-agent 이미지로 영구 에이전트 실행
docker run --init jenkins/inbound-agent -url http://129.154.199.197:8080 -secret <시크릿> -name agent2

# 콘솔로그 확인
Started by user admin
[Pipeline] Start of Pipeline (hide)
[Pipeline] node
Running on agent2 in /home/jenkins/agent/workspace/test
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Check Docker installation)
[Pipeline] sh
+ docker --version
/home/jenkins/agent/workspace/test@tmp/durable-b6edf21d/script.sh: 1: docker: not found
+ echo Docker is not installed
Docker is not installed
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

컨테이너 에이전트는 호스트의 도커 소켓과 연결되어 있지 않아서 도커를 찾을 수 없다고 나오네요.
이 부분을 연결하는 건 과제로 남깁니다 :)

profile
Think about a better architecture

0개의 댓글