프로젝트/AWS Fargate in Jenkins

AWS Fargate를 사용해 jenkins master <-> agent를 구성해보자. Part 3.

Hwan2 2023. 4. 3. 23:34
반응형

 

 

 

 

 

목차.

 

 

 

이번에는 AWS Fargate jenkins의 셋팅을 하고, Master <-> Agent구조를 만들어보겠습니다.

 

이것의 장점은 Agent가 실행되고, 빌드를 모두 마치면 자동으로 종료된다는 겁니다.

 

우선 젠킨스에 들어가서 기본적인 설치를 끝낸 후 PlugIn을 설치해 줍니다.

 

1. Install plugin

Install을 하면 10 ~ 15분정도 소요가 됩니다.

 

2. Node 설정

Dash board -> 젠킨스 관리 -> 노드 관리 -> Configure Clouds 에 들어갑니다.

그 후 Jenkins Node 설정을 해줍니다.

 

Region을 선택하면 자동으로 ECS Cluster가 잡힙니다.

그 후 고급에 들어갑니다.

 

 

고급에서 Cloud Map으로 설정한 Private DNS 주소를 적어줍니다.

Agent와 통신할 포트는 50000 이고, Master Jenkins는 8080포트로 설정해줍니다.

 

 

이제 Templete 작성을 해줍니다.

 

3. Templete

  • Label은 나중에 Pipeline을 작성할 때 띄울 이름 입니다.
  • Task Definition Override에 Terraform으로 만들어 놓은 Taskf Definition 이름을 넣어줍니다.
  • Lunch type, OS를 선택해줍니다.
  • Network mode는 awsvpc로 설정합니다.
  • Filesystem root는 /var/jenkins_home으로 해줍니다. (Terraform에서 이렇게 정의했습니다.)
  • 사용할 Memory와 CPU unit 을 설정해줍니다.
  • Subnet에는 Agent가 실행될 Private Subnet ID를 넣어줍니다.
  • Security Groups에는 ECS에 적용된 보안그룹 ID를 넣어줍니다.

 

4. Agent 실행

Pipeline을 간단하게 설정한 후 테스트 해봅니다.

pipeline {
    agent none
    
    stages {
        stage('build') {
            agent any // 마스터 로컬에서 bash실행
            steps{
                sh 'ls'
                sh 'pwd'
            }
        }
        
        stage('ecs-agent') {
            agent { label 'agent' }
            steps {
                sh 'ls'
                sh 'pwd'
                sh 'echo "hello agent!!"'
            }
        }
    }
}

 

빌드를 시작하면 Agent가 뜹니다.

 

 

알아서 Agnet가 띄워진 후 실행 중지가 된 것을 확인할 수 있습니다.

 

 

Output을 보면 잘 실행된 것을 확인할 수 있습니다.

 

추가로 버그가 한가지 있는데요.

 

INFO: Failed to send back a reply to the request 
UserRequest:hudson.Launcher$RemoteLauncher$KillTask@104aafb1: 
hudson.remoting.ChannelClosedException: 
Channel "hudson.remoting.Channel@59bf0e13:JNLP4-connect connection to 
jenkins.local.com/10.0.11.192:50000": channel is already closed

 

Agent가 종료될 때 이러한 에러를 뱉으면서 종료됩니다.

 

그러면서 Agent를 한번 더 실행하게 되는데, 버그인 것 같아보입니다.

Build를 2번하거나 하지 않으니 걱정 안하셔도 됩니다.

 

5. EFS 확인해보기

Jenkins VPC에 아무 서브넷에다가 EC2하나를 띄웁니다.

해당 EC2에는 Terraform으로 작성된 보안그룹을 추가해줍니다.

 

EFS를 Mount하기 위해서는 Access point 주소가 필요한데, EFS에 들어가면 나옵니다.

 

연결 버튼을 누르면 Mount 할 수 있는 명령어가 나옵니다.

 

EC2로 돌아가서 다음 명령어를 입력해줍니다.

[ec2-user@ip-10-0-1-41 ~]$ sudo su
[root@ip-10-0-1-41 ec2-user]# 
[root@ip-10-0-1-41 ec2-user]# 
[root@ip-10-0-1-41 ec2-user]# cd /
[root@ip-10-0-1-41 /]# mkdir efs
[root@ip-10-0-1-41 /]# sudo yum install amazon-efs-utils
[root@ip-10-0-1-41 /]# mount -t efs -o tls,accesspoint=fsap-0f856d95b772dc12f fs-0b5a222ca04a7ccb4:/ efs
[root@ip-10-0-1-41 /]# cd efs
[root@ip-10-0-1-41 efs]# ls
caches                                              hudson.plugins.git.GitTool.xml                  jenkins.telemetry.Correlator.xml  org.jenkinsci.plugins.workflow.flow.FlowExecutionList.xml  secret.key.not-so-secret  war
config.xml                                          identity.key.enc                                jobs                              plugins                                                    secrets                   workspace
copy_reference_file.log                             jenkins.install.InstallUtil.lastExecVersion     logs                              queue.xml                                                  updates
hudson.model.UpdateCenter.xml                       jenkins.install.UpgradeWizard.state             nodeMonitors.xml                  queue.xml.bak                                              userContent
hudson.plugins.emailext.ExtendedEmailPublisher.xml  jenkins.model.JenkinsLocationConfiguration.xml  nodes                             secret.key                                                 users
[root@ip-10-0-1-41 efs]# cd workspace/
[root@ip-10-0-1-41 workspace]# ls
jenkins-agent  jenkins-agent@tmp
[root@ip-10-0-1-41 workspace]# cd jenkins-agent
[root@ip-10-0-1-41 jenkins-agent]# ls
text.txt
[root@ip-10-0-1-41 jenkins-agent]# cat text.txt 
hello agent!!

 

 

끝으로...

 

해당 Jenkins ECS Fargate 작업을 하시는 분들께 도움이 되었으면 합니다.

하다가 궁금한 사항 있으면 댓글 남겨주시면 최대한 답변 해보겠습니다.

 

읽어주셔서 감사합니다!!

반응형