[스터디] 2주차 - CI/CD
2024.04.03(수) ACC KHU 2기 모임 2주차 - CI/CD (19:00-20:20)
생성일 : 2024.04.04
수정일 | 수정 사항 |
---|---|
2024.04.03 | init |
2024.04.04 | tistory - 깨진 이미지 삭제 및 주석 처리 / notion - 변경 x |
2024.12.18 | tistory 스킨 커스텀 후 수정 시도(1) |
- 원본 code
https://github.com/SuminSSon/ACC_handson
- 실습 git repository
https://github.com/shin0112/ACC_hands_on_2
1주차에 배운 docker와 kubernetes 간단히 review하고 ci/cd git actions 핸즈온 진행!
Review
docker - Amazon ECS
: 컨테이너
- 신속성
- 운영 표준화
- 원활한 이전 : local 기반 → aws 환경
- 비용 절감
kubernetes - Amazon EKS
: 컨테이너 오케스트레이션 플랫폼
- serverless : 서버를 관리할 필요 x
Amazon ECR
: Amazon Elastic Containter Registry
- 완전 관리형 컨테이너 레지스트리
- docker랑 비슷
Hands-on
docker 이미지 build & run
git clone <원본 repository 주소>
dockerfile 확인
docker 이미지 생성
docker build -t acc-hands-on-2 .
-t
: 이름을 설정해주는 option.
: 현재 파일 경로 지정
docker 실행
docker run [옵션] [이미지] [명령어] [인자]
docker run -d --name acc-hands-on-2 -p 8000:8000 acc-hands-on-2
-d
|--detach
: 컨테이너를 백그라운드에서 실행-p
: host와 container의 포트 연결 (포트포워딩)- <host port>:<container port>
- host에 8000로 접근 → 컨테이너 내부 8000로 자동 접속
--name
: 컨테이너 이름
테스트
.docker hub에 이미지 업로드
1차 시도
docker push acc-hands-on-2
[!CATION]
⚠️ denied: requested access to the resource is denied
구글링.. 문제 원인은 크게 2가지- docker hub 로그인을 안함
- docker hub 아이디와 이미지의 태그 이름이 일치하지 않음
⇒ docker image를 만들면서 tag를 지정해주지 않았음!
2차 시도
- 태그 지정
docker tag [이미지 이름] [아이디]/[이미지 이름]
docker tag acc-hands-on-2 wnslcosltimo12/acc-hands-on-2
- docker hub에 다시 업로드
docker push wnslcosltimo12/acc-hands-on-2
- 다수의 개발자 → 형상관리 툴 사용
- github
- build → test → merge
- ms 환경 - 서비스를 잘게 쪼개서 개발
- 빠른 버그 찾기 & 합치기
- 고객의 상품 환경으로 자동 release
- production 레벨(고객의 상품 환경)까지 자동 deploy
- 컴파일러 오류 찾기
- 자동화 테스트
- 정적 코드 분석 → 코딩 규약 준수 ☑️
- 프로파일링 툴 → 성능 변화 감지
- 결합 테스트 환경
- workflows
- events
- jobs
- steps
- actions
- runners
AWS CodeCommit
- aws에서 호스팅 하는 완전 관리형 서비스
- 코드를 안전하게 저장 & 제어
- 시간과 파일에 관계 없이 저장 가능
- git 기반 repostiroy에서 이주 가능
AWS CodeBuild
- 완전 관리형 빌드 서비스
- 빌드 도구에 맞게 사전 패키지된 빌드 환경 제공
AWS CodeDeploy
- 배포할 서버 선택 - EC2, ECS → application 배포 자동화
- 배포 과정에서 세부사항 제어
- 모니터링
- 동시 배포
+) AWS beanstalk
- 알아서 로드밸런싱
- 모니터링
codepipeline
- 애플리케션을 지속적으로 배포해주는 것을 자동화
- source → build → test → staging → production
ECR 레포 생성
IAM user 생성
AmazonEC2ContainerRegistryFullAccess
정책 추가 → ecr-hands-on-2 생성AccessKey, SecretKey 발급 → git settings에 연동
repository 만들고, git remote add origin
git actoins로 되는 거 확인하기!
- git actions는 .github/workflows/acc.yml 내부의 코드를 읽어서 실행됨
🌟 jobs : workflow에서 하나의 처리 단위
steps : jobs의 구성 단위, job은 하나 이상의 step으로 구성``` # 이름 name: Docker image push to ECR # actions이 실행되는 trigger # main으로 push되었을 때 on: push: branches: [ "main" ] jobs: # build하기 build: name: Build and push Docker image # git actions이 실행될 가상 os 환경 runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 # python 환경 만들기 - name: Set up Python 3.9 uses: actions/setup-python@v2 with: python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip # settings에 넣었던 actions repository secrets 연동 # ECR에 연동하는 IAM user의 access key기 때문에, 자동으로 연동 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v2 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ap-northeast-2 # 서버 위치 - name: Login to Amazon ECR id: login-ecr uses: aws-actions/amazon-ecr-login@v1 # ECR에 docker 이미지 올리기 - name: Push Docker image to Amazon ECR env: REGISTRY: ${{ steps.login-ecr.outputs.registry }} REPOSITORY: acc-hands-on-2 IMAGE_TAG: ${{ github.sha }} run: | docker build -t $REGISTRY/$REPOSITORY:$IMAGE_TAG . docker push $REGISTRY/$REPOSITORY:$IMAGE_TAG ``` > ⚠️ **name unknown: The repository with name 'acc-khu' does not exist in the registry with id '\*\*\*'** > ⇒ workflow의 yml 파일에서 repository설정에 작성한 이름과 내가 만든 ECR 이름 맞춰주기  
DevOps
development + operation / 개발 + 운영 (개발 방법론)
CI/CD
Source → Build → Test → Deploy
CI
: Continuous integration - 지속적 통합
CD
: Continuous Delivery & Continuous Deployment - 지속적 배포
Jenkins
Github Action
AWS code series
Hands-on
Github Action을 이용한 AWS ECR에 docker 이미지 올리기
참고
[Docker] docker run 명령어 개념 [주요 옵션 설명]
docker push 에러 (denied: requested access to the resource is denied)