들어가기 앞서 . . .
CI/CD는 말로만 들었을 땐 어렵게 느껴졌지만, 실제로는 반복적인 배포 과정을 자동화해주는 매우 실용적인 도구라는 점에서 흥미가 생겼다. 이번 포스팅에서는 단순한 코드 실행부터 Secrets 처리까지 하나씩 실습하며 CI/CD의 구조와 개념을 직접 경험해보자.
Github Actions
Gihub Actions의 전체 구조
Github Actions는 Event, Workflow, Job, Step으로 구성된다.
예를 들어 push, pull_request 등의 행위(이벤트)가 발생하면, 해당 이벤트에 반응하여 Workflow가 실행된다.
하나의 Workflow는 여러 개의 Job으로 구성될 수 있으며, 각 Job은 서로 다른 실행 환경(런너)에서 병렬로 실행될 수도 있다.
여기서 말하는 "런너"란 Github Actions에서 Workflow의 Job을 실제로 실행해주는 컴퓨터(서버)를 말한다.
각 Job은 다시 여러 Step(단계)으로 이루어져 있으며, 이 Step은 쉘 명령어나 액션 등을 통해 실제 작업을 수행한다.
사실 이론만 보면 잘 이해가 와닿지 않는다. 아래의 실습을 진행하며 CI/CD를 더 깊게 이해해보자.
Github Actions 간단한 workflow 작성하기
우선 workflow를 작성해보자.
아래와 같이 폴더 구조를 만든뒤에 .yml 파일을 만들어주자.
여기서 폴더의 이름은 변경해선 안되고 .yml 파일은 맘대로 지정해주어도 괜찮다.
Gihub Actions 코드 작성 및 해석
아래와같이 deploy.yml 파일을 작성해주었다.
name:Github Actions 실행 연습
on:
push:
branches:
- main
jobs:
My-Deploy-job:
runs-on:ubuntu-latest
steps:
- name: Hello world 찍기
run: echo "Hello Wolrd!"
간단하게 어떤 코드인지 설명을 해보자면,
name은 workflow의 이름이다.
on은 어떤 이벤트가 발생할 때 깃허브 액션을 실행시킬 것 인가를 정하는 것인데, 아래와 같은 키워드를 사용할 수 있다.
push | 특정 브랜치에 코드가 푸시될 때 워크플로우 실행 |
pull_request | PR 생성/업데이트 시 워크플로우 실행 |
workflow_dispatch | 수동 실행 버튼을 통해 워크플로우 수동 트리거 (UI에서 실행) |
branches는 어떤 브랜치에서 발생한 이벤트에 반응할지를 지정하는 역할을 한다.
즉 위의 예시에서는 main 브랜치에 push 이벤트가 발생하면 깃 허브 액션을 실행시킨다는 뜻이다.
jobs:
My-Deploy-job:
하나의 Workflow는 한 개 이상의 jobd으로 구성되는데, 여러 job은 기본적으로 병렬적으로 수행된다.
My-Deploy-job은 job을 식별하기 위한 하나의 job 이름이다. 마음대로 지정해주어도 된다.
runs-on:ubuntu-latest
여기서 github Actions는 사실 하나의 컴퓨터이다. github actions의 운영체제를 선택하는 것으로, 실습에서는 ubuntu 운영체제의 가장 최신버전을 사용했다.
steps:
- name: Hello world 찍기
run: echo "Hello Wolrd!"
step은 특정 작업을 수행하는 가장 작은 단위로, 하나의 job은 여러개의 step으로 나눠진다.
name에는 step의 이름을 명시하고, run에는 실제 실행되는 코드를 입력하면 된다. 여기서 run에는 리눅스 명령어를 작성해야한다.
echo는 콘솔 로그에 출력하는 리눅스 명령어로, Java로 치면 System.out.println과 같은 역할을 한다.
Github Actions 테스트하기
이제 한 번 github에 commit 후 main 브랜치에 push 해보자.
github에 올린 repository에 들어가서 상단에 위치한 Actions를 들어가보자.
아래와 같이 workflows가 생긴 것을 확인할 수 있었다.
My-Deploy-job을 클릭해서 들어가면 Github Actions에서 작성된 코드들이 실행된 흔적들이 남는다.
Github Actions는 일종의 로직을 실행시킬 수 있는 하나의 컴퓨터라고 언급했었다.
Github에 코드가 올라가자마자 GIthub Actions가 코드를 읽어 컴퓨터에서 실행을 시킨것이다.
echo "Hello World"라는 명령어를 실행한 뒤,
Hello World가 콘솔에 찍혀 출력된 것을 확인할 수 있다.
여러 명령어 문장을 작성하려면 어떻게 해야할까?
위에서 우리는 echo Hello World라는 명령어를 통해서 콘솔에 Hello World라는 문장을 출력해보았다.
Hello World에서 끝나는 게 아니라 여러 명령어를 입력하고싶으면 어떻게 해야할까?
리눅스에서는 여러 문장을 입력하기 위해서는 '|' 명령어를 사용한다.
아래와 같이 코드를 변경해보자.
deploy.yml 파일 수정하기
deploy.yml
name: Github Actions 실행시키기 실습
on:
push:
branches:
- main
jobs:
My-Deploy-job:
runs-on: ubuntu-latest
steps:
- name: Hello World 찍기
run: echo "Hello World"
- name: 여러 명령어 문장 작성하기
run: |
echo "Haeyoon"
echo "CI/CD"
echo "Test입니다."
하나의 step을 더 추가해주었다.
| 를 추가해주면 여러줄 문장을 작성할 수 있다.
여러줄에 걸쳐서 echo 출력문을 입력해보았다. git main 브랜치에 Push 해보자.
Github Actions 테스트하기
두개의 step이 실행된 것을 확인할 수 있었다.
Heayoon
CI/CD
Test입니다.
라는 문장들이 출력되면서 여러 명령어를 동시에 출력해보았다.
Github Actions의 내장 환경변수를 출력해보자.
github Actions에서는 여러 환경변수를 제공하고있다.
커밋을 했다면 커밋ID라던지, 현재 repository 변수라던지 내장된 환경변수가 존재하는데, 이런 환경변수들은 자동 배포를 위해 나중에 필요한 환경변수들이니 지금 실습으로 출력해보자.
deploy.yml 수정하기
name: Github Actions 실행시키기 실습
on:
push:
branches:
- main
jobs:
My-Deploy-job:
runs-on: ubuntu-latest
steps:
- name: Hello World 찍기
run: echo "Hello World"
- name: 여러 명령어 문장 작성하기
run: |
echo "Haeyoon"
echo "CI/CD"
echo "Test입니다."
- name: Github Actions 자체에 저장되어 있는 변수 사용해보기
run: |
echo $GITHUB_SHA
echo $GITHUB_REPOSITORY
이 전 실습에서 진행했던 리눅스 명령어 '|'를 사용해서 $GITHUB_SHA, $GITHUB_REPOSITORY라는 환경변수들을 콘솔창에 찍어보았다.
Github Actions 테스트하기
여기서 #GITHUB_SHA에 대해서 조금 더 자세히 봐보자.
c341855969644ded96dcdf9c62edc877b64d8948라는 값이 찍힌 것을 확인할 수 있다.
리포지토리의 commit을 들어가면 오른쪽을 보면 알 수 있듯이 각 커밋에 고유의 값이 존재한다. (가장 오른쪽에 341855)
지금은 코드가 단순하게 적혀있지만 코드를 복사해서 붙여넣으면 위와 같은 c341855969644ded96dcdf9c62edc877b64d8948 값이 출력된다. 즉 지금 해당하는 commit의 ID를 뜻하는 것이다.
#GITHUB_REPOSITORY 변수는 Github에 있는 리포지토리 명을 표현한 것이다.
깃유저명/리포지토리명 형식으로 뜨게된다.
Github Secrets를 활용해 민감한 값 사용하기
우리가 백엔드를 서버를 구현할 때 Spring에서 application.yml이라는 설정파일을 사용한다.
해당 .yml 파일에는 다른 외부인들에게 노출되면 안되는 aws 관련 시크릿 키 라던지, DB의 password등 민감한 정보들이 들어가게된다.
그래서 우리는 백엔드 프로젝트를 Github에 올릴 때 이러한 application.yml 파일은 .gitignore에 포함하여 github에 올라가지 않도록 막아주고, 수동배포를 진행할 때 EC2에서 직접 application.yml 파일을 생성하고 코드를 입력해 배포해주었다.
근데 서버를 배포하거나 Spring 서버를 실행해야할 때 이런 appplication.yml 파일들이 없으면 어떻게 자동배포를 할 수 있을까?
Github Secrets를 사용하면 된다.
deploy.yml 수정하기
name: Github Actions 실행시키기 실습
on:
push:
branches:
- main
jobs:
My-Deploy-job:
runs-on: ubuntu-latest
steps:
- name: Hello World 찍기
run: echo "Hello World"
- name: 여러 명령어 문장 작성하기
run: |
echo "Haeyoon"
echo "CI/CD"
echo "Test입니다."
- name: Github Actions 자체에 저장되어 있는 변수 사용해보기
run: |
echo $GITHUB_SHA
echo $GITHUB_REPOSITORY
- name: 노출되면 안되는 값 사용해보기
run: |
echo ${{ secrets.MY_NAME }}
echo ${{ secrets.MY_SECRET_HOBBY }}
Github의 Secret 변수를 사용하기 위해 secrets.${{ 변수명 }}을 사용해주었다.
main 브랜치에 push 하기전에 Githun Actions의 Secrets 변수를 설정해주자.
깃허브 리포지토리의 Settings에 들어가면 아래와같이 Secrets and variables라는 카테고리가 존재한다.
Actions에 들어가서 변수를 설정해주자.
Name에 환경변수 이름을 설정하고 Secret에 외부에 노출되어서 안되는 내용을 작성했다.
성공적으로 환경변수들이 생성되었다.
Github Actions 테스트하기
환경변수까지 설정했으면 이제 main 브랜치에 push해서 민감한 값들이 가려지는 지 확인해보자.
민감한 값 마스킹이 잘 되는 것을 확인할 수 있었다!
Github Actions의 공식문서
추가하고 싶은 기능이 있으면 검색해보고 공식문서를 확인하면서 공부하자.
GitHub DocsGitHub Actions 설명서 - GitHub Docs
마무리하며
처음에는 CI/CD라는 개념 자체가 낯설었지만, GitHub Actions를 활용해 간단한 워크플로우부터 환경변수, Secret 처리까지 하나씩 실습하면서 점점 익숙해질 수 있었다.
특히 단순한 자동화 이상의 의미를 가지고 있다는 점
신뢰성 있는 배포, 반복 업무의 제거, 실수 방지 등—을 체감할 수 있었고, 이제는 실제 프로젝트에서도 GitHub Actions를 활용해볼 수 있을 만큼 자신감이 생겼다!
앞으로도 공식 문서를 참고하며 다양한 기능들을 익히고, 파이프라인을 더 견고하게 구성해보자.
'Github Actions' 카테고리의 다른 글
[Github Actions] Springboot 팀 프로젝트 CI/CD 구축하기 (0) | 2025.06.19 |
---|---|
[Github Actions] SpringBoot 개인 프로젝트 CI/CD 구축하기 (1) | 2025.06.18 |
[Github Actions] 배포 자동화, CI/CD란? (0) | 2025.06.18 |