1. 실습 목표
- push 시 워크플로우 실행
- Python 코드 자동 실행
- Python 테스트 자동화
- 결과 파일 생성
- 아티팩트 업로드
- 브랜치별 실행 분기
- Secret 사용
- EC2 자동 배포
2. 실습 환경
준비물
- GitHub 계정
- Git 설치
- Python 3 설치
- VS Code 또는 편집기
- GitHub Repository 1개
- EC2 1대 SSH 접속 가능 상태 배포 실습 시 사용
3. 실습 1 가장 기본적인 GitHub Actions 실행
3.1 실습 폴더 생성
mkdir github-actions-python-lab
cd github-actions-python-lab
git init3.2 README 파일 생성
echo "# github-actions-python-lab" > README.md3.3 워크플로우 디렉터리 생성
mkdir -p .github/workflows3.4 첫 번째 워크플로우 작성
vi .github/workflows/01-basic.ymlname: 01 Basic Workflow
on:
push:
branches:
- main
jobs:
hello:
runs-on: ubuntu-latest
steps:
- name: 저장소 코드 가져오기
uses: actions/checkout@v4
- name: 메시지 출력
run: echo "GitHub Actions Python Basic Workflow Running"
- name: 현재 디렉터리 확인
run: pwd
- name: 파일 목록 확인
run: ls -al3.5 GitHub에 업로드
git add .
git commit -m "add basic workflow"
git branch -M main
git remote add origin <https://github.com/계정명/github-actions-python-lab.git>
git push -u origin main3.6 확인
GitHub 저장소에서 아래 메뉴 이동
Actions
실행된 워크플로우를 확인한다.
4. 실습 2 Python 코드 자동 실행
4.1 Python 파일 생성
vi app.pyprint("Hello from Python GitHub Actions")4.2 워크플로우 작성
vi .github/workflows/02-python-run.ymlname: 02 Python Run Workflow
on:
push:
branches:
- main
jobs:
run-python:
runs-on: ubuntu-latest
steps:
- name: 저장소 코드 가져오기
uses: actions/checkout@v4
- name: Python 설치
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Python 버전 확인
run: python --version
- name: Python 파일 실행
run: python app.py4.3 업로드 및 실행 확인
git add .
git commit -m "add python run workflow"
git push5. 실습 3 Python 테스트 자동화
5.1 테스트용 코드 작성
calc.py
vi calc.pydef add(a, b):
return a + btest_calc.py
vi test_calc.pyfrom calc import add
def test_add():
assert add(2, 3) == 55.2 pytest 설치 파일 작성
vi requirements.txtpytest
5.3 테스트 워크플로우 작성
vi .github/workflows/03-python-test.ymlname: 03 Python Test Workflow
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: 저장소 코드 가져오기
uses: actions/checkout@v4
- name: Python 설치
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: pip 업그레이드
run: python -m pip install --upgrade pip
- name: 패키지 설치
run: pip install -r requirements.txt
- name: 테스트 실행
run: pytest5.4 업로드
git add .
git commit -m "add python test workflow"
git push6. 실습 4 결과 파일 생성하기
6.1 결과 파일 생성 스크립트 작성
vi generate_report.pyfrom datetime import datetime
with open("report.txt", "w", encoding="utf-8") as f:
f.write("GitHub Actions Report\\n")
f.write(f"Generated at: {datetime.now()}\\n")
print("report.txt 생성 완료")6.2 워크플로우 작성
vi .github/workflows/04-generate-report.ymlname: 04 Generate Report Workflow
on:
push:
branches:
- main
jobs:
generate-report:
runs-on: ubuntu-latest
steps:
- name: 저장소 코드 가져오기
uses: actions/checkout@v4
- name: Python 설치
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: 리포트 파일 생성
run: python generate_report.py
- name: 생성 결과 확인
run: cat report.txt7. 실습 5 아티팩트 업로드
7.1 워크플로우 수정
vi .github/workflows/05-upload-artifact.ymlname: 05 Upload Artifact Workflow
on:
push:
branches:
- main
jobs:
upload-artifact:
runs-on: ubuntu-latest
steps:
- name: 저장소 코드 가져오기
uses: actions/checkout@v4
- name: Python 설치
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: 리포트 생성
run: python generate_report.py
- name: 리포트 파일 업로드
uses: actions/upload-artifact@v4
with:
name: python-report
path: report.txt7.2 확인
실행된 워크플로우 상세 화면에서 Artifacts 영역 확인
8. 실습 6 브랜치별 실행 분기
8.1 워크플로우 작성
vi .github/workflows/06-branch.ymlname: 06 Branch Workflow
on:
push:
branches:
- main
- dev
jobs:
branch-check:
runs-on: ubuntu-latest
steps:
- name: 브랜치 이름 출력
run: echo "Current branch is ${{ github.ref_name }}"
- name: main 브랜치일 때만 실행
if: github.ref_name == 'main'
run: echo "This is main branch"
- name: dev 브랜치일 때만 실행
if: github.ref_name == 'dev'
run: echo "This is dev branch"8.2 dev 브랜치 생성 후 테스트
git checkout -b dev
echo "dev test" >> README.md
git add .
git commit -m "test dev workflow"
git push -u origin dev9. 실습 7 Secret 사용
9.1 GitHub Secret 등록
GitHub 저장소에서 아래 경로 이동
Settings → Secrets and variables → Actions → New repository secret
예시 등록
SECRET_MESSAGE = hello-github-secret
9.2 Python 파일 작성
vi secret_app.pyimport os
secret_value = os.getenv("SECRET_MESSAGE")
if secret_value:
print("SECRET_MESSAGE 값 읽기 성공")
else:
print("SECRET_MESSAGE 값 없음")9.3 워크플로우 작성
vi .github/workflows/07-secret.ymlname: 07 Secret Workflow
on:
push:
branches:
- main
jobs:
use-secret:
runs-on: ubuntu-latest
steps:
- name: 저장소 코드 가져오기
uses: actions/checkout@v4
- name: Python 설치
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Secret 사용 실행
env:
SECRET_MESSAGE: ${{ secrets.SECRET_MESSAGE }}
run: python secret_app.py10. 실습 8 EC2 자동 배포
이 실습은 GitHub Actions에서 Python 파일을 EC2로 복사하고 원격 실행하는 방식으로 진행한다.
10.1 EC2 준비
EC2에 Python 설치 확인
python3 --version없으면 설치
Ubuntu
sudo apt update
sudo apt install -y python3Amazon Linux
sudo dnf install -y python310.2 배포 대상 파일 작성
vi deploy_app.pyprint("EC2 deployed python application running")10.3 GitHub Secrets 등록
다음 값을 저장소 Secret에 등록
EC2_HOST
EC2_USER
EC2_KEY
예
EC2_HOST: 퍼블릭 IP 또는 도메인EC2_USER: ubuntu 또는 ec2-userEC2_KEY: pem 파일 전체 내용
10.4 배포 워크플로우 작성
vi .github/workflows/08-deploy-ec2.ymlname: 08 Deploy to EC2
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: 저장소 코드 가져오기
uses: actions/checkout@v4
- name: SSH 키 파일 생성
run: |
echo "${{ secrets.EC2_KEY }}" > private_key.pem
chmod 600 private_key.pem
- name: EC2 접속 테스트
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} "echo connected"
- name: 파일 전송
run: |
scp -o StrictHostKeyChecking=no -i private_key.pem deploy_app.py ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:/home/${{ secrets.EC2_USER }}/
- name: 원격 실행
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} "python3 /home/${{ secrets.EC2_USER }}/deploy_app.py"11. 실습 9 requirements 설치 후 Flask 실행으로 확장
단순 Python 파일 실행이 아니라 웹 애플리케이션으로 확장하는 단계다.
11.1 Flask 애플리케이션 작성
vi flask_app.pyfrom flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "Hello from Flask GitHub Actions"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)11.2 requirements.txt 수정
pytest
flask
11.3 EC2에서 실행 명령 변경 예시
- name: 원격 배포 및 실행
run: |
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} "
pip3 install flask &&
nohup python3 /home/${{ secrets.EC2_USER }}/flask_app.py > app.log 2>&1 &
"12. 실습용 최종 디렉터리 예시
github-actions-python-lab/
├── .github/
│ └── workflows/
│ ├── 01-basic.yml
│ ├── 02-python-run.yml
│ ├── 03-python-test.yml
│ ├── 04-generate-report.yml
│ ├── 05-upload-artifact.yml
│ ├── 06-branch.yml
│ ├── 07-secret.yml
│ └── 08-deploy-ec2.yml
├── README.md
├── app.py
├── calc.py
├── test_calc.py
├── generate_report.py
├── secret_app.py
├── deploy_app.py
├── flask_app.py
└── requirements.txt