본문 바로가기
DevOps/CICD

Github actions + Jenkins를 통한 자동 배포 구현

by yongckim 2022. 8. 14.
728x90
반응형

AWS EC2에서 Docker로 Jenkins 실행

이전에 Github Actions를 이용해 CI를 구성했습니다.

https://yongc.tistory.com/22

도커 허브에 올린 도커 이미지를 통해 자바 애플리케이션을 배포해봅시다.

AWS EC2 인스턴스 생성하는 과정과 접속하는 과정은 생략하고 접속한 상태라고 과정하고 적겠습니다.

환경은 Ubuntu 18.04 에서 진행합니다

 

먼저 패키지 저장소를 최신으로 업데이트합니다.

sudo apt-get -y update

EC2에 도커를 설치합니다.

sudo apt-get -y install docker.io

EC2에서 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 관리를 누릅니다.

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 → 접속 대상의 서버 이름을 적습니다.  ex) dev-server
  • Hostname → 접속 대상의 서버의 IP 혹은 도메인 주소를 적습니다. ex) 192.168.0.1
  • Username → 접속 대상의 유저이름을 적습니다. ex) ubuntu
  • Remote Directory → 접속 대상의 디렉터리를 입력합니다 ex) /home/ubuntu

이제 서버에 접근한 후 실행할 배포 스크립트를 작성합니다.

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 파일에 다음 내용을 추가합니다.

- 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 }}
  • url → jenkins 서버의 URL을 입력합니다.
  • user → Jenkins에서 작업을 진행하는 user 이름을 입력합니다.
  • token → JENKINS에서 발급한 토큰을 입력합니다.
  • job → JENKINS에서 진행할 작업을 입력합니다.

이제 배포가 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대로 낮췄더니 성공했습니다.

https://velog.io/@mins1031/젠킨스-ssh로-ec2-연결중-BapPublisherException-예외

 

젠킨스 ssh로 ec2 연결중 BapPublisherException 예외..

프로젝트 배포 자동화를 구현하면서 오랜만에 젠킨스를 사용하게 되었습니다. 예전에도 사용해봐서 그렇게 무리 없을거라.....고 생각했는데...... 빌드

velog.io

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"
            }
        }
    }
	...
}

참고자료

https://dev-overload.tistory.com/40

https://velog.io/@znftm97/Jenkins로-배포-자동화-CD

https://velog.io/@znftm97/GitHub-Action으로-Jenkins에-요청보내기

반응형