mkdir github-actions-python-lab
cd github-actions-python-lab
git init
echo "# github-actions-python-lab" > README.md
mkdir -p .github/workflows
vi .github/workflows/01-basic.yml
name: 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 -al
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 main
GitHub 저장소에서 아래 메뉴 이동
Actions
실행된 워크플로우를 확인한다.

vi app.py
print("Hello from Python GitHub Actions")
vi .github/workflows/02-python-run.yml
name: 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.py
git add .
git commit -m "add python run workflow"
git push

vi calc.py
def add(a, b):
return a + b
vi test_calc.py
from calc import add
def test_add():
assert add(2, 3) == 5
vi requirements.txt
pytest
vi .github/workflows/03-python-test.yml
name: 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: pytest
git add .
git commit -m "add python test workflow"
git push
vi generate_report.py
from 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 생성 완료")
vi .github/workflows/04-generate-report.yml
name: 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.txt

vi .github/workflows/05-upload-artifact.yml
name: 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.txt
실행된 워크플로우 상세 화면에서 Artifacts 영역 확인

vi .github/workflows/06-branch.yml
name: 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"
git checkout -b dev
echo "dev test" >> README.md
git add .
git commit -m "test dev workflow"
git push -u origin dev

GitHub 저장소에서 아래 경로 이동
Settings → Secrets and variables → Actions → New repository secret

예시 등록
SECRET_MESSAGE = hello-github-secret

vi secret_app.py
import os
secret_value = os.getenv("SECRET_MESSAGE")
secret_value2 = os.getenv("SECRET_MESSAGE2")
if secret_value:
print("SECRET_MESSAGE 값 읽기 성공")
else:
print("SECRET_MESSAGE 값 없음")
if secret_value2:
print("SECRET_MESSAGE2 값 읽기 성공")
else:
print("SECRET_MESSAGE2 값 없음")
vi .github/workflows/07-secret.yml
name: 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 }}
SECRET_MESSAGE2: ""
run: python secret_app.py

이 실습은 GitHub Actions에서 Python 파일을 EC2로 복사하고 원격 실행하는 방식으로 진행한다.
EC2에 Python 설치 확인
python3 --version
없으면 설치
sudo apt update
sudo apt install -y python3
sudo dnf install -y python3
vi deploy_app.py
print("EC2 deployed python application running")
다음 값을 저장소 Secret에 등록
EC2_HOST
EC2_USER
EC2_KEY
예
EC2_HOST : 퍼블릭 IP 또는 도메인EC2_USER : ubuntu 또는 ec2-userEC2_KEY : pem 파일 전체 내용
vi .github/workflows/08-deploy-ec2.yml
name: 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 400 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"

단순 Python 파일 실행이 아니라 웹 애플리케이션으로 확장하는 단계다.
vi flask_app.py
from 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)
pytest
flask
- name: 파일 전송
run: |
scp -o StrictHostKeyChecking=no -i private_key.pem flask_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 }} "sudo apt install pipx -y"
ssh -o StrictHostKeyChecking=no -i private_key.pem ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} "
pipx install flask &&
nohup python3 /home/${{ secrets.EC2_USER }}/flask_app.py > app.log 2>&1 &"
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