diff --git a/checkout-repository/action.yml b/checkout-repository/action.yml new file mode 100644 index 0000000..34571a7 --- /dev/null +++ b/checkout-repository/action.yml @@ -0,0 +1,73 @@ +name: 특정 저장소 체크아웃 +description: Git 인증 정보를 사용해 특정 저장소와 브랜치를 수동으로 체크아웃 + +inputs: + repository-url: + required: true + description: 체크아웃할 Git 저장소 URL + username: + required: true + description: Git 인증 사용자명 + access-token: + required: true + description: Git 인증 토큰 + branch: + required: false + default: develop + description: 체크아웃할 브랜치 + path: + required: false + default: "." + description: 저장소를 체크아웃할 경로 + +runs: + using: composite + steps: + - name: 특정 저장소 체크아웃 + shell: bash + env: + GIT_REPOSITORY_URL: ${{ inputs.repository-url }} + GIT_USERNAME: ${{ inputs.username }} + GIT_ACCESS_TOKEN: ${{ inputs.access-token }} + GIT_BRANCH: ${{ inputs.branch }} + CHECKOUT_PATH: ${{ inputs.path }} + run: | + set -euo pipefail + + SUDO="" + [ "$(id -u)" -ne 0 ] && SUDO="sudo" + + if ! command -v git >/dev/null 2>&1; then + if command -v apt-get >/dev/null 2>&1; then + $SUDO apt-get update + $SUDO apt-get install -y --no-install-recommends git ca-certificates + else + echo "git이 없습니다. git을 설치한 러너가 필요합니다." + exit 1 + fi + fi + + ASKPASS_FILE="$(mktemp)" + cleanup() { + rm -f "$ASKPASS_FILE" + } + trap cleanup EXIT + + cat > "$ASKPASS_FILE" <<'EOF' + #!/bin/sh + case "$1" in + *Username*) echo "$GIT_USERNAME" ;; + *Password*) echo "$GIT_ACCESS_TOKEN" ;; + esac + EOF + chmod 700 "$ASKPASS_FILE" + + export GIT_ASKPASS="$ASKPASS_FILE" + export GIT_TERMINAL_PROMPT=0 + + mkdir -p "$CHECKOUT_PATH" + git clone \ + --branch "$GIT_BRANCH" \ + --single-branch \ + "$GIT_REPOSITORY_URL" \ + "$CHECKOUT_PATH"