suminworld

system

[리눅스 프로그래밍 · DevOps] GitHub Actions로 C Signal Handling Demo CI/CD 구축기

숨usm 2025. 9. 18. 15:53

전체 코드: suminworld-system-lab/signal-demo

 

suminworld-system-lab/signal-demo at main · sumin-world/suminworld-system-lab

System programming & networking lab (C, Linux, OSTEP practice) - sumin-world/suminworld-system-lab

github.com

프로젝트 구성

signal_demo.c는 다음 기능을 포함합니다:

  • SIGINT/SIGTSTP 핸들링 (Ctrl+C, Ctrl+Z)
  • SIGALRM 타이머 처리
  • SIGUSR1/SIGUSR2 사용자 정의 시그널
  • Job control 예제
  • 자동화 테스트 모드

대화형 메뉴를 통해 각 기능을 실행하며 동작을 확인할 수 있습니다. 로컬에서는 정상 작동했으나 CI 환경에서는 문제가 발생했습니다.

발생한 문제들

1. 실행 권한 오류

test.sh 스크립트에 실행 권한이 없어 CI 실패가 발생했습니다.

해결: chmod +x test.sh 후 커밋

2. 무한 대기

프로그램이 대화형 메뉴 입력을 기다리며 무한 블로킹되었습니다.

========================================
        Signal Handling Demo
========================================
Choice (0-7): ← 무한 대기

CI는 사용자 입력을 제공할 수 없어 10분 이상 실행 후 타임아웃으로 실패했습니다.

3. Timeout Exit Code

timeout 명령어 사용 시 exit code 124가 발생하여 정상 완료된 테스트도 실패로 판정되었습니다.

핵심: CI 환경은 interactive 입력을 지원하지 않습니다.

해결 방법

1. 파이프 입력

- name: Run auto_test non-interactively (60s timeout)
  run: |
    printf "7\n0\n" | timeout 60s ./signal_demo
  • 메뉴 7번(자동 테스트), 0번(종료) 자동 입력
  • stdin 파이프로 입력 주입
  • 60초 timeout 설정

2. EOF 처리

if (scanf("%d", &choice) != 1) {
    int ch;
    if (feof(stdin)) {
        printf("\nEOF detected. Exiting.\n\n");
        return 0;
    }
    // 에러 처리
}

파이프 종료 시 EOF로 인한 무한 루프를 방지했습니다.

3. 테스트 최적화

- name: Run auto_test fast (60s timeout)
  env:
    DEMO_FAST: "1"
  run: |
    printf "7\n0\n" | timeout 60s ./signal_demo

DEMO_FAST 환경변수로 CI용 빠른 테스트 모드를 구현했습니다.

프로젝트 구조

suminworld-system-lab/
 └─ signal-demo/
     ├─ signal_demo.c
     ├─ test.sh
     ├─ Makefile
     └─ .github/workflows/c-build.yml
  • make: 컴파일
  • make test: 자동 테스트
  • git push: CI 자동 실행

결과 비교

❌ 실패 상태 (초기)

Failing 상태 – 메뉴 입력 대기 중 타임아웃 발생

크플로우가 무한 대기하여 타임아웃으로 실패한 초기 CI 상태

초기에는 무한 대기와 exit code 124 문제로 지속적인 실패가 발생했습니다.

✅ 성공 상태 (개선 후)

Passing 상태 – CI 배지가 녹색으로 표시됨

모든 테스트가 통과하고 CI 배지도 녹색으로 변경됨

파이프 입력과 timeout 설정 후 정상적으로 passing 상태를 확인할 수 있었습니다.

학습 내용

  1. CI/CD 환경 특성: Interactive 입력 대신 자동화된 입력 방식 필요
  2. EOF 처리: 파이프 종료 시 무한 루프 방지 필수
  3. 효율성: 로컬/CI 환경에 맞는 테스트 모드 분리
  4. 점진적 개선: 문제를 단계적으로 해결하는 과정의 중요성
  5. DevOps 실천: 개발 코드를 자동 테스트와 배포 파이프라인까지 연결하는 경험

정리

시스템 프로그래밍 학습용 코드에서 시작해 GitHub Actions CI/CD 자동화 파이프라인 구축까지 확장되었습니다. 이 과정에서 시그널 처리, 쉘 스크립팅, DevOps 실천을 통한 개발 자동화를 경험할 수 있었습니다. Interactive 프로그램의 CI/CD 자동화는 까다로웠지만, 문제 해결 과정에서 실전 DevOps 기술을 체득할 수 있었습니다 🙂


📦 참고 자료

전체 소스코드: GitHub - signal-demo

 

suminworld-system-lab/signal-demo at main · sumin-world/suminworld-system-lab

System programming & networking lab (C, Linux, OSTEP practice) - sumin-world/suminworld-system-lab

github.com

 

CI 워크플로우: c-build.yml

 

suminworld-system-lab/.github/workflows/c-build.yml at main · sumin-world/suminworld-system-lab

System programming & networking lab (C, Linux, OSTEP practice) - sumin-world/suminworld-system-lab

github.com