Cloud(지속적 통합)

Rina's·2023년 7월 26일

코드스테이츠

목록 보기
79/96
post-thumbnail

지속적 통합(CI)

Continuous Integration

코드 변경 시 마다 자동으로 빌드하고 테스트를 수행하는 프로세스
이는 수동 빌드로 인한 인적 오류를 줄여 코드 품질을 향상시키고 빠른 피드백을 줌으로 효율성을 올려준다

빌드

실행가능한 소프트웨어, 아티팩트를 만드는 과정.
아티팩트는 바이너리파일, 라이브러리, 패키지 등의 형태로 제공된다

빌드 도구

  • Java - Maven, Gradle
  • Python - pip, setuptools
  • JavaScript - npm, yarn
  • C++ - CMake, Makefile

지속적 통합 도구 종류

Jenkins

오픈 소스 CI/CD 도구, 다양한 플러그인을 지원

Travis CI

호스트형 배포 자동화 서비스로 Travis 자체 호스트 플랫폼을 사용
GitHub 계정과 연동하여 쉽게 통합이 가능
GitHub와 연동, YAML 파일로 쉬운 설정이 가능

Github Actions

GIthub Actions workflows

  1. Push한 코드 작업을 테스트 및 빌드
  2. 레포지토리의 도커 파일로 도커 이미지를 생성
  3. DockerHub에 업로드

git 레포지토리 생성

레포지토리를 생성 - 반드시 개인 계정이며 공개 레포지토리여야 함
시크릿 키 생성 - 키쌍으로 구성된 환경변수를 사용하여 중요한 정보를 관리한다
시크릿키 경로는 ${{환경변수명}} 형태로 사용한다
여기서는 도커 이미지 저장소 접근을 위해 사용한다
레포지토리 Settings → Secrets and Variables → Actions → New Repository secret
DOCKER_HUB_USERNAME DOCKER_HUB_PASSWORD 환경 변수를 만든다

Dockerfile 생성

# 기반 이미지
FROM openjdk:11

# COPY를 위한 경로 변수 설정
ARG JAR_FILE=build/libs/*-SNAPSHOT.jar

# 빌드된 jar파일을 도커 컨테이너의 app.jar로 복사
COPY ${JAR_FILE} app.jar

# jar 파일 실행
ENTRYPOINT ["java","-jar","/app.jar"]

설정 파일 생성

루트/.github/workflows 경로에 main.yml생성

name: Java CI with Gradle
on: 							#이벤트 트리거 조건
  push:							#push가 main 브랜치에 발생
    branches: [ main ]
jobs:							# 작업 정의
  build:						# jabs의 작업 이름
    runs-on: ubuntu-latest		# 실행 운영체제
    steps:								# 작업 단계 정의
      - uses: actions/checkout@v2		# Git 저장소의 소스 코드를 가져 옴  
      
      - name: Set up JDK 11				# 마켓플레이스 등록 작업으로 JDK 11을 설정
        uses: actions/setup-java@v2	
        with:
          java-version: '11'
          distribution: 'zulu'          
      - name: Grant execute permission for gradlew 		# gradlew에 실행권한을 부여
        run: chmod +x gradlew       
      - name: Build with Gradle 		# 프로젝트 빌드
        run: ./gradlew build        
      - name: Docker build				# 도커 이미지 빌드
        run: |
          docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }}
          docker build -t spring-cicd . 
          docker tag spring-cicd ${{ secrets.DOCKER_HUB_USERNAME }}/spring-cicd:${GITHUB_SHA::7}
          docker push ${{ secrets.DOCKER_HUB_USERNAME }}/spring-cicd:${GITHUB_SHA::7}

설정 내용
1. JDK 설정 및 점검
2. 코드를 gradle로 빌드
3. 설정된 시크릿 키로 Docker Hub에 로그인
4. Docker 이미지를 빌드
5. GitHub Actions가 SHA 값으로 tag 생성
6. 생성된 tag로 Docker Hub에 이미지를 푸시

프로젝트 push


build.gradle plain.jar 비활성화

$ echo "# My Repository" >> README.md
$ git init 
$ git add .
$ git commit -m "first commit"
$ git branch -M main # 브랜치 이름을 main으로 설정
$ git remote add origin {Github 리포지토리 url} #디렉터리를 리포지토리(origin)와 연결
$ git push -u origin main # main 브랜치를 origin으로 push

결과


설정 파일을 만든 뒤 깃허브에 push하면 자동으로 Github Actions의 workflows가 실행된다
레포지토리의 Action에서 확인 가능하다


진행 상황이 실시간으로 확인된다

이미지가 도커 허브에 잘 push되었다

GIthub Actions 다시 실행(Re-Run)하기

workflow가 중단되면 Github Actions 내에서 다시 실행할 수 있다
설정 코드 작성에 문제가 있다면 push할 필요 없이 edit을 통한 재 커밋 기능도 제공한다

second가 실패해서 3으로 다시 시도했다. 그런데 세상에 CI 실패했다고 깃헙이 메일도 보낸다;

profile
갭린이 리나

0개의 댓글