티스토리 뷰
fastlane 설치와 작동법에 이어서 GitHub Actions에 대해 알아보자.
[Swift] - fastlane + GitHub Actions CI 구축(1)
📖 목차1. CI가 무엇인가2. 왜 fastlane + GitHub Actions를 사용하는가3. fastlane 설치 및 실행 1. CI가 무엇인가 CI(Continuous Integration)란 무엇인가? CI는 "지속적인 통합"을 의미한다. 처음에는 여러 개
steelbeartaeng2.tistory.com
📖 목차
1. GitHub Actions에 대해 알아보기
2. GitHub Actions 구현해보기
3. 프로젝트에 적용 및 오류 해결
이 포스팅은 오류 발생으로 인해 해결하지 못한 상태입니다,,
1. GitHub Actions에 대해 알아보기
이전 포스팅에서 GitHub Actions는 GitHub에서 제공하는 CI/CD 도구로, 코드를 자동으로 빌드, 테스트, 배포하는 프로세스라고 설명했다. 설정은 YML 파일로 작성하며, 이 파일은 repo의 .github/workflows/ 디렉토리에 저장된다.
GitHub Actions는 워크플로(Workflow)라는 단위를 통해 자동화된 작업을 실행하고, 이러한 동작은 repo에서 특정 이벤트가 발생할 때 트리거(Trigger)된다고 한다.
그래서 workflow가 뭐고, GitHub Actions이 언제 실행된다는 건데??

