우선 이 action이 하는 일은 ChatClient와 ChatServer 프로젝트를 빌드 성공하는 것이다.
그러기 위해서 다음 단계들을 실행했다.
- 깃허브 레포지토리 복사하기.
- ServerCore.lib 을 라이브러리 디렉토리에 놓기.
- libprotobuf.lib 을 라이브러리 디렉토리에 놓기.
- 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일정도 박치기 한듯..