[CI/CD] Github Actions - workflow, slack연동

KSang·2024년 5월 10일
0

TIL

목록 보기
100/101
post-thumbnail

원활한 협업을 위해 CI/CD 파이프 라인을 사용해보자

CI/CD란?

  • CI(Continuous Integration) 지속적인 통합
  • CD(Continuous Deployment) 지속적인 배포

배포를 할때 프로세스를 확인해보면 빌드> 테스트> 배포

이렇게 3단계를 거친다.

배포를 자주 해야한다거나 배포 프로세스가 복잡한 경우 일일히 하기 번거롭고 실수할 수도 있다.

그렇기 때문에 CI/CD를 통해 그 과정들을 자동화 해둔다면 개발자는 개발에만 신경쓰면 된다.

Github Actions

깃헙에선 이러한 기능을 도와주는 기능이 있는데, 레포지토리에 들어가서 Actions를 들어가면 workflow를 생성할 수 있다.

안드로이드 개발자니 안드로이드용 workflow를 검색해서 사용하자

configure를 하면

name: Android CI

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

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
        cache: gradle

    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Build with Gradle
      run: ./gradlew build

다음과 같이 구성되어있는 .yml파일을 받을 수 있다.

하나하나 무슨기능인지 보자

우선 name, Actions 탭에 들어가서 좌측을 보면 Actions 목록이 있는데,

거기서 나타낼 워크플로우의 이름이다.

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

이 코드는 master 브랜치에 Push를 했을때 혹은 PR했을때 워크플로우를 실행 시킨다.

jobs:
build:
는 워크플로우가 실행되면 수행할 기능들을 적어둔다.

runs-on: ubuntu-latest 를 사용해 운분투 최신버전의 GitHub Actions 러너에서 워크플로우를 실행한다.

steps에서 단계별로 워크플로우의 실행 단계들을 정의한다.

  • uses: actions/checkout@v4 액션은 GitHub저장소에서 코드를 체크아웃한다.
- name: set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
        cache: gradle

set up JDK 11 단계에서 Java 11 JDK를 설치한다.

Java 배포판을 Eclipse Temurin으로 지정하고

gradle 종속성 캐싱을 활성화한다. 이를 통해 후속 빌드를 실행 할때 종속성 다운로드 시간을 단축할 수 있다.

    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Build with Gradle
      run: ./gradlew build

Grant execute permission for gradlew 단계에서는 build를 하기위한 권한을 부여한다.(gradlew)

그 후 Build with Gradle 단계에서 ./gradlew build 명령을 실행

Gradle의 빌드를 수행한다.

이전에 만든 이미지 검색 프로젝트에 CI를 추가해보았다.
https://github.com/Guri999/RaffitCompose

name: Raffit CI

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

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: set up JDK 22
      uses: actions/setup-java@v3
      with:
        java-version: '22'
        distribution: 'temurin'
        cache: gradle

    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Create local.properties
      run: echo "sdk.dir=$ANDROID_HOME" > local.properties
    - name: Prepare local.properties
      run: echo "REST_API_KEY=${{ secrets.REST_API_KEY }}" >> local.properties
  
      
    - name: Build with Gradle
      run: ./gradlew build

dev 브랜치에 push or pr을 하면 워크플로우가 자동으로 수행된다.

JDK는 22버전을 사용했다.

Create local.properties라는 단계를 추가했는데, API 키 관리때문에 추가하게 되었다.

프로젝트에서 API키를 local.properties에 넣어 관리해, git에는 ignore처리되어 저장되지 않는다.

기존에 키를 관리하던 방식

local.propeties
sdk.dir=A\:\\Appdata\\Local\\Android\\Sdk
REST_API_KEY = "키값#$#$#"
gradle
import java.util.Properties
...
val properties = Properties()
properties.load(project.rootProject.file("local.properties").inputStream())

android {
    namespace = "com.guri.raffitcompose.remote"

    defaultConfig {
        buildConfigField ("String", "REST_API_KEY", properties.getProperty("REST_API_KEY"))
    }
}

local.properties가 없기 때문에 키값을 받을 수 없고, 빌드 에러로 이루어진다.

그렇기 때문에 workflow에서 local.properties를 생성해주었다.

생성만 해주면 안된다. REST_API_KEY 값을 넣어줘야한다.

근데, 이런 키값을 아무대서나 입력받으면 보안적인 문제가 있다.

그렇기 때문에 git의 secret기능을 이용한다.

워크플로를 설정한 repo의 Setting에 들어가면 Secrets and variables 탭이 있다.

거기서 Actions로 들어가면 repository의 secret을 추가 할 수 있다.

이때 주의해야할 점이 있는대

키의 이름을 적어주고 키 값을 적을때

\ 이탈자를 넣어서 작성해야한다. 이거 땜에 개고생했다.

그런 다음 워크플로에서 만든 local.properties에 키값을 넣어줘야 한다.

run: echo "REST_API_KEY=${{ secrets.REST_API_KEY }}" >> local.properties

여기서 secrets.시크릿키이름 으로 저장된 키값을 주입해준다.

그 뒤 워크플로를 레포지토리에 저장해두면, dev브랜치에 push혹은 pr이벤트가 발생할때마다 워크플로가 실행되 빌드가 잘되는지 검사한다.

테스트 또한 실행 시킬 수 있다.


    - name: Run Android Test
      uses: reactivecircus/android-emulator-runner@v2
      with:
        api-level: 28
        target: default
        arch: x86
        script: ./gradlew connectedCheck --stacktrace
        run: ./gradlew connectedAndroidTest

    - name: Assemble
      run: ./gradlew assemble

androidTest또 한 자동화가 가능하다.

배포 또한 자동화가 가능한데,

    - name: Upload Debug APK
      uses: actions/upload-artifact@v3
      with:
        name: debug
        path: ./app/build/outputs/apk/debug/app-debug.apk

    - name: Upload Release APK
      uses: actions/upload-artifact@v3
      with:
       name: release
       path: ./app/build/outputs/apk/release/app-release-unsigned.apk

디버그 apk와 releas apk를 얻을 수 있다.

main or master 브랜치에 pr할때 workflow로 설정해주면 좋을 듯 하다.

Slack 연동

Git에 issues, pulls, commits, releases, deployments 같은 이벤트들을 Slack으로 알림 줄수가 있다.


슬랙에서 자동화 -> 앱추가를통해

깃 허브 앱을 추가해준다.

slack에 연결이 되면 원하는 채널에 들어가서 프로젝트의 repo랑 연결시켜줄수 있다.


농식품-공공데이터란 채널을 만들었는데, 비공개 채널이다.

/invite @GitHub를 메시지 창에 입력 해서 채널에 깃헙을 추가해준다.

그런 뒤 /github subscribe owner/repo 원하는 레포를 구독시켜준다.

여기서 권한을 주면 깃헙에 이벤트가 발생할때마다 슬랙에 알림을 준다.

0개의 댓글