문서정보 : 2023.05.09. ~ 05.10. 작성, 작성자 @SAgiKPJH
C#으로 구성한 sln을 CI/CD를 통해 자동 빌드 및 테스트 하여 배포하는 테스트를 만든다.
❌ 기본적인 내용으로만 이루어져 있으며, 처음 CI/CD 구현을 시도해보는 초점에서 구성한 내용입니다.
- : 0. CI/CD?
- : 1. 목표 선정
- : 2. 프로젝트 구성
- : 3. YAML 구성
- : 4. Build & Deploy Test
- CI/CD는 소프트웨어의 개발, 테스트와 배포를 모두 통합함으로써 소프트웨어 버그를 쉽게 찾아낼 수 있으며, 더 빠른 배포 주기를 가질 수 있게 만들어 준다.
- CI는 빌드/테스트 자동화 과정
- CD는 배포 자동화 과정
- CI/CD 기대 효과
- 반복적 작업 (빌드, 테스트 및 배포)를 자동 처리 할 수 있다.
- 문제가 있을 때, 경고를 받을 수 있다.
- 빠르게 사용자에게 배포파일을 제공할 수 있다.
- 참조
- 다음 조건을 만족한다.
- Visual Studio를 통해 C# sln 파일을 만든다.
- C# Test 프로젝트를 구성한다.
- 특정 브랜치에 Commit 될 때 CICD가 동작한다.
- CICD를 통해 자동 빌드 및 Test를 진행한다.
- 문제가 없으면 자동 배포된다.
- 기본적인 빌드 Test 후 Release
- Main 브랜치가 존재합니다.
- Main 브랜치에 "Release v0.0.0"으로 특정 규칙에 맞도록 Commit을 합니다.
- Main Repository 안에 존재하는 sln파일을 빌드합니다.
- Unit Test Project도 Test 합니다.
- 결과 문제 없으면 기입한 Tag에 맞춰서 Release를 진행합니다.
- 실제 상황을 토대로 구성한 Release
- Main 브랜치와 Develop 브랜치가 존재합니다.
- Main 브랜치는 Release 전용이고, Develop 브랜치는 개발 전용입니다.
- Develop에서 개발 후 "Relese v0.0.0"으로 특정 규칙에 맞도록 Commit 합니다.
- Develop Repository 안에 존재하는 sln파일을 빌드합니다.
- Unit Test Project도 Test 합니다.
- 결과 문제 없으면 Main 브랜치에 정해진 특정 파일(dll, exe 파일 따위)를 배포합니다.
- Main 브랜치와 Develop 브랜치가 존재합니다.
- 다양하게 CICD를 구성해볼 수 있는데, 여기서는 1번 방법을 활용해봅니다.
- 다음을 만족하는 프로젝트를 구성한다.
- C# 코드로 작성된 프로젝트
- .NET Framework Version : 4.7
- C# 코드에 대한 Unit Test 프로젝트
- xUnit, FluentAssertions 를 활용
- 간단한 프로젝트이어야 한다.
- CI/CD는 별도의 환경에서 진행이 됩니다.
- Window 환경에선 PowerShell을 통해 Build / Test를 CLI로 구성할 수 있습니다.
# 솔루션 빌드 docker build project.sln # 현재 폴더에 존재하면 생략 가능 docker build # Test dotnet test project.csproj
- CI/CD는 yml(YAML)을 통해 구성할 수 있다.
- GitHub의 경우 Repositiry의
Actions
탭에 들어가 구성하거나, .yml 파일을.github/workflows
안에 구성합니다.
- CICD를 다음과 같이 구성한다.
- window 환경을 사용하기에, 명령어를 Powershell에 맞게 구성한다.
name: Build and Deploy Test on: push: branches: - 'main' jobs: build: runs-on: windows-latest # 실행할 runner 환경 지정 steps: - name: Checkout code uses: actions/checkout@v2 - name: Setup .NET uses: actions/setup-dotnet@v1 - name: Merge commit message run: | git log -1 --pretty=%B > message.txt echo "::set-output name=message::$(Get-Content message.txt)" id: merge_message # 최신 커밋 메시지를 추출하고 output 변수에 저장합니다. - name: Build and Test if: startsWith(steps.merge_message.outputs.message, 'Release') run: | cd CSharpTest dotnet build CSharpTest.sln dotnet test ./UnitTestProject1/UnitTestProject1.csproj # 'Release'로 시작하는 커밋 메시지를 가진 경우에만 빌드 및 테스트를 수행합니다. - name: Get Release Version if: startsWith(steps.merge_message.outputs.message, 'Release') && job.status == 'success' run: | echo "::set-output name=version::$(("${{steps.merge_message.outputs.message}}" -replace 'Release ', ''))" id: extract_release_version # 'Release'로 시작하는 커밋 메시지를 가지고 성공적으로 빌드되었을 때, 버전 정보를 추출하여 output 변수에 저장합니다. - name: Create release tag if: startsWith(steps.merge_message.outputs.message, 'Release') && job.status == 'success' uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ steps.extract_release_version.outputs.version }} release_name: Release ${{ steps.extract_release_version.outputs.version }} v${{ github.run_number }} body: ${{ steps.merge_message.outputs.message }} draft: false prerelease: false # 'Release'로 시작하는 커밋 메시지를 가지고 성공적으로 빌드되었을 때, GitHub에 릴리즈 태그를 생성합니다.