CI/CD

Github Action

uuuhhh 2022. 11. 12. 13:39

▪︎ Git Repo 만들기


  • SpringBoot로 “hello” GET 요청이 들어오면 “Hello World!” 문자열을 반환하는 아아아주 간단한 애플리케이션 구현

 

  • Intellij에서 Github Commit 해보기
    • Help → Find Action..
    mac 단축기 ‘command + shift + a’ 라는데 이상한 terminal만 뜸..

 

  • 그리고 만들고자 하는 Repo 이름 적고 설명 적고 ‘Share’로 동기화한 후에 Commit 하고자 하는 폴더 지정 후에 ‘Commit’!

 

 

▪︎ Github Action 구성해보기


  • 깃허브 레포의 Action - Java with Maven

 

  • maven.yml 작성
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: <https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven>

name: Java CI with Maven

on:
  push:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Set up JDK 17
      uses: actions/setup-java@v1
      with:
        java-version: 17
        
    - name: Build with Maven
      run: mvn -B package --file pom.xml -DskipTests
      
    - name: Set up QEMU
      uses: docker/setup-qemu-action@v1
      
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1
      
    - name: Login to DockerHub
      uses: docker/login-action@v1 
      with:
        username: ${{ secrets.USERNAME }}
        password: ${{ secrets.PASSWORD }}
        
    - name: Build and push
      env:
        NAME: uh2959
        REPO: cn-action
      run: |
        docker build -t $REPO .
        docker tag $REPO:latest $NAME/$REPO:latest
        docker push $NAME/$REPO:latest

 

  • 도커 허브 계정 같은 민감한 정보인 경우 하드코딩의 보안 취약점을 보완하기 위해 github의 secrets로 설정하여 인자 값 전달\

 

  • 그리고 start commit

 

  • 가보자 가보자!!

  • …는 실패의 연속
  • 보이십니까.. 연속된 빨간불..
  • 울고 싶었습니다..🥲 아니 울었습니다

 

  • 그래도 불굴의 의지🔥를 가지고..

 

  • 결국 초록불 성공!!!

 

  • 위 과정의 트러블 슈팅은 맨 마지막에서 →→

 

  • 도커 허브에 정상적으로 Push 되었는지도 확인!!

 

▪︎ 소스코드 수정 커밋 발생 시 자동 빌드 확인


  • HelloController.java에서 Get 메소드의 “Hello World!”“Hello the new World!” 로 수정

 

  • Commit → Push

 

  • 자동 빌드 확인

 

  • 성공!!

 

▪︎ 트러블 슈팅


 

▪︎ 아 물론 야믈파일 작성 잘못


  • Workflow
→ Github repo의 ‘master’ 브랜치에 무언가 push가 된다면
→ 스프링 부트 애플리케이션을 jar 파일로 maven 빌드하고
→ jar 파일을 도커 image로 빌드하고
→ docker hub에 push 한다.

    를 Github Action에 yaml 파일로 정의를 하여 자동화를 구현한다.

 

  • maven.yml
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: <https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven>

name: Java CI with Maven

on:
  push:
    branches: [ master ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Set up JDK 17
      uses: actions/setup-java@v1
      with:
        java-version: 17
        
    - name: Build with Maven
      run: mvn -B package --file pom.xml -DskipTests
      
    - name: Set up QEMU
      uses: docker/setup-qemu-action@v1
      
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1
      
    - name: Login to DockerHub
      uses: docker/login-action@v1 
      with:
        username: ${{ secrets.USERNAME }}
        password: ${{ secrets.PASSWORD }}
        
    - name: Build and push
      env:
        NAME: uh2959
        REPO: cn-action
      run: |
        docker build -t $REPO .
        docker tag $REPO:latest $NAME/$REPO:latest
        docker push $NAME/$REPO:latest

 

  • 템플릿 라인별 해석
    • name : action의 이름 정의 (workflow의 이름) / 명령어 이름
    • on : workflow의 이벤트 방식을 정의 (push, MR, PR 이벤트 등등..)
    • jobs : 단계적인 job을 정의
      • 여러 가지를 정의할 시 수평적(parallel)으로 동작
      • need를 명시하면 순차적으로 수행
    • build : job의 이름
    • runs-on : job을 실행할 환경 (windows, mac, ubuntu..)
    • steps : job의 명령 집합
    • uses : 또 다른 템플릿의 action 호출
    • run : 실행할 명령어 라인

 

 

▪︎ Dockerfile 미작성 - 왜 만들지 않았을까..


  • Dockerfile
FROM openjdk:15.0.2
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","app.jar"]