์ค์!!
ARC ๊ฐ Github Official ํ๋ก์ ํธ๊ฐ ๋จ์ ๋ฐ๋ผ ์๋์์ ๋ณด์ฌ๋๋ฆฐ ARC ๊ด๋ จํ ๋ฆฌ์์ค๋ค์ ์ ๋ถ ๊ตฌ ๋ฒ์ ์ ๋๋ค.
์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
Action Controller Runner (์ดํ ARC) ๋ ํ๋ ๋จ์ Self Hosted Runner ์ ๋๋ค.
์ฆ, ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ ํ๋๋ฅผ Self Hosted Runner ๋ก ์ง์ ํ ์ ์๊ฒ ํด์ฃผ๋ ์คํ์์ค์ฃ .
ARC ์ ๋ํ ์ ๋ณด๋ ์ฌ๊ธฐ๋ฅผ ํ์ธํด์ฃผ์ธ์.
๊ทผ๋ฐ ARC ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด ์์ต๋๋ค.
๋ฐ๋ก ARC ์ ์ํด ๋ง๋ค์ด์ง๋ ํ๋๋ Github Action ์ Job ์ด ์ข ๋ฃ๋ ๊ฒฝ์ฐ ์ ๊ฑฐ๋๊ณ ๋ค์ ์์ฑ๋ฉ๋๋ค.
๋ฐ๋ผ์ HostPath ๋ EFS ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด Job ์ ์คํํ ๋ ์์ฑํ๋ Java SDK, Node, Build File ๋ฑ ๋ํ ๊ฐ์ด ์ญ์ ๋ฉ๋๋ค.
๊ทธ ๋ง์ ์ฆ์จ, caching ์ ํ ์ ์์ผ๋ฉฐ, ๋งค๋ฒ ํ๋ํ ๋ ๋ง๋ค ์๋กญ๊ฒ ํจํค์ง๋ฅผ ์ค์นํ๊ธฐ ๋๋ฌธ์ Job ์ ์ํํ๋๋ฐ ๋ณด๋ค ๋ ๋ง์ ์๊ฐ์ด ์์ ๋๋ค๋ ๊ฒ์ด์ฃ .
๋ฐ๋ผ์ ์ด๋ฒ ๊ธ์์๋ ARC ๋ฅผ ์ด์ฉํ ๋ ํ๋์ EFS ๋ฅผ ๋ง์ดํธํ์ฌ caching ์ด ๊ฐ๋ฅํ๋๋ก ํด๋ณด๊ฒ ์ต๋๋ค.
์ฌ์ ์กฐ๊ฑด
- Build ํ Kotlin Project
- Action Runner Controller Helm Chart
- EFS CSI Driver
ARC ์ค์น๋ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
Runner ์ ์ข ๋ฅ๋ก๋ RunnerDeploy, RunnerSet ์ด ์๊ณ , ์ฌ๊ธฐ์๋ RunnerDeploy ๋ฅผ ํตํด ๋ฐฐํฌํด๋ณด๊ฒ ์ต๋๋ค.
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv
spec:
capacity:
storage: 10Ei
volumeMode: Filesystem
accessModes:
- ReadWriteMany
storageClassName: ""
persistentVolumeReclaimPolicy: Retain
csi:
driver: efs.csi.aws.com
volumeHandle: <EFS ID>::<Access Point ID>
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
namespace: actions-runner-system
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 1Ei
PV ์ PVC ๋ฅผ ์์ ๊ฐ์ด ๋ฐฐํฌํด์ค๋๋ค.
์ดํ ๋ฐฐํฌํ PV ๋ฅผ RunnerDeploy ์ ๋ง์ดํธ ํด์ค๋๋ค. ์์ธํ ์ฌํญ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
apiVersion: actions.summerwind.dev/v1alpha1
kind: RunnerDeployment
metadata:
name: runner
namespace: actions-runner-system
spec:
replicas: 2
template:
spec:
serviceAccountName: ""
organization: <organization name>
ephemeral: true
dockerEnabled: true
dockerRegistryMirror: <docker registry url>
workDir: /runner/_work
labels:
- runner
- al2_x86_64
resources:
requests:
cpu: "500m"
memory: "1000Mi"
nodeSelector:
purpose: self-hosted-runner
tolerations:
- key: "self-hosted-runner"
value: "true"
operator: "Equal"
effect: "NoExecute"
volumeMounts:
- mountPath: /build-cache
name: runner-pv # ์์์ ์์ฑํ pv ์ด๋ฆ
volumes:
- name: runner-pv
persistentVolumeClaim:
claimName: pvc # ์์์ ์์ฑํ pvc ์ด๋ฆ
- ephemeral: true
- Job ์ด ๋๋๋ฉด ๊ธฐ์กด Runner ๋ ์ญ์ ํ๊ณ ์๋ก์ด Runner ๋ฅผ ์์ฑํฉ๋๋ค (true ๊ฐ ๊ถ์ฅ๋จ)
- dockerEnabled: true
- Job ์ ์ํํ ๋ Docker Engine ์ ํตํด ์ํ ๋ฉ๋๋ค
- dockerRegistryMirror
- Image ๋ฅผ ๊ฐ์ ธ์ฌ Registry URL ์ ์์ฑํฉ๋๋ค
- workDir
- Job ์ด ์ํ๋๋ Directory ์ ๋๋ค (default ๊ฐ /runner/_work)
EFS ์ /build-cache ๋๋ ํฐ๋ฆฌ์ caching ์ ์งํํ ๊ฒ๋๋ค.
์ดํ kotlin Project ๋ฅผ gradle ๋ฅผ ํตํด build ํด๋ด ์๋ค.
์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ก gradle build ์ caching ๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ช ์ํ ์ ์์ต๋๋ค.
./gradlew build \
--no-daemon \
--build-cache \
--project-cache-dir=/build-cache/.gradle \
--gradle-user-home=/build-cache/.gradle
gradle ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ํ๋ก์ ํธ ์์น์ caching ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ ํํ๊ธฐ ๋๋ฌธ์ --gradle-user-home ์ ํตํด gradle ์ด ๋ฐ๋ผ๋ณผ ๊ณณ์ ์ง์ ํฉ๋๋ค.
Github Action ์ผ๋ก ์ฎ๊ธฐ๋ฉด ์๋์ ๊ฐ์ด ์ธ ์ ์์ฃ .
runs:
using: "composite"
steps:
- uses: actions/setup-java@v3
with:
distribution: 'zulu' # See 'Supported distributions' for available options
java-version: '11'
- run: ./gradlew build --no-daemon --build-cache --project-cache-dir=/build-cache/gradle --gradle-user-home=/build-cache/gradle
shell: bash
๋ชจ๋ ์ค๋น๋ ๋๋ฌ์ต๋๋ค.
Action ์ ์คํํ์ฌ ์ผ๋ง๋ ์๋ ์ฐจ์ด๊ฐ ๋๋ ์ง ํ์ธํด๋ณด์ฃ !
ํ ์คํธํ ํ๋์ ์คํ์ ์๋์ ๊ฐ์ต๋๋ค.
- cpu : 400Mi
- memory : 1Gi
caching ์
caching ํ
ํ์ฐํ Build ์๋๊ฐ ๋นจ๋ผ์ง ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ ๋์๊ฐ Docker Build ๋ํ caching ํด ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ๊ทธ๊ฑด ๊ฐ์์๊ฒ ๋งก๊ธฐ๋๋ก ํ์ฃ !
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!