일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- CaffeineCache
- 트랜잭션
- 카카오 화재
- 공변
- Redis
- GithubActions
- JAVA8
- 상태패턴
- 지연로딩
- method area
- lazyloading
- Metaspace
- backend
- 재고 시스템
- 리팩터링
- nonclustered index
- springboot
- ci/cd
- 부하테스트
- java
- JPA
- B+TREE
- Jenkins
- 웹캐시
- JDK14
- 제네릭
- 주문
- Spring Data Redis
- Ehcache
- 동시성
- Today
- Total
NDM
7. GithubActions를 이용한 CI/CD 구축 일지 2편 본문
구축일지 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파일을 새로 넣어주는 방식으로 진행합니다.
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://zinirun.github.io/2020/09/18/docker-automation-shellscript/
'[프로젝트] Slow Delivery' 카테고리의 다른 글
6. 재고 감소 -> 주문이 맞을까, 주문 -> 재고 감소가 맞을까? (0) | 2022.09.14 |
---|---|
5. 주문 트랜잭션 설계와 Transaction 내부에서의 호출 문제 (0) | 2022.09.14 |
4. 재고 처리 로직 동시성 이슈 해결 일지 (0) | 2022.08.31 |
3. FetchType = Lazy를 명시해도 Lazy Loading이 적용되지 않는다?? (0) | 2022.08.18 |
2. GithubActions를 이용한 CI/CD 구축 일지 1편 (0) | 2022.08.04 |