일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 다이나믹프로그래밍
- 재귀
- 역방향 반복자
- dfs
- 순열
- 알고리즘
- BFS
- SQL
- GIT
- 그리드
- 다이나믹 프로그래밍
- 분할정복
- github action
- 브루트포스
- Spring
- 트리
- 자바
- 분할 정복
- 이분탐색
- AWS
- 그래프
- 컴퓨터 네트워크
- 자료구조
- HTTP
- 도커
- 백준
- 그리드 알고리즘
- CI/CD
- 스프링
- TCP
- Today
- Total
코딩성장스토리
CI/CD(Github action) 본문
CI/CD에 대해 공부를 진행하면서 배웠던 거에 적어 보려한다.
CI/CD의 개념
CI란?
-"CI"는 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)을 의미합니다. 지속적인 통합이 제대로 구현되면 애플리케이션 코드의 새로운 변경 사항이 정기적으로 빌드 및 테스트를 거쳐 공유 리포지토리에 병합
CD란?
-"CD"는 지속적인 서비스 제공(Continuous Delivery) 및/또는 지속적인 배포(Continuous Deployment)를 의미하며 이 두 용어는 상호 교환하여 사용됩니다. 두 가지 의미 모두 파이프라인의 추가 단계에 대한 자동화
CI/CD를 지원해주는 툴은 여러개가 있다.(github action, jenkins 등등...)
여기서 나는 가장 익숙하게 접할 수 있는 Github action 을 다루어 보려고 한다.
Github action을 사용하면 빌드,테스트를 진행시켜줄 runner가 필요하다.
간단히 생각하면 빌드,테스트 진행이 필요한 서버이다.
(runner는 github 레포지토리에 지정한 행동이 생기면 자동으로 진행이 된다.)
그리고 runner에는 두가지 방식이 있다.
1. GitHub-hosted runners:(Github 에서 제공해줌 )
- 자동으로 업데이트되느 운영체제 및 사전 설치된 패키지들과 도구들 및 self-hosted runner 애플리케이션을 사용할 수 있다.
- 관리와 유지보수를 GitHub에서 한다.
- 모든 job 실행에 깨끗한 인스턴스를 제공한다.
- GitHub plan안에서 무료 시간을 사용할 수 있다.(무료 시간을 초과하면 분당 요금이 적용된다,public repository는 무료)
2. Self-hosted runners: (우리가 사용하는 서버에 runner을 설치하고 실행가능)
- 러너의 자동 업데이트를 비활성화할 수 있지만 self-hosted runner 애플리케이션에 대한 자동 업데이트만 수신한다.
- 사전 결제된 클라우드 서비스나 로컬 머신을 사용할 수 있다.
- 하드웨어나 운영체제, 소프트웨어, 보안 요구사항에 맞게 커스터마이징할수 있다.
- 모든 job 실행에 깨끗한 인스턴스가 필요하지 않는다.
- GitHub Actions를 무료로 사용할 수 있으나, runner 머신에 대해 유지보수 비용을 부담해야 한다.
위 사진이 self-hosted와 hosted의 차이이다.
여기서 내가 궁금 했던 점이 있다.
self-hosted runner에서 빌드,배포를 할 경우 배포할 서버에서 파일이 갱신되므로 배포까지 바로바로 진행이 된다.
하지만 Github-hosted인 경우는 빌드,배포가 Github runner 서버에서 진행이 될뿐 내가 배포되길 원하는 서버에 배포를 하려면 어떻게 해야하는가이다.
사실 여기에는 여러가지 방법이 있다.
1. dockerhub에 이미지 파일을 만든후 Rsycn 툴을 이용해 원격에 있는 서버(내가 배포할 서버) 에 파일을 옮기고 ssh 접근으로 명령어 실행
2. aws codeDeploy + S3로 배포 후 ssh 접근으로 명령어 실행
등등 이 있다.
(Rsync(Remoe Sync)는 원격에 있는 파일과 디렉토리를 복사하고 동기화 하기 위해서 사용하는 툴이며 동시에 네트워크 프로토콜이다) 안써도 배포가능
나는 1번방식을 접해 보았다.
Rsync는 처음 보는 용어이고 이걸 어떻게 사용하는지 어렵다.
그래서 Gitbub marketPlace에 사용하기 쉽게 만들어진 코드들이 많다
예를들어
https://github.com/easingthemes/ssh-deploy
GitHub - easingthemes/ssh-deploy: GitHub Action for deploying code via rsync over ssh. (with NodeJS)
GitHub Action for deploying code via rsync over ssh. (with NodeJS) - GitHub - easingthemes/ssh-deploy: GitHub Action for deploying code via rsync over ssh. (with NodeJS)
github.com
이런 방식이 있다.
이해하기 쉽게 코드를 보자 (github marketplace에서 지원된 코드를 많이 사용한 코드) -사용법만 알면 상당히 편리하다
name: deploy
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v3
- uses: gradle/wrapper-validation-action@v1
- uses: docker/setup-qemu-action@v2
- uses: docker/setup-buildx-action@v2
- name: Login to DockerHub //도커허브 로그인
uses: docker/login-action@v2 //github marketplace에서 지원
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and Push a Main Docker Image //dockerhub에 이미지 올리기
uses: docker/build-push-action@v3
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: myunghyunnero/test:latest
- name: Deploy Main Docker Compose Production Configuration //내 서버에 이미지 배포
uses: easingthemes/ssh-deploy@v2 //github marketplace에서 지원
env:
REMOTE_HOST: ${{ secrets.REMOTE_SSH_HOST }}
REMOTE_PORT: ${{ secrets.REMOTE_SSH_PORT }}
REMOTE_USER: ${{ secrets.REMOTE_SSH_USERNAME }}
SSH_PRIVATE_KEY: ${{ secrets.REMOTE_SSH_KEY }}
SOURCE: .deploy/
ARGS: -avz --delete
TARGET: ${{ secrets.REMOTE_TARGET }}
- name: Run Main Docker //내 서버에서 도커 이미지 실행
uses: appleboy/ssh-action@master //github marketplace에서 지원
env:
TARGET: ${{ secrets.REMOTE_TARGET }}
with:
host: ${{ secrets.REMOTE_SSH_HOST }}
port: ${{ secrets.REMOTE_SSH_PORT }}
username: ${{ secrets.REMOTE_SSH_USERNAME }}
key: ${{ secrets.REMOTE_SSH_KEY }}
envs: TARGET
script_stop: true
script: |
cd $TARGET
docker compose -f docker-compose-production.yml pull
docker compose -f docker-compose-production.yml up -d test
docker image prune -af
'기타' 카테고리의 다른 글
AWS 서비스들 알아보기2(EC2,Elastic Beanstalk, Fargate,ECR,ECS,Lamda) (0) | 2023.05.04 |
---|---|
AWS 서비스들 알아보기 1(API GateWay,S3,ELB,CloudFront,Secret manager) (0) | 2023.05.02 |
aws CloudFront + S3 (3) | 2023.02.14 |
Swagger + Security 적용 (2) | 2023.01.26 |
Spring Security 공부 + Jwt 적용 (1) | 2023.01.26 |