github actions 를 사용하면서 든 의문점이 들었다. 하나의 CICD파일을 만들때 나는 이벤트에 해당하는 브랜치를 master
와 dev
두 가지 브랜치에 푸시 또는 풀리퀘스트가 될 때 동작하도록 작성하였다.
on:
push:
branches: [ "master", "dev" ]
pull_request:
branches: [ "master", "dev" ]
따라서 master와 dev에 코드의 변경사항이 작동될때 해당 yaml파일의 내용이 동작하게 되는데, CI부분만 작성했을 때는 큰 문제가 없었지만, CD를 작성하면서 고민이 생겼다.
CI는 npm ci와 npm test 등 이미 작성된 내용에 대한 검증을 이루어 내는 로직으로 작성 되어있고, 당연히 master
나 dev
브랜치에 새로운 코드변경사항이 생기면 정상적으로 다른 코드들도 동작하는지 확인할 필요가 있기 때문에 해당 사항은 적용되어야만한다.
하지만 CD부분 다르다. 만약 개발환경을 위해 dev
브랜치에 푸시나 PR을 하게 되었을때, 이게 자동적으로 배포하게 되면, 개발 내용이며 아직 실서버에 적용되면 안되는 내용임에도 불구하고, dev
브랜치에 이벤트를 동작시키는 순간 자동 배포 되어버린다.
그렇다면 나는 어떻게 해야할까?
가장먼저 생각한것은 "이벤트를 나눠서 master
와 dev
에서 따로 동작하게끔 할 수 있나?" 였다.
name CI
on:
push:
branches: [ "master", "dev" ]
pull_request:
branches: [ "master", "dev" ]
#...
name CD
on:
push:
branches: [ "master"]
pull_request:
branches: [ "master"]
needs: CI
#...
❌❌❌하지만 문법적인 부분에서 하나의 워크플로우에 여러개의 이벤트 트리거를 만들 수 없다.
제대로 github actions에서 사용하는 문법을 잘 모르고 생각했기 때문에 이러한 생각도 할 수 있었다.
다음으로는 2개의 파일을 나누는 형식이었다. 위와 같이 CI와 CD의 내용을 각각 나눠서 동작시키도록 하고, 각 워크플로우에서 이벤트 트리거에 따라 변경을 적용한다.
name CI
on:
push:
branches: [ "master", "dev" ]
pull_request:
branches: [ "master", "dev" ]
#...
name CD
on:
push:
branches: [ "master"]
pull_request:
branches: [ "master"]
#...
❌❌❌하지만 이 방법 또한 의문점이 든 것이 CI가 정상동작한 후에 CD가 동작하여야 하지만 needs나 if조건은 같은 워크플로우에서만 적용되기 때문에 위와같은 방식도 사용할 수 없었다.
그렇다면 내가 할 수 있는 방법은 무엇이 있을까? 코드의 중복이 이루어 지겠지만, 두 개의 워크플로우를 만들고, 각 이벤트 트리거를 master
와 dev
를 단일로 받아서 dev
에 푸시나 PR이 이루어 졌을때는 CI만 동작하는 로직만 작성하고, master
푸시나 PR이 이루어 졌을때는 CI와 CD모두 동작하게끔 로직을 작성하는 방법이었다.
name CI
on:
push:
branches: [ "dev" ]
pull_request:
branches: [ "dev" ]
#...
name CI/CD
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
job:
CI:
#...
CD:
needs: CI
#...
이렇게 작성하면 CI로직이 완전히 겹쳐버리게 된다. 똑같은 로직을 두 번 사용하는데 이벤트 트리거만 다를 뿐이다. 당연히 나는 개발자로써 반복적인 로직이 생기지 않게끔 해야하지만, 아직은 도저히 생각나지 않는다. 이건 분명히 잘못된 방법이라고 생각은 하고 있다. 어떻게 해야할지 좀 더 알아봐야 할 것 같다.