NDM

7. GithubActions를 이용한 CI/CD 구축 일지 2편 본문

[프로젝트] Slow Delivery

7. GithubActions를 이용한 CI/CD 구축 일지 2편

ndm.jr 2022. 10. 24. 23:05

구축일지 1편에서는 왜 자동화를 선택했는지, Jenkins 대신 GithubActions를 사용했는지 알아보았습니다

 

이번 2편에서는 CI/CD 자동화를 어떻게 했는지에 대해 서술합니다.

 

하나하나 다 알아보지는 않고, 핵심적인 몇몇 단계만 짚어서 보겠습니다

 

전체 워크플로우는 다음과 같습니다.

 


# application.properties 설정 파일 숨기기

 

특정 브랜치로 체크아웃 -> Java11 설정 -> Build까지 별 다를게 없는 설정입니다.

 

다만, make application.yml을 봐주시길 바랍니다.

 

저는 SpringBoot로 프로젝트를 진행하고있고, SpringBoot의 application 파일에는 설정정보들이 담겨져있습니다.

 

DB의 host나 username, password등이 그 예시이고, 이는 숨겨주는것이 좋습니다.

 

  • application.yml을 gitignore설정에 추가해서 github에 올라가지 않도록 설정하고
  • 배포시에는 해당 repository의 actions secret을 이용해 application.yml파일을 새로 넣어주는 방식으로 진행합니다.

github repository -> settings -> secret -> action을 가서 key-value형식으로 설정할 수 있습니다

 

Actions Secret에서 Key-Value 형식으로 변수를 지정해주면

GithubActions의 yml파일에서 ${{ Key }} 포맷으로 사용할 수 있고, secrets는 접두어니 그냥 붙여주면 됩니다.

 


# Dockerhub로 이미지 말아서 푸시하기

 

저는 다음의 방식을 사용하고 있습니다.

  • 프로젝트 파일을 .jar파일로 도커 이미지를 말고, DockerHub에 푸시합니다
  • 배포시에는 푸시해둔 DockerHub의 이미지파일을 pull받고, 서버에서 배포합니다.

 

그러기 위해서는 먼저 DockerFile을 만들어야 합니다.

 

프로젝트명은 알아서 바꿔주시면 됩니다

 

 

이렇게 DockerFile을 만들면, 우리가 명령어를 직접 실행하지 않아도 빌드 시에 도커파일이 도커이미지를 만들어줍니다.

 

 

 

DockerHub에 푸시하기위해 먼저 로그인을 해야합니다. 필요한 파라미터를 with에 적어주시면 됩니다.

  • username : DockerHub 아이디(레포이름)
  • password : DockerHub Access Token

 

password는 DockerHub -> Accout Setting -> Security를 가면 Access Token을 발급받을수 있습니다.

 

 


# SSH 로그인 후 배포

 

여기서는 다음의 방법으로 진행합니다.

  • SSh private key를 이용해 서버에 접속
  • 배포 스크립트 실행

 

그러기 위해서는 ssh 로그인을 해야하는데, GithubActions에서 다 지원해 줍니다. 여기를 참고하세요

 

그 전에, 서버에서 SSH 로그인을 위한 추가 설정이 필요합니다.

 

Ubuntu 20.04 이상에서는 추가적인 다른 설정이 필요하다고 하니 여기를 참고하세요

 

1. SSH KEY 생성 및 authorized_keys 등록하기

 

ssh-keygen -t rsa

먼저 서버에 접속한 후, ssh key를 생성합니다. (Ubuntu 20.04 이상에서는 특정 알고리즘을 명시해줘야 한다고 합니다.)

 

touch ~/.ssh/authorized_keys

chmod 755 ~/.ssh/authorized_keys

 

ssh 폴더에 .pub 형식의 공개키와 private key가 생겼을 겁니다.

authorized_keys라는 파일을 만들어주고, 권한을 부여해주세요

 

vi authorized_keys

 

이제 vi 에디터로 파일을 열고, 공개키를 붙여넣기 해주세요

 

위 설정을 해주지 않으면

ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain 에러가 뜹니다.

 

2. SUDO 권한 부여

sudo visudo

위 커맨드를 실행하면, /etc/sudoers 파일에 접근할 수 있습니다.

현재 sudo권한을 가진 계정은 root뿐인데, GithubActions를 통해 SSH로 접근하게 되면 계정이 다를 수 있기 떄문

sudo 명령을 실행해도 에러가 뜹니다. 그걸 방지하기 위한 설정입니다.

 

이 설정을 해주지 않을 경우 sudo: no tty present and no askpass program specified 를 만날수 있습니다.

 <권한주려는 계정 이름> ALL=(ALL)    NOPASSWD:ALL

<>는 빼셔야합니다. 이렇게하면 설정은 끝났습니다.

 

 

  • host : 서버의 host를 적어주시면 됩니다.
  • username : 위에서 sudo권한을 준 계정 이름과 맞춰주세요
  • port : ssh 기본 포트는 22번입니다.
  • key : 위에서 authorized_keys에 공개키를 붙여넣었습니다. 여기는 private key를 붙여넣어주세요

 

스크립트는 수정하셔도 무방합니다. 저는 최대한 간단하게만 했습니다.

서버 방화벽은 당연히 열어주셔야 80포트로 접근이 가능합니다.

 

여기까지 하면 GithubActions를 사용한 CI/CD 자동화가 끝이 납니다.

 


https://118k.tistory.com/359

 

[hadoop][python][linux] sudo: no tty present and no askpass program specified 오류 처리하기

하둡을 이용하여 파이썬 프로그램을 실행하던중 로컬에서는 실행이 되는데, MR을 이용하여 실행하면 다음과 같은 오류가 발생하는 경우가 있다. <실행명령> os.system("sudo apt-get -y install python-pip") <

118k.tistory.com

https://zinirun.github.io/2020/09/18/docker-automation-shellscript/

 

Dockerfile과 배포 자동화 스크립트 만들기 | zinirun

그럴듯한 자동화 프로젝트를 하다 보면, 깃에서 파일을 수정하고 Docker 이미지를 다시 만들고, 빌드한 이미지로 컨테이너를 실행하여 재배포해야할 때가 많다. 팀 프로젝트를 하면서 원래 있던

zinirun.github.io