이 글에서는 실제 연동까지 실습을 진행하지는 않습니다.
단순히 진행에 필요한 기본 배경지식만을 설명합니다.
새로운 기능이나 수정사항이 적용된 코드를 기존 코드에 안전하게 병합이 가능한지 체크하는 과정을 자동화
(코드 포멧, 퀄리티, 테스트, 빌드 등에 대한 검증을 자동화 해놓고 변경된 코드에서 이슈가 발생하는지 체크)
지속적으로 통합된 코드에 대해서 사용자에게 바로 배포가 가능하도록 자동화
Developer -> Pull Request -> CI (test) -> Merge -> CD (build and deployment) -> User
CI/CD 는 보통 원격 환경의 컴퓨터(Virtual compute, Cloud compute, Remote instance, Remote server, Machine, Container ... whatever) 에서 실행이 되고
원격 컴퓨터에 이를 도와주는 툴(Jenkins) 등으로 Repository 와 연결 및 자동화 구성을 도와주는데
요즘은 직접 설치 및 구성할 필요 없이 GitHub Actions, CircleCI 등으로 쉽게 yaml 파일 하나만 작성해서 가능하다.
GitHub Repository 에 .circleci/config.yml
파일만 생성하면 쉽게 CircleCI 연동이 가능하다.
config.yml
파일 작성은 링크를 참고하자
Organization 에 CircleCI 앱이 연결이 안돼있으면, https://github.com/settings/connections/applications/78a2ba87f071c28e65bb 로 들어가서 Organization 을 Grant 해주자.
# circleci 버전
version: 2.1
# orbs 는 GitHub Actions 의 uses: actions/checkout@v2 와 같은 Prebuilt 된 스크립트 셋이다.
# 필요한게 있다면 설치해서 사용이 가능하다.
orbs:
ruby: circleci/ruby@1.6.0
macos: circleci/macos@2
# jobs 는 하나의 작업 단위이다.
jobs:
deploy-ios: # job 이름
macos: # 어떤 Executor(machine) 을 사용해서 job 을 실행할것인지 정의한다.
xcode: 14.0.1 # Executor 의 옵션을 설정, macos에 XCode 버전을 지정.
resource_class: large # Executor 의 성능을 설정
steps: # 실행될 명령어들을 설정
- checkout # Repository 소스코드를 체크아웃
- macos/switch-ruby: # ruby 버전 변경
version: '2.7.5'
- ruby/install-deps: # gem 디펜던시 설치
key: gems-ios
app-dir: ./ios
- run: # node_modules 설치
name: Install node_modules
command: yarn install --frozen-lockfiles
- run: # pods 설치
name: Install pods
working_directory: ios
command: bundle exec pod install
- run: # fastlane 환경변수 설정
name: Expose environments
command: |
echo "export MATCH_PASSWORD=$FASTLANE_IOS_MATCH_PASSWORD" >> $BASH_ENV
echo "export MATCH_GIT_URL=$FASTLANE_IOS_MATCH_GIT_URL" >> $BASH_ENV
echo "export PILOT_USERNAME=$FASTLANE_IOS_APPLE_ID" >> $BASH_ENV
echo "export PILOT_APPLE_ID=$FASTLANE_IOS_ITC_TEAM_ID" >> $BASH_ENV
echo "export PILOT_DEV_PORTAL_TEAM_ID=$FASTLANE_IOS_TEAM_ID" >> $BASH_ENV
echo "export PILOT_SKIP_WAITING_FOR_BUILD_PROCESSING=true" >> $BASH_ENV
echo "export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=$FASTLANE_IOS_APPLE_APPLICATION_SPECIFIC_PASSWORD" >> $BASH_ENV
- run: # fastlane 배포 실행
name: Run fastlane
command: yarn deploy:ios
deploy-android: # job 이름
docker: # 어떤 Executor(machine) 을 사용해서 job 을 실행할것인지 정의한다.
- image: cimg/android:2022.03-node # Executor 의 옵션들을 설정, docker에 어떤 이미지를 띄울건지 설정.
resource_class: xlarge # Executor 의 성능을 설정
steps: # 실행될 명령어들을 설정
- checkout # Repository 소스코드를 체크아웃
- ruby/install: # ruby 설치
version: '2.7.5'
- ruby/install-deps: # gem 디펜던시 설치
key: gems-android
app-dir: ./android
- run: # node_modules 설치
name: Install node_modules
command: yarn install --frozen-lockfiles
- run: # google service account 파일 생성 및 fastlane 환경변수 설정
name: Create service-account.json
environment:
- FILE_PATH: android/fastlane/service-account.json
command: |
echo "$FASTLANE_ANDROID_SERVICE_ACCOUNT" | base64 --decode >> $FILE_PATH
echo "export GOOGLE_APPLICATION_CREDENTIALS=$CIRCLE_WORKING_DIRECTORY/$FILE_PATH" >> $BASH_ENV
echo "export FIREBASEAPPDISTRO_APP=$FASTLANE_ANDROID_APP_ID" >> $BASH_ENV
- run: # fastlane 배포 실행
name: Run fastlane
command: yarn deploy:android
# workflows 선언된 job들을 어떤 구성, 트리거로 실행할지 정의한다.
workflows:
deploy-app: # 워크플로우 이름
jobs: # 워크플로우에서 실행할 jobs
- deploy-ios
- deploy-android
기본적으로 CircleCI 는 .circleci/config.yml
파일이 포함돼있는 브랜치에 푸시가 발생할때마다 트리거 된다.
수동 혹은 API 를 이용해서 트리거 할 수도 있다.
사용할때는 $ENV_NAME 으로 사용 가능