GitHub Actions는 다음 순서로 실행된다:
- 이벤트 발생 (Triggering Events)
- GitHub 레포지토리에서 정의된 특정 이벤트(예: 코드 푸시, PR 생성 등)가 발생하면 GitHub Actions가 트리거된다.
- YML 파일에 on: 키워드를 사용하여 트리거 조건을 정의한다.
- 워크플로 파일 로드 (Workflow File)
- .github/workflows/ 디렉토리에 저장된 YML 파일을 읽고, 설정된 작업(Job)을 실행한다.
- 작업(Job) 실행
- jobs: 아래에 정의된 각 작업(Job)이 순서대로 또는 병렬로 실행된다.
- 각 작업은 정의된 환경에서 독립적으로 실행된다.
- 작업 단계(Step) 실행
- steps: 아래에 정의된 명령어나 액션이 단계별로 순차 실행된다.
Triggering Events => GitHub Actions는 특정 이벤트(예: 코드 푸시, PR 생성) 발생 시 실행된다.
Workflow => 실행할 작업(Job)과 단계(Step)를 정의한 것이 바로 워크플로 파일이다.
이 두가지를 이해했다면 GitHub Actions의 기본 원리를 파악했다고 볼 수 있다!
yml 코드에서 사용하는 구성요소
yml 코드에서 사용하는 구성요소를 알아보자.
- on: 이벤트를 정의하여 어떤 상황에서 GitHub Actions가 실행될지를 결정
- jobs: 워크플로의 작업 그룹을 정의.
- build: 특정 작업의 이름.
- runs-on: 작업이 실행될 환경 지정.
- steps: 작업 내에서 수행할 단계 정의.
- needs: 작업 간의 의존성 설정.
- defaults: 기본 실행 설정.
자세하게 더 알고 싶다면 참고하면 좋을 것 같다.
GitHub Actions 설명서 - GitHub Docs
GitHub Actions를 사용하여 리포지토리에서 바로 소프트웨어 개발 워크플로를 자동화, 사용자 지정 및 실행합니다. CI/CD를 포함하여 원하는 작업을 수행하기 위한 작업을 검색, 생성 및 공유하고 완
docs.github.com
2. GitHub Actions 구현해보기
간단하게 테스트 해보기 위해서 현재 프로젝트가 아닌 repo를 하나 만들어서 yml 코드를 작성하고 깃헙 액션이 잘 동작하는지 확인해봤다. 현재 프로젝트에 바로 적용하기엔 위험이 있다보니 repo를 만들어서 테스트하고 적용해보려고 했다.
내가 깃헙 액션 동작하기 위한 조건은 다음과 같다.
- PR(Pull Request)을 생성하면 GitHub Actions가 실행될 것.
- PR 상태에서 추가로 코드가 푸시(Push)될 때도 GitHub Actions가 실행될 것.
GitHub Actions 동작 테스트 yml 작성
간단하게 테스트 해보기 위함이라서 ruby와 fastlane을 설치할 필요는 없지만 잘 동작하는지 확인하기 위해 넣었다.
# workflow 이름
name: test-CI
# workflow가 언제 실행될지에 대한 설명(When)
on:
# main 브랜치에 pr을 올리는 경우(main 브랜치에서 분기한 브랜치도 실행된다.)
pull_request:
branches:
- 'main'
# workflow가 어떻게 실행될지에 대한 설명(How)
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
# ruby 설치
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7
# fastlane 설치
- name: Install Fastlane
run: brew install fastlane
- name: Run a one-line script
run: echo Hello, world!!!!!!!!!!!!!!!!!
- jobs: 작업 그룹을 정의하며, 각 작업(Job)은 독립적으로 실행된다.
- steps: 작업(Job) 내에서 실행되는 개별 단계들을 정의하며, 순차적으로 실행된다.
- name: 각 단계의 식별자 역할을 하며, 로그에서 쉽게 확인할 수 있도록 이름을 붙인다.
- run: 각 단계에서 실행할 코드를 의미한다.
✏️ fastlane과 ruby를 GitHub 환경에 설치하는 이유
로컬에서 fastlane을 설치하면 Fastlane 스크립트를 실행할 수 있다. 하지만 GitHub repo에는 fastlane 자체가 올라가지 않고 스크립트만 repo에 올라간다.
GitHub Actions에서 실행되는 코드는 GitHub 서버에서 실행되므로, Fastlane이 GitHub 환경에 설치되어 있어야 한다.
=> 따라서 GitHub Actions에서 Fastlane 스크립트를 실행하려면, Fastlane과 Ruby를 GitHub 환경에 설치해주어야 한다.
이렇게 구현한 후 yml 코드를 push 하니까 아래와 같은 오류가 발생했다.
깃헙에서 Personal Access Token을 발급받을 때 workflow를 허용하지 않았던게 문제였다.
workflow 옵션을 허용해주니 오류는 해결되었다.
이제 pr을 올린 후 깃헙 액션이 실행되고 yml에 명시된대로 작업들이 순서대로 잘 실행되는 걸 알 수 있다.
그리고 pr을 올린 상태에서 계속 push를 할때마다 깃헙액션이 잘 실행된다.
이제 깃헙 액션이 잘 실행되는걸 확인했으니 프로젝트에 적용해보자.
3. 프로젝트에 적용 및 오류 해결
로컬에서 fastlane tests를 실행해보면 테스트 코드가 잘 작동되는 걸 확인했고, 깃헙 액션도 원하는 경우에 잘 실행되는 걸 확인했으니 이제 프로젝트에 적용해보자.
다시 yml 코드를 작성해보자.
# workflow 이름
name: test-CI
# workflow가 언제 실행될지에 대한 설명(When)
on:
# dev 브랜치에 pr을 올리는 경우(main 브랜치에서 분기한 브랜치도 실행된다.)
pull_request:
branches:
- 'dev'
# workflow가 어떻게 실행될지에 대한 설명(How)
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
# ruby 설치
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.7
# fastlane 설치
- name: Install Fastlane
run: brew install fastlane
- name: fastlane tests run
run: fastlane tests
위에서 작성한 yml 코드에 fastlane tests로 테스트 코드 실행하는 로직을 추가하여 push해보았다.
깃헙액션은 잘 작동하는데 오류가 발생했다,,,!!
[!] Could not retrieve response as fastlane runs in non-interactive mode 이런 오류가 발생했는데,,, 해결하기 어려웠다.
[!] Could not retrieve response as fastlane runs in non-interactive mode 오류 해결하기 위한 시도
1️⃣ env 파일 추가 (실패)
오류를 해결하기 위해 env 파일을 추가하고, Gemfile에 teamId 등을 추가한 후 다시 Push했다.
하지만 여전히 오류가 해결되지 않았다...
2️⃣ YML 수정
actions/checkout@v2는 기본적으로 레포지토리 root를 체크아웃한다고 한다.
그래서 Fastfile이 프로젝트의 root에 있어야만 GitHub Actions에서 이를 인식할 수 있다는 뜻!!
만약 Fastfile이 특정 하위 디렉토리에 있다면, 해당 디렉토리를 working-directory 옵션을 통해 지정해야 한다.
내 프로젝트에서도 Fastfile이 하위 디렉토리에 있어서 working-directory 옵션을 사용해 문제를 해결할 수 있었다 ㅎㅎ
# workflow 이름
name: test-CI
# workflow가 언제 실행될지에 대한 설명(When)
on:
# main 브랜치에 pr을 올리는 경우(main 브랜치에서 분기한 브랜치도 실행된다.)
pull_request:
branches:
- 'dev'
# workflow가 어떻게 실행될지에 대한 설명(How)
jobs:
build: # 빌드 및 테스트 작업 정의
runs-on: macos-latest # macOS 환경에서 워크플로 실행 (iOS 프로젝트를 위해 macOS 필요)
defaults:
run:
working-directory: ./pennyway-client-iOS # 작업 디렉토리를 fastlane이 포함된 iOS 프로젝트 폴더로 설정
steps:
- uses: actions/checkout@v2 # 리포지토리 코드를 현재 작업 디렉토리로 체크아웃
- uses: ruby/setup-ruby@v1 # Ruby 환경 설정
with:
ruby-version: 2.7 # 프로젝트에서 사용할 Ruby 버전 명시
- name: Install Bundler # Ruby 의존성 관리 도구(Bundler) 설치
run: gem install bundler -v 2.4.22
- name: Install Fastlane # Fastlane 설치 (iOS CI/CD를 위한 도구)
run: brew install fastlane
- name: Verify Fastlane Installation # Fastlane이 제대로 설치되었는지 확인
run: fastlane --version
- name: Install dependencies # Gemfile에 정의된 Ruby 의존성 설치
run: bundle _2.4.22_ install
- name: Run tests with Fastlane # Fastlane을 사용해 테스트 실행
run: bundle exec fastlane tests
그리고 Fastlane과 같은 도구는 여러 외부 라이브러리에 의존하고 있기 때문에, 이를 제대로 설치하고 관리하기 위해서는 Bundler가 필요하다고 한다. Gemfile에 정의된 의존성들이 제대로 설치되지 않으면, Fastlane이 제대로 동작하지 않거나 다른 의존성 문제가 발생할 수 있기 때문이다.
=> 즉, Bundler 설치와 Gemfile 의존성 설치는 프로젝트에서 필요한 라이브러리들을 정확한 버전으로 관리하고 설치하는 중요한 과정이다!!
xcconfig 파일 오류 해결하기 위한 시도
이제 다 해결되었는가 했는데,,, 결국 xcconfig 파일 때문에 해결하지 못하였다.
프로젝트에서는 실행 시 비밀키와 URL 등이 저장된 파일을 사용하고 있는데, 이것이 바로 xcconfig 파일으로 GitHub에 올라가지 않도록 막아두었다. 이 파일은 로컬에서만 사용되며, 비밀 키와 같은 중요한 정보를 포함하고 있기 때문에 GitHub에서 이 파일을 인식할 수 있도록 처리해야 할 필요가 있었다.
테스트를 위해서는 비밀키가 필요 없고 URL만 있으면 되므로, 테스트용 xcconfig 파일을 새로 만들어서 적용했다.
프로젝트의 Info에서 Configurations에 Test를 추가하고, Test.xcconfig를 적용하여 테스트를 진행할 수 있도록 했다.
Test.xcconfig 파일은 GitHub에 올라가지 않기 때문에 GitHub에서 인식할 수 있는 방법이 필요했다. 그 방법이 바로 GitHub Secrets이다.
GitHub Secrets에서 TEST_CONFIG라는 이름의 키를 만들어주고, Secret 값에는 실제 test.xcconfig 파일의 내용을 넣어준다.
이렇게 하면, GitHub Actions에서 사용할 수 있는 비밀 정보가 생성된다!! ㅎ
그리고 yml 코드에 깃헙 액션에 정의한 TEST_CONFIG를 사용하여 해당 정보를 지정된 경로로 전달한다.
secrets에 저장된 TEST_CONFIG 파일 내용이 지정된 경로에 전달되어 사용된다.
- name: Create Test.xcconfig
run: echo "${{ secrets.TEST_CONFIG }}" > ./pennyway-client-iOS/Xcconfig/Test.xcconfig
아직도 해결못한 오류,,,
여기서 또 막혔다,,,, 오류해결하면 다른 오류가 계속 생겨나다니,,,,,, 언제쯤 해결할 수 있을까~~
참고
'스위프트' 카테고리의 다른 글
[Swift] - API & Socket 요청 리팩토링 및 인증 처리 개선 (1) | 2025.02.16 |
---|---|
[Swift] - fastlane + GitHub Actions CI 구축(3) (0) | 2025.01.20 |
[Swift] - Quick, Nimble로 테스트 코드 작성 (1) | 2024.11.17 |
[Swift] - fastlane + GitHub Actions CI 구축(1) (0) | 2024.11.12 |
[Swift] - Rxswift 예제로 이해해보기 (0) | 2024.11.02 |