Notice
Recent Posts
Recent Comments
Link
반응형
관리 메뉴

쿵야지식떨이

GitHub Actions 적용 (2) - GitHub Actions CI/CD 스크립트 본문

Infra

GitHub Actions 적용 (2) - GitHub Actions CI/CD 스크립트

김쿵야 2024. 2. 21. 16:10
반응형

 

GitHub Actions 가 정상적으로 작동하게 스크립트를 작성해야 한다.

CI/CD 스크립트 작성 과정

1. 프로젝트에 yml 파일 생성

  • 프로젝트 root 경로에 ./github/workflows 디렉토리를 만들고 cicd.yml 파일을 생성한다.
    • 파일 이름은 cicd.yml은 예시일 뿐 이름은 상관없다!

2. yml 파일 안에 스크립트 작성

#github repo Actions 이름
name: CI/CD

on:
  push:
    branches: ["develop"]
  pull_request:
    branches: ["develop"]

permissions: write-all

jobs:
  build-and-deploy:
  # ubuntu 최신버전에서 실행
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          token: ${{ secrets.CHECKOUT_TOKEN }}
          submodules: true
          # 자바 버전설정
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: 'gradle'
      - name: Add permission for gradlew
        run: chmod +x gradlew

      - name: Build with Gradle
        uses: gradle/gradle-build-action@v2
        with:
          arguments: build -x test

      - name: Docker build & push to docker repo
        run: |
          docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
          docker build -f Dockerfile -t ${{ secrets.DOCKER_REPO }}/directors-dev .
          docker push ${{ secrets.DOCKER_REPO }}/directors-dev

      - name: Deploy to server
        uses: appleboy/ssh-action@master
        id: deploy
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.EC2_PEMKEY }}
          envs: GITHUB_SHA
          script: |
            sudo docker stop spring-server-container
            sudo docker rm spring-server-container
            sudo docker pull ${{ secrets.DOCKER_REPO }}/directors-dev
            sudo docker run --name spring-server-container -d -p 8081:8081 gummymurderer/directors-dev
            sudo docker image prune -f

 

1. name

name: CI/CD
  • github repository의 actions 탭에 노출되는 workflow의 이름

2. on

on:
  push:
    branches: ["develop"]
  pull_request:
    branches: ["develop"]
  • workflow 파일을 자동으로 트리거하는 이벤트를 명시한다.
  • push 이벤트를 명시하면 main 브랜치에 push가 일어나면 해당 event가 실행된다.
  • 특정한 브랜치나 tag, path에서만 실행되도록 할 수도 있다.
  • branches : 에 특정 브랜치를 입력하면 된다.
  • path로 특정 패턴을 설정하여 해당 패턴에 일치하는 파일이 변경되었을 때 workflow가 실행되도록 설정할 수도 있다.
  • !paths나 paths-ignore를 사용하여 무시할 패턴을 설정할 수도 있다.

3. jobs

jobs:
  build-and-deploy:
  # ubuntu 최신버전에서 실행
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          token: ${{ secrets.CHECKOUT_TOKEN }}
          submodules: true
          # 자바 버전설정
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: 'gradle'
      - name: Add permission for gradlew
        run: chmod +x gradlew

      - name: Build with Gradle
        uses: gradle/gradle-build-action@v2
        with:
          arguments: build -x test

      - name: Docker build & push to docker repo
        run: |
          docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
          docker build -f Dockerfile -t ${{ secrets.DOCKER_REPO }}/directors-dev .
          docker push ${{ secrets.DOCKER_REPO }}/directors-dev

      - name: Deploy to server
        uses: appleboy/ssh-action@master
        id: deploy
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.EC2_PEMKEY }}
          envs: GITHUB_SHA
          script: |
            sudo docker stop spring-server-container
            sudo docker rm spring-server-container
            sudo docker pull ${{ secrets.DOCKER_REPO }}/directors-dev
            sudo docker run --name spring-server-container -d -p 8081:8081 gummymurderer/directors-dev
            sudo docker image prune -f
  • workflow는 다양한 job으로 구성되며 job은 steps로 구성된다.
  • job에서는 수행할 작업을 작성하면 된다.
  • job에 들어갈 수 있는 정보
    • runs-on : 해당 job을 어떤 OS에서 실행할 것인지 명시
    • steps : job이 가질 수 있는 동작의 나열. 각각의 step은 독립적인 프로세스를 가진다. 
      • uses : 해당 step에서 사용할 액션. GitHub 마켓 플레이스에 올라온 action들을 사용할 수도 있다. 
      • name : step의 이름
      • run : job에 할당된 컴퓨팅 자원의 shell을 이용하여 커맨드 라인을 실행한다. node.js 프로젝트의 경우, 이 과정에서 npm package의 scripts를 구동할 수 있다. 
    • env : 해당 job에서 사용할 환경 변수를 key-value 형태로 설정한다.
    • strategy : 여러 환경에서의 테스트/배포를 위해 빌드 matrix를 구성한다. 
    • with : 해당 action에 의해 정의되는 input 파라미터. key-value 페어로 되어 있다. input 파라미터는 환경 변수로 설정되고 'INPUT_' 이라는 prefix가 붙는다. 
    • token : repo를 가져오는 데 사용될 액세스 토큰
    • submodules : true : 하위 모듈을 체크하겠다는 의미

