GitHub에서만 Latex를 컴파일하고 PDF를 릴리스에 업로드

6715 단어 GitHubLaTeX

동기 부여



GitHub에 대한 push를 트리거로 컴파일이나 lint를 실시해 계속적으로 코드를 전달하는 CI가 개발 프로세스의 중요한 요소가 되어 왔습니다. 평소부터 Circle CI나 Travis CI를 괴롭히는 사람이 논문을 쓰려고 했을 때, 새로운 커밋에 대해 최신 PDF를 자동으로 만들어 주면 기쁘다고 생각하는 것은 자연스러운 일입니다.

이 기사에서는 Circle CI 등의 외부 CI 환경을 사용하지 않고, 최근 릴리즈 된 GitHub Actions을 사용하여 PDF 빌드에서 GitHub Releases에 업로드까지 모두 GitHub에서 수행하는 방법에 대해 설명합니다.

이전 준비



이 기사에서는 GitHub Actions를 사용하여 PDF를 컴파일합니다.
아직 액세스 할 수없는 분은 여기에서 가입하여 액세스 할 수있을 때까지 기다리십시오.

주제



GitHub Actions는 모든 명령을 Docker 컨테이너에서 실행합니다.
명령은 Dockerfile을 준비하여 모든 명령을 직접 만들 수 있습니다.
여기서는 다음 디렉토리에 파일이 배치되어 있다고 가정합니다.
.
|-- .github
    |-- actions
       |-- latex
          |-- Dockerfile
          |-- entrypoint.sh
     |-- main.workflow
|- main.tex 

먼저 Latex를 컴파일하기위한 Dockerfile을 작성합니다.
FROM ubuntu:16.04

RUN apt-get update \
  && apt-get install -y --no-install-recommends \
    curl \
    python3 \
    latexmk \
    lmodern \
    texlive \
    texlive-latex-extra \
    texlive-lang-japanese \
  && rm -rf /var/lib/apt/lists/*

RUN mktexlsr && mkdir -p /app
WORKDIR /app

ADD entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

GitHub Actions에서 위의 Dockerfile을 빌드하여 Latex를 컴파일하고 GitHub Releases에 업로드하는 데 필요한 명령을 설치 한 컨테이너를 만들 수 있습니다.

그런 다음 entrypoint는 다음과 같이 구현되었습니다.

entrypoint.sh
#!/bin/bash
set -eux

# build pdf (change if necessary)
pdflatex main.tex

# create release
res=`curl -H "Authorization: token $GITHUB_TOKEN" -X POST https://api.github.com/repos/[user]/[repo]/releases \
-d "
{
  \"tag_name\": \"v$GITHUB_SHA\",
  \"target_commitish\": \"$GITHUB_SHA\",
  \"name\": \"v$GITHUB_SHA\",
  \"draft\": false,
  \"prerelease\": false
}"`

# extract release id
rel_id=`echo ${res} | python3 -c 'import json,sys;print(json.load(sys.stdin)["id"])'`

# upload built pdf
curl -H "Authorization: token $GITHUB_TOKEN" -X POST https://uploads.github.com/repos/[user]/[repo]/releases/${rel_id}/assets?name=main.pdf\
  --header 'Content-Type: application/pdf'\
  --upload-file main.pdf
[user][repo] 부분은 자신의 것으로 대체하십시오. GitHub Actions 실행 중에는 여러 환경 변수가 자동으로 설정됩니다. GITHUB_TOKEN는 그 중 하나이며 GitHub Actions가 실행될 때마다 실행 시간에만 사용할 수있는 OAuth 토큰이 설정됩니다.

GitHub Releases API는 여기을 참조하십시오.

마지막으로 workflow를 정의합니다.

main.workflow
workflow "Build PDF" {
  on = "push"
  resolves = ["Build"]
}

action "Build" {
  uses = "./.github/actions/latex"
  secrets = ["GITHUB_TOKEN"]
}

아래 secrets = ["GITHUB_TOKEN"]가 없으면 환경 변수에 토큰이 설정되지 않으므로 필수입니다.

완성된 main.workflow는 GitHub의 뷰어에서 보면 다음과 같은 느낌이 듭니다.


실행 결과



위의 GitHub Actions가 설정된 상태에서 커밋이 푸시되면 다음과 같이 Github Releases가 생성되어 PDF가 첨부됩니다.


릴리스의 작성자가 github-actions인 것이 재미있네요.

참고문헌


  • h tps : // 마케치 ps. 네 t / chi p / 363 / 푸 b sh sh an du p p a d
  • htps : // v.ぁsss d. jp / e tc / giteu b-a c chion s-o g /
  • 좋은 웹페이지 즐겨찾기