Tags :

Date :

1. 프로젝트 개발 환경 자동화 배경

팀 프로젝트르를 진행하면서 *.xcconfig, *.plist와 와 같은 숨겨야 하는 파일들이 생기게 된다. 이러한 파일들은 .gitignore에 추가하여 Git에 포함하지 않도록 한다. 이러한 Git의 관리를 받지 않는 파일은 팀원간 파일 공유를 수작업으로 진행해야 한다. 초기에는 카톡으로 주고 받았는데 수정하고 공유하는 과정이 매번 번거로웠다. 팀원에게 공유하는 것을 까먹게 되면 서로 다른 환경 속에서 프로젝트를 빌드, 개발하는 불상사가 발생할 수 있다.

2. 개발 환경 세팅을 한줄로 끝내는 명령어를 완성해보자

필요 기능

  1. private files 다운로드
  2. Homebrew 설치 자동화
  3. fastlane 설치 인증서 다운로드
  4. 모든 작업 통합
  5. make로 명령어 실행

1. private files 다운로드

이미지
우선 Private Repository를 만들어준다.

이미지

echo "# CodeLounge-Private" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/team-GitDeulida/CodeLounge-Private.git
git push -u origin main

VScode에서 프로젝트 생성후 방금 만든 레포지토리를 설정한다.

이미지

이미지

// Config.xcconfig파일 생성 후 Hello World 작성
git add .
git commit -m "upload"
git push origin main

Config.xcconfig 테스트 파일을 생성하고 push 해준다. 그러면 레포지토리에서 Config.xcconfig가 업로드된것이 보인다.

# Makefile

# -----------------------------
# 📁 Privates 파일 다운로드 설정
# -----------------------------

# GitHub에서 private 파일을 가져올 repository 경로 (팀명/저장소명/브랜치)
Private_Repository=team-GitDeulida/CodeLounge-Private/main

# GitHub Raw URL 기본 경로
BASE_URL=https://raw.githubusercontent.com/$(Private_Repository)

# ✅ 파일 다운로드 함수 정의
# $(1): 디렉토리 경로
# $(2): GitHub Access Token
# $(3): 파일 이름
define download_file
	mkdir -p $(1)
	curl -H "Authorization: token $(2)" -o $(1)/$(3) $(BASE_URL)/$(1)/$(3)
endef

# 🏁 진입 지점: download-privates 명령 실행 시 동작
download-privates:

	# .env 파일이 없으면 GitHub Access Token을 사용자에게 입력받아 저장
	# Get GitHub Access Token
	@if [ ! -f .env ]; then \
		read -p "Enter your GitHub access token: " token; \
		echo "GITHUB_ACCESS_TOKEN=$$token" > .env; \
	else \
		/bin/bash -c "source .env; make _download-privates"; \
		exit 0; \
	fi

	# 실제 다운로드 수행
	make _download-privates

# 🔽 내부 명령: 다운로드 로직 수행
_download-privates:

	# .env 파일에서 GITHUB_ACCESS_TOKEN을 읽어 환경 변수로 설정
	$(eval export $(shell cat .env))

	# 레포지토리의 최상위 디렉토리에서 Config.xcconfig 다운로드
	$(call download_file,.,$$GITHUB_ACCESS_TOKEN,Config.xcconfig)

최초 코드를 실행하면 .env파일이 없기 때문에 GitHub Access Token을 입력하라고 요청한다. 입력해주자. GitHub Access Token은 Personal access tokens -> Fine-grained tokens에서 생성할 수 있다.

이미지
실제 프로젝트에서 실행시 Config.xcconfig 파일이 다운로드된것을 확인할 수 있다. 이를 활용하여 여러 파일을 Private 레포지토리에 두고 make 명령어 한줄로 ignore 파일들을 가져올 수 있다.

2. Homebrew 설치 자동화

# -------------------------
# Homebrew 설치 확인 및 설치
# -------------------------

install_homebrew:
	@if ! command -v brew >/dev/null 2>&1; then \
		echo "Homebrew가 설치되어 있지 않습니다. 설치를 진행합니다..."; \
		/bin/bash -c "$$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; \
	else \
		echo "Homebrew가 이미 설치되어 있습니다."; \
	fi

3. fastlane 및 인증서 관련 작업(추가작업 진행예정)

이제 Private 레포지토리에 프로비저닝 프로파일을 저장해두고 팀원이 쉽게 가져올 수 있게 해보자.
이미지

fastlane match init         // git 선택 -> Private레포지토리 주소 입력	
fastlane match appstore	    // Apple Id 입력 -> 앱 번들Id 입력
fastlane match development	// Apple Id 입력 -> 앱 번들Id 입력

