- Published on
๐ Swift - MusicSpot CI ์ ์ฉ๊ธฐ
- Authors
- Name
- ์ด์ฐฝ์ค
๋ฐฐ๊ฒฝ
MusicSpot์ ์ฌ๋ฌ ๋ชจ๋๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
์ฑ ํ๋ก์ ํธ ํ๋๋ง ๋น๋ํ๋ฉด ๋๋ ์ด์ ์ ๊ฒฝํํ๋ CI์๋ ๋ค๋ฅด๊ฒ ๊ฐ ๋ชจ๋์ ์ฐพ์๋ด์ ๊ฐ๊ฐ ๋น๋ํด์ผํ ๊ฒ ๊ฐ์๋ฐ..
์ด๋ป๊ฒ ํด์ผํ ๊น์?
๊ณผ์
MusicSpot์ ๋ชจ๋๋ฌ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๋์ ์ฑ ํ๊ฒ์ ๋ชจ๋ ์์ค๊ฐ ์๋ ๊ฒ์ด ์๋๋ผ ๊ฐ ํจํค์ง๊ฐ ๊ฐ๊ฐ์ ์์ค ์ฝ๋๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
์ดํ์ ํ๋์ ์ฑ ํ๊ฒ์์ ๋ชจ๋ ํจํค์ง๋ฅผ Dependency๋ก ๊ฐ๊ฒ๋๋ฉด, ์ฑ ํ๊ฒ ํ๋๋ง ๋น๋ํด์ค๋ ํ ์คํธ๊ฐ ๋ ํ ์ง๋ง,
๊ทธ ์ ์๋ ์ด๋ป๊ฒ ํด์ผํ ๊น์?
๊ฐ ๋ชจ๋์ ์ฐพ์๋ด์ ๋น๋ํ๋ ์ฌ์ ... ์์ํฉ๋๋ค..
์ฌ์ฉํ๋ ๋ชจ๋๋ค์ ์ฐพ์๋ด๊ธฐ
๊ฐ ๋ชจ๋๋ค์ ๋น๋ํ๋ ค๋ฉด, ์ฐ์ ์ด๋ค ๋ชจ๋๋ค์ด ์๋์ง๋ถํฐ ํ์ธํด์ผ ํ์ต๋๋ค.
xcodebuild
๊ฐ ๋คํํ list๋ฅผ ๋ฝ์๋ด๋ ๋ช
๋ น์ด๋ฅผ ์ ๊ณตํ๊ณ ์์์ต๋๋ค.
xcodebuild -workspace MusicSpot.xcworkspace -list
MusicSpot ์ํฌ์คํ์ด์ค์ ๋ชจ๋ ํจํค์ง๋ค์ ์ถ๊ฐํด์ค์ผ๋ก์จ ๊ด๋ฆฌํ๋ ํจํค์ง๋ค์ ์ฐพ์๋ผ ์ ์์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๊ฒฐ๊ณผ๊ฐ ๊ต์ฅํ ๊ธฐ๋ค์..!?
์ ํฌ๊ฐ ์ํ๋ ๊ฑด ๊ฐ์ฅ ๋ฐ์ ์๋ Schemes
์ ๋ํ ์ ๋ณด์
๋๋ค.
for scheme in $(xcodebuild -workspace ${{ env.WORKSPACE }} -list | grep -A 100 "Schemes:" | grep -v "Schemes:" | sed '/^$/d' | sed 's/^[ \t]*//')
grep -A 100 "Schemes:" -
Schemes:`๋ผ๋ ๋จ์ด๋ฅผ ์ฐพ์์ ํด๋น ๋จ์ด๋ถํฐ 100๊ฐ์ ์ค์ ๋ฐ์ต๋๋ค.grep -v "Schemes:"
- ๊ทธํ ๋ฐ๋๋กSchemes:
๋ผ๋ ๋จ์ด๋ฅผ ๊ฐ์ง์ง ์์ ๋ฌธ์ฅ๋ค์ ๋ฐ์ต๋๋ค.
์ฌ๊ธฐ๊น์ง ํ๋ฉด ๋ชฉ๋ก๋ค์ ์ป์ ์ ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ํญ๊ณผ ๊ฐ๋ ์๊ธฐ๋ Next-Line๋ค์ ์ ๊ฑฐํด์ค์ผํ๊ธฐ ๋๋ฌธ์ 3. sed '/^$/d'
์ sed 's/^[ \t]*//'
๋ก ๊ณต๋๋ค์ ์ ๊ฑฐํด์ค๋๋ค.
matrix
์ด๋ ๊ฒ ์ถ์ถํ Scheme๋ค.. ์์ฐจ์ ์ผ๋ก ํ๋ํ๋ ๋น๋ํ๋ฉด ํ์ธ์์ด๊ฒ ์ฃ ?
๊ทธ๋์ ์ด๊ฑธ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ ์ฐพ์๋ณด๋ ์์ค
GitHub Action์ matrix๋ผ๋ ๊ธฐ๋ฅ์ด ์๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
jobs:
example_matrix:
strategy:
matrix:
version: [10, 12, 14]
os: [ubuntu-latest, windows-latest]
์ด๋ฐ ์์ผ๋ก matrix๋ฅผ ์ ์ํด์ฃผ๋ฉด, ์ฃผ์ด์ง ๊ฐ ๊ฐ๋ค์ ํ ๋ฒ์ฉ ๋งค์นญ์์ผ์ ๊ฐ์ ๋์์ ์ํ์์ผ์ค๋๋ค.
- `{version: 10, os: ubuntu-latest}`
- `{version: 10, os: windows-latest}`
- `{version: 12, os: ubuntu-latest}`
- `{version: 12, os: windows-latest}`
- `{version: 14, os: ubuntu-latest}`
- `{version: 14, os: windows-latest}`
์ด๋ ๊ฒ version 3๊ฐ, os 2๊ฐ์ ์กฐํฉ์ผ๋ก 6๊ฐ์ ์ผ์ด์ค๊ฐ ์๊ธฐ๊ฒ ๋ค์.
๊ทธ๋ฐ๋ฐ ์ ํฌ๋ ์ด๋ ๊ฒ ์กฐํฉ์ ์ฌ์ฉํ ๊ฑด ์๋๊ณ , ์ด ์กฐํฉ์ ํ ๋ฒ์ ๋๋ฆฐ๋ค๋ ์ ์ ํ์ฉํ ๊ฒ๋๋ค.
matrix="{\"include\":["
for scheme in Schemes ...
if [ "$first_entry" = true ]; then
first_entry=false
else
matrix+=","
fi
matrix+="{\"scheme\":\"$scheme\"}"
done
matrix+="]}"
echo "matrix=$matrix" >> $GITHUB_OUTPUT
matrix๋ key-value์ ํ์์ ๋ฐ๋ผ์ผํ๊ธฐ ๋๋ฌธ์
{
"include": [
{
"scheme": "MusicSpot"
},
{
"scheme": "MusicSpot-Release"
},
...
]
}
์ด๋ ๊ฒ "scheme"์ key ๊ฐ์ผ๋ก ๊ฐ๋ Scheme Value๋ค์ ๋ง๋ค์ด์ฃผ์์ต๋๋ค.
์ด๋ ๊ฒ ์ถ๊ฐํ matrix๋ ์ดํ ๋น๋ action ์ชฝ์์
xcode-build:
needs: prepare-matrix
runs-on: macos-13
strategy:
fail-fast: false
matrix: ${{fromJson(needs.prepare-matrix.outputs.matrix)}} // โ
์ด๋ ๊ฒ JSON ํ์ฑ์ ํตํด ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ
์ด๋ ๊ฒ ์ ํฌ ์ถ๊ฐํ Scheme๋ค์ด ๋ณ๋ ฌ์ ์ผ๋ก ํ ๋ฒ์ ๋์๊ฐ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
์กฐ๊ธ ๊ฑธ๋ฆฌ๋ ์ ๋ค์ด ๋จ์์๊ธด ํฉ๋๋ค.
- ๋ณ๊ฒฝ๋ ํ์ผ๊ณผ ์๊ด์์ด ๋ชจ๋ Scheme๋ค์ ๊ฒ์ฌ๊ฐ ์ด๋ฃจ์ด์ง๊ณ ์๋ค๋ ์
- ์ดํ ์ฑ ํ๊ฒ์ ๋ชจ๋ Dependency๊ฐ ์ถ๊ฐ๋๋ฉด, ๊ทธ ์ดํ์๋ ์ด๋ ๊ฒ ๋ชจ๋ Scheme์ ๊ฒ์ฌํ ํ์๊ฐ ์์๊น ํ๋ ์๋ฌธ
์๋ง ํ๋ก์ ํธ ๊ธฐ๊ฐ๋์์ ์ด๋๋ก ๊ณ์ ์ฌ์ฉํ๊ณ ,
์ดํ์ ์ถ๊ฐ์ ์ผ๋ก ์งํํ๊ฒ ๋๋ค๋ฉด ๊ณ ๋ฏผํด๋ณด๊ณ ์์ ํ ๊ฒ ๊ฐ๋ค์.