1. Github Actions 로 특정한 파일만 가져오기
기본적인 EC2 + Github Actions + Docker Hub 으로 배포환경 구축하시는 분들께서 쓰시는 방법:
주변에서도 많이들 사용하는 방식으로, docker-compose up을 위한 docker-compse.yaml 파일을 다음과 같은 방식으로 가져옵니다.
1. EC2에 접근하여 docker-compose.yaml을 직접 생성한 후 워크플로우 실행
2. (제가 기존에 사용했던 방식) docker-compose.yaml을 secret/variable 으로 등록한 후 github actions에서 ssh 접근 후 해당 파일을 쓰는 스크립트 실행
두가지 모두 불편한 점이 있습니다.
바로 docker-compose.yaml 파일이 수정될때마다 data sync를 수동으로 해야 한다는거죠.
1번 방식 : docker-compose.yaml 수정할때마다 EC2에 접속하여 docker-compose.yaml파일을 직접 수정
2번 방식 : docker-compose.yaml 수정할때마다 Repository Secrets / Variables 에서 값을 직접 수정
물론 docker-compose.yaml파일 자체가 수정이 자주 일어나는 파일은 아니긴 합니다만, 자동화를 하는 김에 이것도 자동화를 해봅시다.
(아이디어를 주신 동아리 부원님께 감사드립니다.)
## docker compose up
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST_DEVELOP }}
username: ubuntu
key: ${{ secrets.KEY_DEVELOP }}
script: |
cd /home/ubuntu/repick
sudo touch .env
echo "${{ secrets.ENV_DEV_VARS }}" | sudo tee .env > /dev/null
sudo curl -o docker-compose.yml https://raw.githubusercontent.com/[조직/계정명]/[레포지토리명]/[브랜치명]/docker-compose.yaml
sudo chmod 666 /var/run/docker.sock
sudo docker rm -f $(docker ps -qa)
sudo docker pull ${{ secrets.DOCKER_REPO }}/web-develop
sudo docker pull ${{ secrets.DOCKER_REPO }}/nginx-develop
docker-compose -f docker-compose.yaml --env-file ./.env up -d
docker image prune -f
중간에 sudo curl -o docker-compsoe.yml.. 을 보시면 됩니다.
저 명령어 한 줄이면 docker-compose.yaml(yml)파일을 remote 환경으로 가져올 수 있습니다.
아주 쉽죠?
2. 프론트엔드 S3버킷 배포 + CloudFront 무효화까지 자동화하기
저처럼 S3 + CloudFront 콤보로 배포하시는분들은 빌드마다 무효화하기 귀찮으실 수 있는데요, 그래서 자동화 스크립트를 가져왔습니다.
name: Build React App
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [ 16.x ]
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Create env file
run: |
touch .env
echo REACT_APP_API_SERVER=${{ secrets.REACT_APP_API_SERVER }} >> .env
echo REACT_APP_KAKAO_REST_API_KEY=${{ secrets.REACT_APP_KAKAO_REST_API_KEY }} >> .env
echo REACT_APP_KAKAO_REDIRECT_URI=${{ secrets.REACT_APP_KAKAO_REDIRECT_URI }} >> .env
- name: Npm Install
run: |
npm install
- name: Npm Build
run: |
npm run build
- name: Deploy to S3
uses: jakejarvis/s3-sync-action@master
with:
args: --acl public-read --delete
env:
AWS_S3_BUCKET: ${{ secrets.AWS_STAGING_BUCKET_NAME }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: ${{ secrets.AWS_DEFAULT_REGION }}
SOURCE_DIR: "build"
- name: Configure AWS credentials and Invalidate CloudFront distribution
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_DEFAULT_REGION }}
run: |
aws cloudfront create-invalidation --distribution-id DISTRIBUTION_ID --paths "/*"
- Create env file : 환경변수를 만듭니다. (.env)
- Npm Install : npm run build 를 실행하기 위해 npm을 설치합니다.
- Npm Build : 실제 Build를 수행합니다. ( 이 때 경고 메세지도 빌드 실패로 판정되더라구요.. )
- Deploy to S3 : S3버킷에 파일을 업로드합니다.
- Configure AWS credentials and Invalidate CloudFront distribution : CloudFront distribution을 무효화합니다.
Secrets :
- AWS_STAGING_BUCKET_NAME : 버킷 이름입니다. (S3 버킷 이름은 모두 고유합니다. 엔드포인트 == 버킷이름)
- AWS_ACCESS_KEY_ID : IAM 사용자를 만들고 access key를 만들면 발급 가능합니다.
- AWS_SECRET_ACCESS_KEY : IAM 사용자를 만들고 access key를 만들면 발급 가능합니다.
- AWS_DEFAULT_REGION : 리전을 선택하면 됩니다.
환경변수는 필요하면 알아서 등록하시면 됩니다.
이렇게 하면 프로젝트 푸시만 하면 알아서 프로덕션에 바로 반영이 됩니다. (무효화까지 진행되기 때문)
즐거운 배포 되세용
'Server' 카테고리의 다른 글
Github Actions: ssh-aciton IPv6 지원 (1) | 2024.03.17 |
---|---|
[Terraform] state locking을 위한 s3, ddb 설정하기 (0) | 2024.02.23 |
[Docker, AWS, Spring] docker-compose시 환경변수 전달하고 스프링부트 application.yaml에서 사용하기 (3) | 2023.10.06 |
[Slack API] 슬랙 API를 통한 요청 가이드 - 외부 요청 차단 (2) (0) | 2023.08.17 |
[Slack API] 슬랙 API를 통한 요청 가이드 (1) (0) | 2023.08.16 |