프로젝트/Chat

github action으로 CI구현

춤추는수달 2023. 2. 8. 13:04

 

우선 이 action이 하는 일은 ChatClient와 ChatServer 프로젝트를 빌드 성공하는 것이다.

그러기 위해서 다음 단계들을 실행했다.

  1. 깃허브 레포지토리 복사하기.
  2. ServerCore.lib 을 라이브러리 디렉토리에 놓기.
  3. libprotobuf.lib 을 라이브러리 디렉토리에 놓기.
  4. Chat.sln 빌드하기.

그럼 각 단계들을 어떻게 구현했는지 알아보자.

0. 사전작업.

우선 ci.yml 파일을 만들고 몇 가지 사전작업을 했다.

main 브랜치에 push 하거나 pull request를 보내면 ci.yml을 실행하도록 했다. (사실 yml파일 만드니까 기본 세팅이었다.)

아래에서 사용할 환경변수들을 설정해주었다. 빌드 모드나 다운받을 Protobuf의 버전을 명시해 놓았다.

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

env:
  SOLUTION_FILE_PATH: .
  BUILD_CONFIGURATION: Release
  PROTOBUF_VERSION: 21.12
  
permissions:
  contents: read

1. 깃허브 레포지토리 복사하기.

이건 github action에서 checkout 이라는 action을 사용하면 바로 된다. 이 작업을 하면 windows에 Chat 소소코드가 생긴다.

checkout을 하지 않으면 내 레포지토리의 소스코드는 아무것도 없다.

  build:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v3

2. ServerCore.lib 을 라이브러리 디렉토리에 놓기.

