GitHub에서 작업하는 팀은 이벤트 데이터를 사용하여 협업합니다. 이슈, 풀 리퀘스트, 댓글로 기록된 데이터는 프로젝트를 이해하는 데 매우 중요합니다.
GitHub Actions의 일반 가용성으로 리포지토리의 GitHub 이벤트 데이터에 프로그래밍 방식으로 액세스하고 보존할 수 있습니다. 데이터를 저장소 자체의 일부로 만드는 것은 GitHub 외부에서 데이터를 보존하는 방법입니다. 또한 GitHub 페이지와 같이 전면 웹사이트에 데이터를 표시할 수 있는 기능도 제공합니다.
그리고 저와 같다면 GitHub 이슈 댓글을 멋진 90년대 방명록 페이지로 바꿀 수 있습니다.
사용법에 관계없이 기본 개념은 동일합니다. 하나의 워크플로 파일로 작업을 사용하여 GitHub 이벤트 데이터에 액세스, 보존 및 표시할 수 있습니다. 프로세스를 설명하기 위해 내 방명록을 빛나게 하는 워크플로 코드를 안내해 드리겠습니다.
워크플로가 트리거되는 방법을 포함하여 GitHub 작업에 대한 소개를 보려면 GitHub 작업을 사용한 경량의 도구에 구애받지 않는 CI/CD 흐름을 참조하세요.
GitHub 이벤트 데이터 액세스
작업 워크플로는 일부 기본 환경 변수가 있는 환경에서 실행됩니다. 이벤트 데이터를 비롯한 많은 편리한 정보를 얻을 수 있습니다. 이벤트 데이터에 액세스하는 가장 완벽한 방법은 $GITHUB_EVENT_PATH
를 사용하는 것입니다. 변수, 완전한 JSON 이벤트 페이로드가 있는 파일의 경로입니다.
확장된 경로는 /home/runner/work/_temp/_github_workflow/event.json
과 같습니다. 해당 데이터는 웹훅 이벤트에 해당합니다. GitHub REST API 이벤트 유형 및 페이로드에서 웹훅 이벤트 데이터에 대한 설명서를 찾을 수 있습니다. 워크플로 환경에서 JSON 데이터를 사용할 수 있도록 하려면 jq
와 같은 도구를 사용할 수 있습니다. 이벤트 데이터를 구문 분석하여 환경 변수에 넣습니다.
아래에서 문제 댓글 이벤트에서 댓글 ID를 가져옵니다.
ID="$(jq '.comment.id' $GITHUB_EVENT_PATH)"
대부분의 이벤트 데이터는 github.event
를 통해서도 사용할 수 있습니다. JSON을 구문 분석할 필요 없이 컨텍스트 변수. 동일한 주석 ID를 가져오는 아래 예에서와 같이 필드는 점 표기법을 사용하여 액세스됩니다.
ID=${{ github.event.comment.id }}
내 방명록의 경우 사용자의 핸들과 날짜 및 시간으로 항목을 표시하고 싶습니다. 다음과 같이 이 이벤트 데이터를 캡처할 수 있습니다.
AUTHOR=${{ github.event.comment.user.login }}
DATE=${{ github.event.comment.created_at }}
셸 변수는 데이터 액세스에 편리하지만 일시적입니다. 워크플로 환경은 실행할 때마다 새로 생성되며 한 단계에서 설정된 셸 변수라도 다른 단계에서는 유지되지 않습니다. 캡처한 데이터를 유지하려면 아티팩트를 사용하거나 저장소에 커밋하는 두 가지 옵션이 있습니다.
이벤트 데이터 보존:아티팩트 사용
아티팩트를 사용하면 리포지토리에 커밋하지 않고 워크플로 작업 간에 데이터를 유지할 수 있습니다. 예를 들어 데이터를 더 영구적인 위치에 넣기 전에 데이터를 변환하거나 통합하려는 경우에 유용합니다. 다음과 같은 이유로 워크플로 작업 간에 데이터를 유지해야 합니다.
워크플로의 각 작업은 가상 환경의 새로운 인스턴스에서 실행됩니다. 작업이 완료되면 러너는 가상 환경의 인스턴스를 종료하고 삭제합니다. (아티팩트를 사용하여 워크플로 데이터 유지)
아티팩트 사용을 지원하는 두 가지 작업:upload-artifact
및 download-artifact
. 이러한 작업을 사용하여 동일한 워크플로의 다른 작업에서 파일을 사용할 수 있도록 할 수 있습니다. 전체 예는 워크플로에서 작업 간에 데이터 전달을 참조하세요.
upload-artifact
액션의 action.yml
키워드에 대한 설명이 포함되어 있습니다. 업로드된 파일은 .zip
에 저장됩니다. 체재. 동일한 워크플로 실행의 다른 작업은 download-artifact
를 사용할 수 있습니다. 다른 단계에서 데이터를 활용하기 위한 조치입니다.
저장소의 작업 탭 아래에 있는 워크플로 실행 페이지에서 아카이브를 수동으로 다운로드할 수도 있습니다.
작업 간에 워크플로 데이터를 유지하면 생성된 아티팩트가 워크플로 환경에서만 라이브이므로 리포지토리 파일이 변경되지 않습니다.
개인적으로 쉘 환경에서 작업하는 것이 편하기 때문에 아티팩트에 대한 사용 사례가 좁다는 것을 알지만 언급하지 않기를 꺼려했습니다. 작업 간에 데이터를 전달하는 것 외에도 .zip
을 생성하는 데 유용할 수 있습니다. 예를 들어 테스트 출력 데이터의 형식 아카이브. 내 방명록 예제의 경우, 한 작업에서 필요한 모든 단계를 단순히 실행하여 작업 간에 데이터를 전달할 필요가 없었습니다.
이벤트 데이터 보존:워크플로 파일을 저장소로 푸시
워크플로에서 캡처한 데이터를 리포지토리 자체에 보존하려면 이 데이터를 Git 리포지토리에 추가하고 푸시해야 합니다. 데이터로 새 파일을 만들거나 셸 명령을 사용하여 기존 파일에 데이터를 추가하여 워크플로에서 이 작업을 수행할 수 있습니다.
워크플로에서 파일 만들기
워크플로에서 리포지토리 파일로 작업하려면 checkout
을 사용하세요. 작업할 사본을 먼저 얻기 위한 조치:
- uses: actions/checkout@master
with:
fetch-depth: 1
내 방명록에 주석을 추가하기 위해 셸 변수에 캡처된 이벤트 데이터를 적절한 파일로 변환하고 셸 매개변수 확장의 대체를 사용하여 사용자 입력을 삭제하고 줄 바꿈을 단락으로 변환합니다. 사용자 입력을 신중하게 처리해야 하는 이유에 대해 이전에 쓴 적이 있습니다.
- name: Turn comment into file
run: |
ID=${{ github.event.comment.id }}
AUTHOR=${{ github.event.comment.user.login }}
DATE=${{ github.event.comment.created_at }}
COMMENT=$(echo "${{ github.event.comment.body }}")
NO_TAGS=${COMMENT//[<>]/\`}
FOLDER=comments
printf '%b\n' "<div class=\"comment\"><p>${AUTHOR} says:</p><p>${NO_TAGS//$'\n'/\<\/p\>\<p\>}</p><p>${DATE}</p></div>\r\n" > ${FOLDER}/${ID}.html
printf
를 사용하여 >
로 출력을 지시합니다. 새 파일로 변환하면 이벤트 데이터가 캡처된 이벤트 데이터를 포함하는 주석 ID 번호로 명명된 HTML 파일로 변환됩니다. 형식은 다음과 같습니다.
<div class="comment">
<p>victoriadrake says:</p>
<p>This is a comment!</p>
<p>2019-11-04T00:28:36Z</p>
</div>
주석으로 작업할 때 주석 ID를 사용하여 파일 이름을 지정하면 동일한 ID를 가진 새 파일이 이전 파일을 덮어씁니다. 댓글을 수정하면 원본 댓글 파일을 대체할 수 있으므로 방명록에 유용합니다.
Hugo와 같은 정적 사이트 생성기를 사용하는 경우 Markdown 형식 파일을 빌드하여 content/
에 추가할 수 있습니다. 폴더에 있고 나머지는 일반 사이트 빌드에서 처리합니다.
내 단순한 방명록의 경우 개별 댓글 파일을 페이지로 통합하는 추가 단계가 있습니다. 실행할 때마다 기존 index.html
을 덮어씁니다. header.html
사용 부분(>
), 찾아 추가(>>
) 모든 주석 파일의 내용을 내림차순으로 만들고 마지막으로 footer.html
을 추가합니다. 페이지를 끝내는 부분입니다.
- name: Assemble page
run: |
cat header.html > index.html
find comments/ -name "*.html" | sort -r | xargs -I % cat % >> index.html
cat footer.html >> index.html
저장소에 변경 사항 커밋
checkout
이후 작업은 리포지토리를 복제하는 것과 완전히 동일하지 않습니다. 작성 당시에는 여전히 해결해야 할 몇 가지 문제가 있습니다. pull
에는 몇 가지 추가 단계가 필요합니다. , checkout
, 성공적으로 push
master
로 다시 변경 하지만 이것은 셸에서 아주 간단하게 수행됩니다.
다음은 워크플로에서 변경한 내용을 저장소의 master
에 다시 추가, 커밋 및 푸시하는 단계입니다. 지점.
- name: Push changes to repo
run: |
REMOTE=https://${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
git config user.email "${{ github.actor }}@users.noreply.github.com"
git config user.name "${{ github.actor }}"
git pull ${REMOTE}
git checkout master
git add .
git status
git commit -am "Add new comment"
git push ${REMOTE} master
원격, 실제로 우리의 저장소는 github.repository
를 사용하여 지정됩니다. 컨텍스트 변수. 워크플로가 마스터로 푸시되도록 하려면 secrets.GITHUB_TOKEN
을 사용합니다. 변수.
워크플로 환경은 반짝거리고 새로 생겨났기 때문에 Git을 구성해야 합니다. 위의 예에서는 github.actor
를 사용했습니다. 워크플로를 시작하는 계정의 사용자 이름을 입력하는 컨텍스트 변수입니다. 이메일은 기본 noreply
를 사용하여 유사하게 구성됩니다. GitHub 이메일 주소.
이벤트 데이터 표시
2019년 11월 6일 수정:GitHub Actions에서 페이지 사이트 빌드를 트리거하려면 개인 액세스 토큰이 필요합니다.
기본 secrets.GITHUB_TOKEN
으로 GitHub 페이지를 사용하는 경우 변수를 사용하고 사이트 생성기가 없으면 워크플로의 리포지토리에 변경 사항을 푸시하면 리포지토리 파일만 업데이트됩니다. GitHub 페이지 빌드는 "사이트 빌드에 문제가 있습니다:페이지 빌드 실패" 오류와 함께 실패합니다.
페이지 사이트 빌드를 트리거하는 작업을 활성화하려면 개인 액세스 토큰을 만들어야 합니다. 이 토큰은 저장소 설정에 비밀로 저장하고 기본 secrets.GITHUB_TOKEN
대신 워크플로에 전달할 수 있습니다. 변하기 쉬운. 이 게시물에서 Actions 환경 및 변수에 대해 자세히 썼습니다.
개인 액세스 토큰을 사용하면 작업 워크플로에 의해 시작된 푸시가 페이지 사이트도 업데이트합니다. 제 방명록에 댓글을 남겨주시면 직접 보실 수 있습니다! 댓글 작성 이벤트는 워크플로를 트리거한 다음 방명록 페이지를 실행하고 업데이트하는 데 약 30초에서 1분 정도 걸립니다.
Hugo를 사용할 때와 같이 변경 사항을 게시하기 위해 사이트 빌드가 필요한 경우 Action에서도 이 작업을 수행할 수 있습니다. 그러나 의도하지 않은 루프 생성을 방지하기 위해 한 작업 워크플로에서 다른 작업을 트리거하지 않습니다. 대신 모든 워크플로에서 실행할 수 있는 Makefile을 사용하여 사이트를 구축하는 프로세스를 처리하는 것이 매우 편리합니다. 필요한 경우 저장소 토큰을 사용하여 워크플로 작업의 마지막 단계로 Makefile 실행을 추가하기만 하면 됩니다.
- name: Run Makefile
env:
TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: make all
이렇게 하면 워크플로의 마지막 단계에서 업데이트된 사이트를 구축하고 배포할 수 있습니다.
더 이상 이벤트 데이터 지평선이 없습니다.
GitHub Actions는 이벤트 데이터를 캡처하고 활용하는 깔끔한 방법을 제공하므로 GitHub 내에서만 사용할 수 없습니다. 가능성은 당신의 상상만큼만 제한됩니다! 다음은 이를 통해 만들 수 있는 몇 가지 아이디어입니다.
- GitHub 계정이 없는 고객이 프로젝트 문제를 보고 피드백을 제공할 수 있는 공개 문제 게시판입니다.
- 모든 저장소에 대한 새로운 문제, 의견 또는 PR에 대한 RSS 피드 자동 업데이트
- GitHub 이슈 댓글을 입력 방식으로 활용하는 정적 사이트용 댓글 시스템
- 멋진 90년대 방명록 페이지입니다.
내가 90년대 방명록 페이지를 만들었다고 언급했습니까? 내 내면의 Geocities-nerd는 약간 흥분합니다.