4. Github Actions에서 사용될 JDK 세팅

 # 자바 버전설정
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: 'gradle'
      - name: Add permission for gradlew
        run: chmod +x gradlew
  • 위 코드에서는 JDK 17을 사용 중
  • distribution으로 temurin을 사용
    • distribution: 'temurin'는 자바 배포판을 지정하는 부분이다.
    • temurin은 AdoptOpenJDK 프로젝트가 Eclipse Foundation에 합류하여 변경된 이름이다.
    • 이 프로젝트는 커뮤니티 기반으로 운영되는 OpenJDK 빌드를 제공한다.
    • OpenJDK는 자바 플랫폼의 오픈소스 구현체를 말하며, Adoptium(Temurin)은 이 OpenJDK를 빌드하여 제공하는 프로젝트 중 하나이다.
  • JDK 배포판을 temurin로 지정
  • cache : 'gradle' : Gradle 빌드 캐시를 사용하도록 설정

5. Docker build 및 push

 - name: Docker build & push to docker repo
        run: |
          docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
          docker build -f Dockerfile -t ${{ secrets.DOCKER_REPO }}/directors-dev .
          docker push ${{ secrets.DOCKER_REPO }}/directors-dev

 

 

주의 사항❗❗

1. GitHub Actions 작업이 잘 되지 않을 때

  • gradle build 시 springBoot 2.5 버전 이후로는 jar 파일이 2개가 생겨 Github Actions 작업이 제대로 작동하지 않는다.
  • 따라서 build.gradle에 아래와 같이 추가해야 한다.
jar {
  enabled = false
}

 

2. 환경 변수 처리

  • 스크립트를 보면 jobs 중간중간에 '$' 처리되어 있는 환경 변수들이 있다.
  • 해당 변수들의 실제 값은 GitHub Main 프로젝트의 settings → Secrets and variables → Actions → New repository secret 에 넣어두면 된다. 
💡 한 번 작성해서 넣고 수정하기 위해 누르면 이전에 작성했던 값들이 전혀 보이지 않게 된다.

    즉, 기존에 작성했던 부분 중 특정 부분만 드래그 해서 변경하거나 기존 내용을 복사 할 수 없으니
    처음부터 다시 입력하거나 아예 삭제하고 다시 만들어야 한다 

  • CHECKOUT_TOKEN : 액세스 토큰
  • DOCKER_USER : Docker Hub ID
  • DOCKER_PASSWORD : Docker Hub Password
  • EC2_HOST : 퍼블릭 IPv4 DNS 주소
  • EC2_KEY : EC2 pem 파일에 있는 내용 전부

 

  • Access Token 확인 방법
    • GitHub 페이지 우측 상단 프로필 사진 → Settings → Developer Settings → Personal access tokens → Tokens
    • 신규 발급이라면?
      • Generate new token → Generat new token(classic)
      • Note에는 토큰 이름, 설명을 적어주면 된다.
      • Expiration은 만료 기간인데 보안을 위해서는 지정하는 게 좋지만 expiration(만료되지 않음)으로 해도 괜찮다.(custom으로 지정하는 것도 가능)
      • Select scopes는 해당 토큰으로 접근할 수 있는 것을 체크해 주면 된다.
      • 완료 후에는 Generate token을 누르면 된다. 
    • github Actions를 진행하기 위해서는 Select scopes에서 workflow는 무조건 체크해줘야 한다!
      (repo는 체크되어 있다는 전제. 만약 repo가 체크 안 되어 있다면 이것도 체크 필수!!)
💡 생성된 토큰은 페이지를 벗어나는 순간 다시는 확인 할 수 없기 때문에 무조건 바로 복사해서 저장해두어야 한다.

    생각보다 토큰을 쓰는 곳이 많기 때문에 잊어버렸다면 슬프지만 다시 만들어야 한다..

 

반응형