ServerCore는 Chat에서 사용하는 라이브러리중 하나이다.(https://github.com/jidungg/GameServer)

여기서는 이 ServerCore 레포지토리에서 배포하는 ServerCore.lib을 다운받고 프로젝트의 라이브러리 디렉토리인 Libraries안에 넣어주는 작업을 한다. 그러기 위해서 blauqs/actions-download-asset 액션을 사용했다.

    - name: ServerCore Download
      uses: blauqs/actions-download-asset@v1.2
      with:
        repo: jidungg/GameServer
        version: latest
        prefix: 1.
        file: ServerCore.lib
        out: ./Libraries/ServerCore/Release/ServerCore.lib
        token: ${{ secrets.GITHUB_TOKEN }}

3. libprotobuf.lib 을 라이브러리 디렉토리에 놓기.

여기서는 위와 마찬가지로 필요한 라이브러리 파일을 생성하는 작업을 한다. 

우선 blauqs/actions-download-asset 액션을 사용해 protobuf의 코드를 가져오고,

이를 DuckSoft/extract-7z-action 액션을 사용해압축 해제한 뒤,

cmake 명령어를 통해 sln 파일을 생성하고 그 sln 파일을 빌드하고,

생성된 libprotobuf.lib 파일을  라이브러리 디렉토리에 옮겨준다.

 - name: Protobuf Download
      uses: blauqs/actions-download-asset@v1.2
      with:
        repo: protocolbuffers/protobuf
        version: ${{env.PROTOBUF_VERSION}}
        prefix: v
        file: protobuf-cpp-3.21.12.zip
        out: ../protobuf.zip
        token: ${{ secrets.GITHUB_TOKEN }}
        unpack: false
        
    - name: extract protobuf
      uses: DuckSoft/extract-7z-action@v1.0
      with:
        pathSource:  ../protobuf.zip
        pathTarget:  ../protobuf
      
    - name: Build Protobuf with CMake
      run: |
        cmake -H'../protobuf/protobuf-3.21.12/cmake' -B '../protobuf/protobuf-3.21.12/sol' 
        cmake --build  '../protobuf/protobuf-3.21.12/sol' --config ${{env.BUILD_CONFIGURATION}}
        
    - name: Move libprotobuf.lib
      run: |
        ls ../protobuf/protobuf-3.21.12/sol
        ls ../protobuf/protobuf-3.21.12/sol/${{env.BUILD_CONFIGURATION}}
        ls D:/a/Chat/Chat/Libraries/Protobuf
        mkdir D:/a/Chat/Chat/Libraries/Protobuf/${{env.BUILD_CONFIGURATION}}
        Copy-Item -Path ../protobuf/protobuf-3.21.12/sol/${{env.BUILD_CONFIGURATION}}/libprotobuf.lib -Destination D:/a/Chat/Chat/Libraries/Protobuf/${{env.BUILD_CONFIGURATION}}/libprotobuf.lib
        ls D:/a/Chat/Chat/Libraries/ServerCore/${{env.BUILD_CONFIGURATION}}
        ls D:/a/Chat/Chat/Libraries/Protobuf/${{env.BUILD_CONFIGURATION}}

4.Chat.sln 빌드하기.

visual studio를 받고 msbuild 명령어를 통해 Chat.sln을 빌드해준다.

   - name: Visual Studio shell
      # You may pin to the exact commit or the version.
      # uses: egor-tensin/vs-shell@9a932a62d05192eae18ca370155cf877eecc2202
      uses: egor-tensin/vs-shell@v2

    - name: Build solution
      run: |
        msbuild Chat.sln /p:Configuration=${{env.BUILD_CONFIGURATION}} /m

이를 통해 깃허브에 푸쉬할 때마다 자동으로 빌드 테스트를 할 수 있게 되었다.

아래는 전체 코드이다.

name: Continuous integration

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

env:
  SOLUTION_FILE_PATH: .
  BUILD_CONFIGURATION: Release
  PROTOBUF_VERSION: 21.12
  
permissions:
  contents: read

jobs:
      
  build:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v3

    - name: ServerCore Download
      uses: blauqs/actions-download-asset@v1.2
      with:
        repo: jidungg/GameServer
        version: latest
        prefix: 1.
        file: ServerCore.lib
        out: ./Libraries/ServerCore/Release/ServerCore.lib
        token: ${{ secrets.GITHUB_TOKEN }}

    - name: Protobuf Download
      uses: blauqs/actions-download-asset@v1.2
      with:
        repo: protocolbuffers/protobuf
        version: ${{env.PROTOBUF_VERSION}}
        prefix: v
        file: protobuf-cpp-3.21.12.zip
        out: ../protobuf.zip
        token: ${{ secrets.GITHUB_TOKEN }}
        unpack: false
        
    - name: extract protobuf
      uses: DuckSoft/extract-7z-action@v1.0
      with:
        pathSource:  ../protobuf.zip
        pathTarget:  ../protobuf
      
    - name: Build Protobuf with CMake
      run: |
        cmake -H'../protobuf/protobuf-3.21.12/cmake' -B '../protobuf/protobuf-3.21.12/sol' 
        cmake --build  '../protobuf/protobuf-3.21.12/sol' --config ${{env.BUILD_CONFIGURATION}}
        
    - name: Move libprotobuf.lib
      run: |
        ls ../protobuf/protobuf-3.21.12/sol
        ls ../protobuf/protobuf-3.21.12/sol/${{env.BUILD_CONFIGURATION}}
        ls D:/a/Chat/Chat/Libraries/Protobuf
        mkdir D:/a/Chat/Chat/Libraries/Protobuf/${{env.BUILD_CONFIGURATION}}
        Copy-Item -Path ../protobuf/protobuf-3.21.12/sol/${{env.BUILD_CONFIGURATION}}/libprotobuf.lib -Destination D:/a/Chat/Chat/Libraries/Protobuf/${{env.BUILD_CONFIGURATION}}/libprotobuf.lib
        ls D:/a/Chat/Chat/Libraries/ServerCore/${{env.BUILD_CONFIGURATION}}
        ls D:/a/Chat/Chat/Libraries/Protobuf/${{env.BUILD_CONFIGURATION}}
        
    - name: Visual Studio shell
      # You may pin to the exact commit or the version.
      # uses: egor-tensin/vs-shell@9a932a62d05192eae18ca370155cf877eecc2202
      uses: egor-tensin/vs-shell@v2

    - name: Build solution
      run: |
        msbuild Chat.sln /p:Configuration=${{env.BUILD_CONFIGURATION}} /m

 

이거 하려고 대략 3일정도 박치기 한듯..

'프로젝트 > Chat' 카테고리의 다른 글

Chat  (0) 2023.02.14