홈 › CI/CD › 02 / 7

GitHub Actions 기초

섹션 7진행 0 / 7

3. 코드 예제

예제 1: 워크플로 파일 작성 — 01_actions_basics.sh 발췌

bash
mkdir -p .github/workflows src
cat > .github/workflows/ci.yml <<'YML'
name: CI
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  workflow_dispatch:
  schedule:
    - cron: '0 3 * * 1'
# jobs: 이하 build 잡(steps)은 2.1·2.5~2.6, 예제 2 참고
YML
cat .github/workflows/ci.yml
text
== 1. 워크플로 파일 만들기 ==
name: CI
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  workflow_dispatch:
  schedule:
    - cron: '0 3 * * 1'

heredoc 으로 ci.yml 을 만들고 바로 cat 으로 확인했습니다. 실제 파일에는 jobs: 아래 build 잡 전체가 이어지며(예제 2), 저장소에 이 파일 하나만 커밋하면 Actions 가 자동으로 인식합니다.

예제 2: run 과 uses 세기 — 01_actions_basics.sh 발췌

bash
echo "uses 스텝: $(grep -c '\- uses:' .github/workflows/ci.yml)개 (러너가 제공하는 재사용 액션)"
echo "run 스텝: $(grep -c '^\s*run:' .github/workflows/ci.yml)개 (셸 명령을 직접 실행)"; grep -n -- '- uses:\|- name:\|run:' .github/workflows/ci.yml
text
== 3. run 과 uses 세기 ==
uses 스텝: 4개 (러너가 제공하는 재사용 액션)
run 스텝: 4개 (셸 명령을 직접 실행)
20:      - uses: actions/checkout@v4
21:      - uses: actions/setup-java@v4
25:      - uses: actions/cache@v4
29:      - name: 자바 버전 확인
30:        run: echo "Java 버전: ${{ matrix.java }}"

grep -c 로 두 종류 스텝의 개수를 세고, grep -n 으로 줄 번호와 함께 나열했습니다(이하 컴파일·실행·업로드 스텝은 예제 1 의 전체 yml 참고). uses: 와 run: 이 번갈아 나오는 모습이 실제 워크플로와 같습니다.

예제 3: 미니 러너로 run 단계 실행 — 01_actions_basics.sh 발췌

bash
run_workflow() {
  local yml="$1"; shift
  local old_path="$PATH"
  export PATH="$JAVA_BIN:$PATH"
  grep '^\s*run:' "$yml" | sed -E 's/^\s*run:\s*//' | while IFS= read -r cmd; do
    local c="$cmd"
    for kv in "$@"; do
      c="${c//${kv%%=*}/${kv#*=}}"
    done
    echo "\$ $c"
    eval "$c" 2>&1 | sed "s#${DEPLOY_TOKEN}#***#g"
  done
  export PATH="$old_path"
}
run_workflow .github/workflows/ci.yml "\${{ matrix.java }}=21" "\${{ secrets.DEPLOY_TOKEN }}=$DEPLOY_TOKEN"
text
== 6. 로컬 미니 러너로 run 단계 실행 ==
$ echo "Java 버전: 21"
Java 버전: 21
$ echo "token=s3cr3t-abc123"
token=***
$ javac -d out src/Main.java
$ java -cp out Main
CI build ok

run: 줄을 뽑아 표현식을 치환한 뒤 한 줄씩 실행했습니다. 시크릿 값은 실제로 echo 됐지만 sed 마스킹으로 로그에는 *** 만 남아, GitHub 의 자동 마스킹과 같은 효과를 냅니다.

예제 4: 아티팩트로 올릴 파일 확인 — 01_actions_basics.sh 발췌

bash
mkdir -p build-output && cp -r out/. build-output/
find build-output -type f | sort
"$JAVA_BIN/javap" -p build-output/Main.class | grep -v '^Compiled from'
text
== 7. 아티팩트로 업로드할 파일 확인 ==
build-output/Main.class
public class Main {
  public Main();
  public static void main(java.lang.String[]);
}

actions/upload-artifact 가 올릴 폴더를 build-output 으로 흉내 내고, javap 로 컴파일된 클래스가 맞는지 확인했습니다. 실제 Actions 화면에서는 이 폴더가 zip 으로 묶여 다운로드 버튼에 나타납니다.