AWS Fargate를 사용해 jenkins master <-> agent를 구성해보자. Part 3.
목차.
- https://hwan-shell.tistory.com/375 (Jenkins ECS Fargate 설명)
- https://hwan-shell.tistory.com/376 (네트워크 구축)
- https://hwan-shell.tistory.com/377 (ECS, Cloud Map, EFS 구축)
- https://hwan-shell.tistory.com/378 (Jenkins Node 설정 및 테스트)
이번에는 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 작업을 하시는 분들께 도움이 되었으면 합니다.
하다가 궁금한 사항 있으면 댓글 남겨주시면 최대한 답변 해보겠습니다.
읽어주셔서 감사합니다!!