Develop → Commit → Build → Test → Deploy
항목 | GitHub Actions | Jenkins |
---|---|---|
설치 필요 여부 | 없음 (클라우드 기반) | 별도 서버 설치 필요 |
비용 | 무료 (Private 리포지토리 포함) | 서버 운영 비용 발생 |
설정 편의성 | GitHub와 자연스럽게 연동되어 간편 | 설정이 복잡하고 세팅 시간이 필요 |
사용 환경 | GitHub 리포지토리와 통합 운영 | 독립된 서버에서 관리 및 설정 필요 |
항목 | GitHub Actions | Jenkins |
---|---|---|
장점 | - GitHub와 완벽하게 통합 - 클라우드 기반으로 서버 불필요 - yaml 기반 설정으로 간편 - 퍼블릭 리포지토리에서는 무료 - 다양한 Marketplace 액션 제공 | - 플러그인 기반 커스터마이징에 강함 - 복잡한 파이프라인 구현 가능 - 내부망 환경에서도 안정적으로 운영 - GitHub 외 다양한 VCS 연동 가능 - Job 관리 및 시각화 우수 |
단점 | - GitHub에 의존적 - GitHub 외 플랫폼과의 연동은 제한적 - 복잡한 파이프라인에서는 한계가 있을 수 있음 | - 서버 구축 및 유지관리 필요 - 인프라 비용 및 관리 리소스 필요 - UI나 플러그인의 버전 이슈가 발생 가능 - 초기 진입 장벽이 있음 |
상황 | 추천 도구 |
---|---|
GitHub 리포 기반 + 빠른 구축이 필요한 경우 | GitHub Actions |
사내 인프라 환경 + 복잡한 커스터마이징이 필요한 경우 | Jenkins |
IoT/모바일 등 특수한 환경이 필요한 경우 | Jenkins + 기타 도구 조합 |
.github > workflows
디렉토리를 생성workflows
디렉토리에 deploy.yml
파일을 생성하고, 아래와 같이 코드를 작성name: Github Actions 실행시켜보기
on:
push:
branch:
- main
git push
후 GitHub Actions 탭에서 자동으로 생성된 워크플로우 항목을 확인 가능name: Github Actions 실행시켜보기
on:
push:
branch:
- main
jobs:
My-Depoly-Job:
runs-on: ubuntu-latest
steps:
- name: Hello World 출력하기
run: echo "Hello World"
- name: 여러 명령어 문장 작성하기
run: |
echo "Good"
echo "Morning"
pwd
- name: 변수 사용하기
run: |
echo $GITHUB_REPOSITORY
echo $GITHUB_SHA
- name: Github Actions Secret 변수 사용하기
run: |
echo ${{ secrets.MY_NAME }}
echo ${{ secrets.MY_HOBBY }}
secret 값은 GitHub 저장소 → Settings → Secrets and variables → Actions에서 등록
민감한 정보를 외부에 노출하지 않기 위해 사용
(출력 시 ***
로 마스킹됨)
git push
IAM → Access management → Users → Create User
User 이름 입력
권한 정책 연결에서
- 직접 정책 연결 (Attach policies directly)
- 권한 정책 > AmazonS3FullAccess & CloudFrontFullAccess 두 개 체크 후 다음 단계로
사용자 생성 완료
AWS_ACCESS_KEY_ID
, AWS_SECRET_ACCESS_KEY
두 값을 등록 - name: Github Repository 파일 불러오기
uses: actions/checkout@v4
- name: Repository 파일 출력하기
run: ls
- name: 의존성 설치
run: npm i
- name: 빌드하기
run: npm run build
- name: Debugging
run: |
ls
cd dist
ls
- name : AWS Resource 접근을 위한 인증 설정
uses : aws-actions/configure-aws-credentials@v4
with :
aws-region : us-east-1
aws-access-key-id : {{ $secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key : {{ $secrets.AWS_SECRET_ACCESS_KEY }}
- name : S3 기존 파일들 전체 삭제
run : |
aws s3 rm --recursive s3://oz-practice
- name: S3에 빌드된 파일 업로드
run: aws s3 cp ./dist s3://oz-practice/ --recursive
/*
는 모든 파일을 대상으로 무효화 처리 - name: CloudFront 캐시 무효화
run: aws cloudfront create-invalidation --distribution-id E27IT17HQ8DDSV --path "/*"
{/* ✅ 날짜와 시간 표시 */}
<p>🕒 현재 시간: {dateTime.toLocaleString()}</p>
{/* ✅ 스탑 / 계속 버튼 */}
<div style={{ marginTop: '1rem' }}>
<button onClick={() => setIsRunning(false)} style={{ marginRight: '0.5rem' }}>
⏸️ 스탑
</button>
<button onClick={() => setIsRunning(true)}>
▶️ 계속
</button>
</div>
{/* 날짜와 시간 표시 */}
<p>🕒 현재 시간: {dateTime.toLocaleString()}</p>
{/* 스탑 / 계속 버튼 */}
<div style={{ marginTop: '1rem' }}>
<button onClick={() => setIsRunning(false)} style={{ marginRight: '0.5rem' }}>
⏸️ 스탑
</button>
<button onClick={() => setIsRunning(true)}>
▶️ 계속
</button>
git add .
git commit -m "새로운 기능 추가"
git push origin main