AWS EC2에서 Docker로 Jenkins 실행
여태까지 Github Actions를 이용해 CI를 구성했습니다.
도커 허브에 올린 도커 이미지를 통해 자바 애플리케이션을 배포해봅시다.
AWS EC2 인스턴스 생성하는 과정과 접속하는 과정은 생략하고 접속한 상태라고 과정하고 적겠습니다.
Ubuntu에서 진행합니다.
- 먼저 패키지 저장소를 최신으로 업데이트합니다.
sudo apt-get -y update
- docker를 설치합니다.
sudo apt-get -y install docker.io
- docker 명령을 사용할때 root 권한을 이용하여 실행할 필요가 없도록 docker 그룹에 유저를 추가합니다.
sudo usermod -aG docker ubuntu
해당 명령어를 실행한 후에 바로 적용이 안되므로 재부팅이 필요함
sudo reboot
- 다음 명령어를 통해 docker를 사용하여 젠킨스를 실행합니다.
docker run --name jenkins-docker -d -p 8080:8080 -p 50000:50000 -v /home/jenkins:/var/jenkins_home -u root jenkins/jenkins:lts
- jenkins에 접속하기 위해서는 http://인스턴스IP:8080 으로 접속하면 됩니다.
- 접속하면 패스워드를 입력하라고 하는데 이때
docker logs {containerID}
명령어로 확인할 수 있습니다.


- 권장 설정인 (Install suggested plugins)를 눌러 설치를 진행합니다.


- 설치가 완료되면 젠킨스를 사용할 수 있습니다.


Jenkins CD 설정
젠킨스를 이용해 자동배포를 하기 위해 젠킨스 설정을 추가합시다.
- Jenkins 관리를 선택합니다.

- Jenkins 관리 → System Configuration → 플러그인 관리로 이동합니다.

- 젠킨스 서버가 SSH를 통해 배포하려는 서버에 접근할 수 있도록 publish Over SSH 플러그인을 설치해줍니다.

설치후 재부팅이 필요합니다.
- jenkins에 SSH 접속을 할 수 있도록 jenkins의 SSH키를 발급받습니다.
sudo mkdir /home/jenkins/.ssh sudo chmod 700 /home/jenkins/.ssh sudo ssh-keygen -t rsa -b 4096 -m PEM Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /home/jenkins/.ssh/id_rsa ...
이후에 나오는 입력은 전부 enter를 누르면 됩니다.
- root 권한으로 로그인하여 ssh key를 확인합니다. (.ssh 폴더는 루트 권한이 없으면 접근 불가, 이를 굳이 바꾸지 말고 루트 권한을 얻어 확인합시다)
sudo -s cat .ssh/id_rsa.pub
- 5번에서 출력된 값을 복사하여 배포할 서버에 SSH키를 등록해줍니다.
cd ~/.ssh vim authorized_keys
SSH 설정이 적용되지 않는다면 .ssh 700 + authorized_keys 600 퍼미션인지 확인해야 합니다.
적용되지 않는 것 같다면 sudo service sshd restart로 ssh 서버를 재구동해보세요
- 젠킨스에서 Jenkins 관리 → 시스템 설정 → Publish Over SSH에서 Key에 id_rsa 값을 복사해서 붙여넣습니다.

- 젠킨스가 접속할 SSH 서버의 정보를 추가합니다.
- Name → 접속 대상의 서버 이름을 적습니다.
- Hostname → 접속 대상의 서버의 IP 혹은 도메인 주소를 적습니다.
- Username → 접속 대상의 유저이름을 적습니다.
- Remote Directory → 접속 대상의 디렉터리를 입력합니다

- 젠킨스에서 이미지를 가져와서 도커 이미지를 실행할 수 있도록 아이템을 추가합니다.

- Freestyle project를 선택하고 프로젝트 이름을 설정한 후 OK를 누릅니다.

- 빌드 후 조치로 가서 Send build artifacts over SSH를 선택합니다.

- 그 다음 도커 이미지를 가져오고 실행할 수 있도록 명령을 추가합니다.
- Verbose output in console → 진행상황을 콘솔로 확인할 수 있습니다.
- Exec command → 실행되는 명령입니다.

Github actions CI 성공시 Jenkins에서 배포하도록 설정
Github actions에서 jenkins action이라는 플러그인을 이용해서 github actions에서 CI가 성공하면 jenkins에서 배포하도록 처리할 수 있다.
- 먼저 배포할 jenkins 유저의 API 토큰을 생성하기 위해 Dashboard → 사람 으로 이동합니다.

- 배포를 진행하는 사용자를 선택한 후 설정으로 이동하여 API 토큰을 생성합니다.

- 배포에 사용되는 yaml 파일에 다음 내용을 추가합니다.
- url → jenkins 서버의 URL을 입력합니다.
- user → Jenkins에서 작업을 진행하는 user 이름을 입력합니다.
- token → JENKINS에서 발급한 토큰을 입력합니다.
- job → JENKINS에서 진행할 작업을 입력합니다.
- name: jenkins deploy uses: appleboy/jenkins-action@master with: url: ${{ secrets.WEBHOOK_URL }} user: ${{ secrets.JENKINS_USER }} token: ${{ secrets.JENKINS_USER_TOKEN }} job: ${{ secrets.JEKINS_JOB }}
- 이제 배포가 CI에 성공하면 배포가 자동으로 되는 것을 확인할 수 있습니다.
발생 이슈
Q. 실제로 터미널에서 SSH에서 접속은 되지만 젠킨스에서는 ssh 연결이 안된다고 하는 문제가 발생했습니다.
jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection. Message: [Failed to connect session for config [server__name]. Message [Auth fail]] 문제
A. 현재 EC2 인스턴스 버전을 22.04에서 18대로 낮췄더니 성공했습니다.
Q. 젠킨스에서 배포시
standard_init_linux.go:228: exec user process caused: exec format error
발생A. m1 아키텍처 이미지 문제로 컨테이너 배포시 ubuntu에서 구동할 수 있는 아키텍처로 설정해줘야 합니다.
현재는 jib을 사용하여 했으므로 gradle에 다음 설정을 추가합니다.
jib { from { image = "amazoncorretto:17.0.4-al2" platforms { platform { architecture = "arm64" os = "linux" } platform { architecture = "amd64" os = "linux" } } } ... }