Jenkins Agent 선택하기

장병학·2023년 12월 24일
0

Jenkins

목록 보기
1/1
post-thumbnail

이 글은 Jenkins의 Agent 추가를 진행할 수 있는 상황을 가정하고 작성되었다.

아이디어의 시작

지금 우리 회사에서는 서비스 별 AWS 계정이 존재한다. 그리고 배포 Jenkins서버는 하나의 계정에서 수행하고 있다. 그래서 신규 서비스 계정이 추가되면 메인 배포 Jenkins에서는 AWS CLI로 다른 계정의 배포 관련 서비스를 제어할 수 있도록 계정끼리 권한 설정, 권한위임 설정 등의 복잡한 권한 설정을 진행한다. 물론 이것만으로도 메인 Jenkins에서 서비스 계정의 CodeDeploy를 제어하여 무중단 배포를 진행할 수 있다. 하지만, 이 계정끼리의 권한 설정이 상당히 귀찮고 복잡하다. 그리고 신규 서비스 계정이 추가될 때 마다 매번 진행해주어야 한다.

아, 귀찮고 복잡해

계정간 권한 허용 설정하는 부분이 좀 귀찮았다. A계정에서 사용될 정책을 B계정에 만들어 두고 해당 권한을 A 계정에서 사용할 수 있도록 신뢰관계도 추가하고 이런저런 설정이 끝나면 Jenkins Pipeline에서 해당 계정의 권한을 얻어오고 설정하는 코드도 들어가야 하는 등의 작업이 진행되어야 했다.
개인적으로 Jenkins Agent를 추가하는 작업보다 이게 더 귀찮고 복잡했다. Agent야 EC2 하나 띄우고 Docker Swarm 모드에 Node로 포함시키고 Docker Compose로 만들어 둔 yml 파일을 실행만 하면 된다.(물론 Jenkins에서 Agent 연결을 해야하지만)

이런 상황에서 나는 권한 설정보다 Agent 추가로 신규 계정 배포를 진행하기로 한다.

Agent 선택

jenkins Job에서 특정 Agent를 선택하는건 어렵지 않다.

pipeline {
	agent {
		label 'AGENT_NAME'
	}
    ...
}

보통 하나의 Agent이거나 Agent의 구분이 의미가 없을 경우 agent any로 설정을 했는데 지금 구성대로라면 추가되는 Agent들의 논리적 위치가 달라지기에 Job 별로 Agent를 특정해야만 했다. 이 때 위 코드처럼 label 항목을 AGENT_NAME으로 설정해주면 된다.

하지만, 공통으로 사용되는 Job의 경우에는 어떻게 될까? Agent 별로 사용되어져야 할 Job을 복붙해야할까? 그것도 낭비다. 결국 내가 하고 싶은 것은 상위 Job에 따라 하위 JobAgent가 선택되도록 하는 것이다.

Agent를 외부에서 선택하도록

결론부터 말하면 이것도 의외로 간단하다. 파라미터로 받아서 파라미터 변수로 셋팅하면 된다. 외부에서 Job을 실행할 때 Agent 이름을 변수로 전달하고 Job에서는 해당 변수를 label에 셋팅한다.

pipeline {
	agent {
		label params.AGENT_NAME
	}
    stages {
        stage('Run') {
            steps {
                sh """
                cat /etc/hostname
                """
            }
        }
    }
}

위 코드를 보면 Job 설정에서 외부 파라미터로 셋팅해둔 AGENT_NAME을 label에서 사용한다.
이 상태로 실행 테스트를 해본다.
1. 기본 값으로 실행
2. 빈 값으로 실행
3. 다른 Agent로 실행

결과적으로 1, 2번은 동일하게 실행된다. 아래 이미지를 보면 기본 값인 worker로 실행이 되었다.

3번은 worker2로 Job을 실행해 본다. 그리고 아래 이미지를 보면 설정한 worker2 Agent로 실행된 걸 볼 수 있다.

Agent 이름을 별도로 관리하기?

이 부분이 애매했다. 처음 의도는 Job 별 environment에 Agent 이름을 정의해 두고 label과 파이프라인 내 다른 Job 호출 시 파라미터로 환경변수를 주입하려고 했었다. Agent 이름이 바뀔 경우 environment의 값만 바꾸면 되지 때문이다. 하지만 이 방법으로는 Agent 이름이 제대로 전달되지 않았다. Job의 파라미터로는 전달이 되겠지만 Agent label에 제대로 된 이름이 전달되지 않았다. 정확한 이유는 아직 찾지 못했다.
그래서 대안으로는 이 전 항목에서 언근했던 것 처럼 파라미터 항목의 기본 값으로 설정을 해 두는 방법으로 관리가 가능하긴 하다. 다만 파라미터의 목적과 이렇게 사용하는 목적이 같은지에 대한 의문이 있지만 다른 대안이 없는 지금...우선 이 방법을 사용하기로 한다.

profile
클라이밍과 공부와 개발이 취미인 개발자

0개의 댓글