(미리 공개하는 우리 캐릭터😍.. from 디자이너 도현님, 은진님)
이제 절반이 지났다. 초기 기획부터 사용자 리서치를 함께 진행하고 디자인팀은 와이어프레임과 디자인 시안을 만들어 개발팀에게 공유를 해주는 방식으로 진행하고 있다. 그 외에 기획은 병렬적으로 보완하며 진행하고 있다. 생각만큼 순탄하고 망망대해에서 바람을 잘 만난 요트같이 순풍을 타는 그림이 그려지는 한 주였다. 프로젝트 세팅도 모두 마쳤고 이슈도 모두 등록했다. 이제 구현만 하면 된다. 어떤 문제를 만날지 너무 기대된다.
스토리북 배포와 임시 vercel 배포 환경 CI/CD 구축을 하면서 학습한 내용을 정리하였다.
( workflows >>> jobs >>> job >>> step >>> action )
📝 암기
github actions에서 가장 상위 개념이다. github/workflows/* 에 위치한 yml파일 하나하나를 workflows라고 하고 여러 개의 workflows가 있을 수 있다.
yml 파일에는 크게 2가지를 정의해야 한다.
1. on (언제 실행할 workflow인지)
2. jobs -> 2번에서 확인
Job이란 독립된 환경에서 돌아가는 하나의 처리 단위. 크흠 우선 처음에는 역시 암기이다. '하나의 처리 단위구나' 를 암기한다면 언젠가 이해될 것이다.
작업은 워크플로우 YAML 파일 내에서 jobs
속성을 사용하며 작업 식별자(ID)와 작업 세부 내용 간의 맵핑(mapping) 형태로 명시한다. 예를 들면
jobs :
job1 :
# 세부 내용
job2 :
# 세부 내용
job3 :
# 세부 내용
여기서 jobs 내부 여러 job에는 필수적으로 두 가지의 속성이 들어가야 한다. (runs-on과 steps)
name: Our Jobs
on: push
jobs:
job1:
runs-on: ubuntu-latest
steps:
- run: echo ${{ github.job }}
job2:
runs-on: ubuntu-latest
needs: job1 steps:
- run: echo ${{ github.job }}
job3:
runs-on: ubuntu-latest
needs: [job1, job2] steps:
- run: echo ${{ github.job }}
✅ job1 - ✅ job2 - ✅ job3
위에서 보이는 job1, job2, job3은 완전히 독립된 환경에서 실행된다. 각 job을 실행하면 병렬 처리가 가능해진다. 다르게 생각해 보면 하나의 Workflows를 다양한 실행 환경에서 실행할 수도 있게 된다. (아하!)
대표적으로 CI/CD를 구현할 때 테스트 작업이나 빌드 작업이 종료된 다음 배포 작업을 시작할 수 있다. 이럴 때 병렬적으로 작업을 수행한다면... 배포 작업할 배포물이 없는 경우도 있을 수 있다. 그래서 있는 개념이
needs 속성이다?!
needs를 활용해서 의존 관계를 설정해 줄 수 있다.
예를 들어 job2
가 실행되기 전에 job1
이 먼저 완료돼야 하고, job3
가 실행되기 전에 job1
과 job2
가 먼저 완료되도록 실습 워크플로우를 수정해 보겠습니다.
github action에서는 jobs라는 하나의 처리 단위 안에 하나 이상 존재하는 job이 하나 이상의 step을 포함하는 모델로 이루어져 있다. step에는 command, script, action 등 다양하게 실행될 수 있고
comman, script ---> run 속성 사용 (아하!)
action ---> uses 속성 사용 (아하!)
사용이 잦은 반복적인 것들을 재사용하기 용이하도록 제공하는 메커니즘이다.
ex) action/checkout
마켓플레이스를 찾아보면 더 많은 Actions들이 존재하는 것을 알 수 있고 적재적소에 필요한 것들을 사용하면 되는 것 같다.
vercel 팀 레포(쉿) 배포 블로그와 스토리북 공식문서를 참고하였습니다.
코드부터 공유하면,
name: deploy with vercel
on:
push:
branches: [main]
jobs:
chromatic:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install dependencies
run: yarn
- name: Node.js 설치
uses: actions/setup-node@v4
with:
node-version: 20.x
- name: Cache node modules
uses: actions/cache@v3
with:
path: node_modules
key: yarn-deps-${{ hashFiles('yarn.lock') }}
restore-keys: |
yarn-deps-${{ hashFiles('yarn.lock') }}
- name: Chromatic에 배포
id: chromatic
uses: chromaui/action@latest
with:
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
token: ${{ secrets.GITHUB_TOKEN }}
onlyChanged: true
autoAcceptChanges: true
vercel:
runs-on: ubuntu-latest
container: pandoc/latex
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install mustache (to update the date)
run: apk add ruby && gem install mustache
- name: creates output
run: sh ./build.sh
- name: Pushes to another repository
id: push_directory
uses: cpina/github-action-push-to-another-repository@main
env:
API_TOKEN_GITHUB: ${{ secrets.AUTO_SECRET_KEY }}
with:
source-directory: 'output'
destination-github-username: 'CodyMan0'
destination-repository-name: 'Dontworry'
user-email: ${{ secrets.OFFICIAL_ACCOUNT_EMAIL }}
commit-message: ${{ github.event.commits[0].message }}
target-branch: main
- name: Test get variable exported by push-to-another-repository
run: echo $DESTINATION_CLONED_DIRECTORY
github Action 기본기를 위에서 정리했고 그에 따라 워크플로우를 정리해 보면 이렇다.
on과 jobs가 workflows에는 필수적으로 필요했다. on은 workflow가 언제 실행할지 인지 위에선 main 브랜치에 push 되면 실행되는 workflows라는 것을 알 수 있다. jobs안에 여러 Job들이 있을 수 있는데 Job이란 독립된 환경에서 돌아가는 하나의 처리 단위이다. 위에서 보면 첫 번째 chromatic이 있고 두 번째 vercel이 있다. 두 개는 병렬적으로 실행되고 있음을 알 수 있다. 왜냐하면 서로 영향을 주지 않기 때문이다. 만약 의존성을 추가하고 싶으면 needs 속성을 사용하여 의존성 관계를 설정할 수 있다.
그럼 이제 첫 번째 chromatic Job을 보면
위의 코드는 우분투 환경에서 실행되는 스크립트이며 steps는 5단계로 나누어져 있다.
스토리북 공식문서를 참고하였습니다.
그럼 이제 두 번째 vercel Job을 보면
개인 레포에 복사하지 않고도 배포할 수 있는 다른 방법도 있었다. vercel CLI를 활용하여 배포할 수도 있지만 우리 돈워리 프런트엔드 팀은 AWS를 활용하여 배포할 예정이기에 빠르게 개발 단계일 때 디자인팀과 백엔드팀에게 보여줄 임시 페이지가 필요하여 임시로 아래와 같은 방법을 채택하였다.
위의 코드도 우분투 환경에서 실행되는 스크립트이며 steps는 5개로 나누어져 있고 Docker Image를 사용한다.
vercel 팀 레포(쉿) 배포 블로그를 참고했습니다.
이대로 CI/CD를 구현했는데 일일이 배포된 결과물을 보려면 Chromatic 사이트로 들어가서 확인해야 하는 불편함이 있었다. 바로 main으로 Merge 될 PR이 등록되면 생기면 얼마나 좋을까?!
문제 : 일일이 Chromatic 사이트에서 빌드된 결과물을 확인해야 하는 번거로움
해결 : PR에서 빌드된 결과물을 확인할 수 있도록 새로운 워크플로우 생성
참고 : https://min-kyung.tistory.com/160
name: Preview
on:
pull_request:
branches: [main]
jobs:
chromatic-preview:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Node.js 설치
uses: actions/setup-node@v4
with:
node-version: 20
- name: Cache node modules
uses: actions/cache@v3
with:
path: node_modules
key: yarn-deps-${{ hashFiles('yarn.lock') }}
restore-keys: |
yarn-deps-${{ hashFiles('yarn.lock') }}
- name: Install dependencies
run: yarn
- name: Chromatic에 배포
id: chromatic
uses: chromaui/action@latest
with:
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
token: ${{ secrets.GITHUB_TOKEN }}
onlyChanged: true
autoAcceptChanges: true
# PR comment
- name: comment PR
uses: thollander/actions-comment-pull-request@v2
with:
message: '🚀storybook: ${{ steps.chromatic.outputs.storybookUrl }}'
그럼 storybook preivew를 알아봅시다.
어느 정도 워크플로우, on, jobs, job, action에 익숙했지만 역시 복습은 항상 옳다.
이름은 Preview로 설정하였다.
여기서 on은 언제 스크립트를 실행시킬지 결정하는 것인데 main 브랜치에 PR이 생성되면 실행되도록 구현하였다. jobs안에 job은 하나로 구성되어 있다. 만약 두세 개로 구성되어 있다면 아마도 needs를 활용하였어야 했을 것이지만 하나로 퉁쳤다.
chromatic-preview job을 살펴보면
우선 우분투 환경에서 실행한다. steps는 총 6단계로 구성되어 있다.