Continuous Integration
코드 변경 시 마다 자동으로 빌드하고 테스트를 수행하는 프로세스
이는 수동 빌드로 인한 인적 오류를 줄여 코드 품질을 향상시키고 빠른 피드백을 줌으로 효율성을 올려준다
빌드
실행가능한 소프트웨어, 아티팩트를 만드는 과정.
아티팩트는 바이너리파일, 라이브러리, 패키지 등의 형태로 제공된다빌드 도구
- Java - Maven, Gradle
- Python - pip, setuptools
- JavaScript - npm, yarn
- C++ - CMake, Makefile
오픈 소스 CI/CD 도구, 다양한 플러그인을 지원
호스트형 배포 자동화 서비스로 Travis 자체 호스트 플랫폼을 사용
GitHub 계정과 연동하여 쉽게 통합이 가능
GitHub와 연동, YAML 파일로 쉬운 설정이 가능
레포지토리를 생성 - 반드시 개인 계정이며 공개 레포지토리여야 함
시크릿 키 생성 - 키쌍으로 구성된 환경변수를 사용하여 중요한 정보를 관리한다
시크릿키 경로는 ${{환경변수명}} 형태로 사용한다
여기서는 도커 이미지 저장소 접근을 위해 사용한다
레포지토리 Settings → Secrets and Variables → Actions → New Repository secret
DOCKER_HUB_USERNAME DOCKER_HUB_PASSWORD 환경 변수를 만든다

# 기반 이미지
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에 이미지를 푸시

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되었다

workflow가 중단되면 Github Actions 내에서 다시 실행할 수 있다
설정 코드 작성에 문제가 있다면 push할 필요 없이 edit을 통한 재 커밋 기능도 제공한다
second가 실패해서 3으로 다시 시도했다. 그런데 세상에 CI 실패했다고 깃헙이 메일도 보낸다;