이미지
이렇게 하게 되면 Private 레포지토리에 master브랜치가 생성되고 프로비저닝 관련 파일들이 생성된다.

# -------------------------
# fastlane 및 인증서 관련 작업
# -------------------------

# Automatically manage signing 체크 해제해야함!!
# Homebrew로 fastlane 설치 (설치되어 있으면 업데이트)
install_fastlane: install_homebrew
	@echo "Updating Homebrew..."
	@brew update
	@echo "Installing fastlane via Homebrew..."
	@brew install fastlane || true
	@echo "✅ fastlane 설치 완료 (Homebrew 사용)"
	
# 인증서 다운로드 (readonly 모드)
fetch_certs: install_fastlane
	@echo "Fetching development certificates..."
	@fastlane match development --readonly
	@echo "Fetching appstore certificates..."
	@fastlane match appstore --readonly
	@echo "✅ 인증서 가져오기 완료"

fastlane match로 인증서를 다운로드 한 후, Xcode에서 Automatically manage signing”이 꺼져 있다면, 해당 팀 ID와 Bundle ID에 맞는 프로비저닝 프로파일을 수동으로 선택할 수 있다.

최종 Makefile

# 터미널에 make 입력시 실행됨
.DEFAULT_GOAL := all

# -----------------------------
# 📁 Privates 파일 다운로드 설정
# -----------------------------

# GitHub에서 private 파일을 가져올 repository 경로 (팀명/저장소명/브랜치)
Private_Repository=team-GitDeulida/CodeLounge-Private/main

# GitHub Raw URL 기본 경로
BASE_URL=https://raw.githubusercontent.com/$(Private_Repository)

# ✅ 파일 다운로드 함수 정의
# $(1): 디렉토리 경로
# $(2): GitHub Access Token
# $(3): 파일 이름
define download_file
	mkdir -p $(1)
	curl -H "Authorization: token $(2)" -o $(1)/$(3) $(BASE_URL)/$(1)/$(3)
endef

# 🏁 진입 지점: download-privates 명령 실행 시 동작
download-privates:

	# .env 파일이 없으면 GitHub Access Token을 사용자에게 입력받아 저장
	# Get GitHub Access Token
	@if [ ! -f .env ]; then \
		read -p "Enter your GitHub access token: " token; \
		echo "GITHUB_ACCESS_TOKEN=$$token" > .env; \
	else \
		echo "Homebrew가 이미 설치되어 있습니다."; \
	fi

	# 실제 다운로드 수행
	make _download-privates

# 🔽 내부 명령: 다운로드 로직 수행
_download-privates:

	# .env 파일에서 GITHUB_ACCESS_TOKEN을 읽어 환경 변수로 설정
	$(eval export $(shell cat .env))

	# 레포지토리의 최상위 디렉토리에서 Config.xcconfig 다운로드
	$(call download_file,.,$$GITHUB_ACCESS_TOKEN,Config.xcconfig)

# -------------------------
# Homebrew 설치 확인 및 설치
# -------------------------

install_homebrew:
	@if ! command -v brew >/dev/null 2>&1; then \
		echo "Homebrew가 설치되어 있지 않습니다. 설치를 진행합니다..."; \
		/bin/bash -c "$$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; \
	else \
		echo "Homebrew가 이미 설치되어 있습니다."; \
	fi

# -------------------------
# fastlane 및 인증서 관련 작업
# -------------------------

# Automatically manage signing 체크 해제해야함!!
# Homebrew로 fastlane 설치 (설치되어 있으면 업데이트)
install_fastlane: install_homebrew
	@echo "Updating Homebrew..."
	@brew update
	@echo "Installing fastlane via Homebrew..."
	@brew install fastlane || true
	@echo "✅ fastlane 설치 완료 (Homebrew 사용)"
	
# 인증서 다운로드 (readonly 모드)
fetch_certs: install_fastlane
	@echo "Fetching development certificates..."
	@fastlane match development --readonly
	@echo "Fetching appstore certificates..."
	@fastlane match appstore --readonly
	@echo "✅ 인증서 가져오기 완료"

# -------------------------
# 통합 기본 타겟: 필요한 경우 Private 파일과 인증서 모두 다운로드
# -------------------------
all: download-privates fetch_certs
	@echo "✅ 모든 작업 완료"

실행시 Private 레포지토리 2~3번 주소 요청시 입력해준다.
그리고 Xcode 재실행하면 사진처럼 프로비저닝 파일이 보이게 된다.

이미지
이제 팀원이 프로비저닝 관련 해서 문제가 생긴다면 make명령어 실행해주세요~ 라고 멋있게 말해주면 된다.

Leave a comment