TeX를 GiitHub Actions로 컴파일하여 PDF를 Releases에 업로드

개시하다


GiitHub Action을 통해 TeX 파일을 컴파일하는 작업을 만들었습니다.
tsukuba-mas/platex-action
TeX 파일이 있는 저장소platex-action로 지정하면 PDF 파일이 컴파일됩니다.

platex-action


platex-action의 제작은 다음과 같은 기술을 사용한다.
  • Dockerfile
  • action.yml
  • shell script
  • 비망록을 위해 따로 설명하다.

    Dockerfile


    GiitHub Action에서는 Action에서 Docker file을 지정할 수 있습니다.
    Docker file을 만들고 지정하면 Action이 실행될 때 Docker file을 구축하고 컨테이너를 실행합니다.
    Docker file은 주로 コンテナがシェルスクリプトを実行するための環境構築를 담당합니다.
    예를 들어 이번에는 aruneko/texlive:latest의 인상을 바탕으로 한다.
    그런 다음 컨테이너를 실행할 때 필요한 파일을 준비하기 위해 COPY 명령을 사용하여 만든 이미지에 배치합니다.(배치된 파일은 이미지에서 컨테이너를 생성할 때 입력점, 즉 셸 스크립트에서 사용됩니다.)
    그런 다음 ENTRYPOINT에서 수행하는 하우징 스크립트를 지정합니다.
    FROM aruneko/texlive:latest
    COPY entrypoint.sh /entrypoint.sh
    COPY .latexmkrc /.latexmkrc
    RUN ["chmod", "+x", "/entrypoint.sh"]
    ENTRYPOINT [ "/entrypoint.sh" ]
    
    GiitHub Actions를 실행할 때 Docker file에서 이미지를 구성하여 컨테이너를 만듭니다.
    그리고 실행/entrypoint.sh.
    이때 entrypoint.sh 용기의 맨 위에 있는 디렉터리입니다.
    왜냐면 COPY/가 구성했기 때문입니다.
    그러나 용기의 글자 디렉터리는 현재 디렉터리가 루트 디렉터리가 아닙니다.
    예를 들어 actions/checkout@v2를 실행한 경우 /github/workspace에서 체크아웃한 파일을 확장합니다.
    그리고 현재 디렉터리도 /github/workspace입니다.
    컨테이너를 실행할 때 현재 디렉토리는 다른 Action 또는 WORKDIR에 따라 달라집니다.

    action.yml


    action.yml은 GiitHub Action 설정에 필요한 파일입니다.
    이번 기술은 아래와 같다.
    name: "platex Action"
    author: "mas-tsukuba"
    description: "Compile tex file with platex"
    inputs:
      LATEX_FILE_NAME:
        description: "Compile Tex File"
        required: true
        default: "main.tex"
    runs:
      using: "docker"
      image: "Dockerfile"
    
    의 특징은inputs이다.inputs는 동작을 사용하고자 하는 측의 창고에서 변수를 자유롭게 설정할 수 있도록 하기 위한 것이다.
    예를 들어 hoge와 같은 창고에서 컴파일하고자 하는 TeX 파일은 thesis.pdf인 경우다.
    이때hoge/.github/workflows/main.yml 등은 다음과 같이 설정할 수 있다.
    이렇게 하면 이용하는 hoge에서 파라미터를 자유롭게 바꿀 수 있다.
          - name: Compile Tex File
            id: compile_tex_file
            uses: tsukuba-mas/platex-action@main
            with:
              LATEX_FILE_NAME: "thesis.tex"
    
    이렇게 하려면 Action 측에서 이 매개변수를 사용해야 합니다.(물론 고정 문자열을 사용하면 사용자가 매개 변수의 내용을 자유롭게 수정할 수 없습니다.)
    따라서 inputs에 매개변수를 설정합니다.
    이 매개 변수는 Dockerfile에 지정된 entrypoint.sh와 같은 셸 스크립트에 $INPUT_LATEX_FILE_NAMEINPUT를 추가하는 데 사용할 수 있습니다.

    shell script


    케이스 스크립트를 사용하여 용기에서 실행할 명령을 실행합니다.
    Docker file로 구성된 환경이므로 수행하려는 명령만 기술합니다.cp /.latexmkrc .latexmkrc는 Docker file을 제작할 때 복사됩니다.latexmkrc 파일을 현재 디렉터리로 다시 복사합니다.
    이미지 제작 시 디렉토리에 .latexmkrc를 배치하더라도 다른 작업을 먼저 수행하면 현재 디렉토리 자체가 변경되기 때문입니다.
    checkkout action 등에 디렉토리를 설정할 수 있습니다.
    따라서 그림을 만들 때 루트에 있고 스크립트가 실행될 때 현재 디렉터리를 가져옵니다..latexmkrc 일부러 가져온 것은 사용자 측의 창고에 .latexmkrc 파일이 준비되어 있지 않았기 때문이다.
    따라서 사용자 측의 창고가 아니라면 기본.latexmkrc으로Action의 창고.latexmkrc를 제공한다.
    #!/bin/bash
    
    # . = /github/workspace if actions/checkout
    set -eux
    
    if [ ! -f .latexmkrc ]; then
        cp /.latexmkrc .latexmkrc
    fi
    
    # make pdf
    latexmk $INPUT_LATEX_FILE_NAME
    
    INPUT_LATEX_FILE_NAME를 통해 컴파일된 TeX 파일을 제공합니다.

    PDF 업로드


    platex-action를 사용하여 TeX 파일을 PDF 파일로 컴파일할 수 있습니다.
    하지만 이렇게 번역만 했습니다.
    어렵게 만든 PDF 파일도 그대로 용기와 함께 삭제됐다.
    따라서 actions/create-releaseactions/upload-release-asset@v1를 이용한다.
    create-release는 디렉터리 actions/checkout@v2 의 파일을 Zip 파일로 발표합니다.

    그리고 upload-release-asset를 사용하면 Release에서만 특정한 파일을 만들 수 있습니다.(위 이미지/github/workspace이것들은 PDF가 발표될 때까지 main.pdf에 yaml 파일을 쓸 수 있다.
    on:
      push:
        tags:
          - "v*"
    
    jobs:
      test_job:
        runs-on: ubuntu-latest
        name: Example of compiling pdf
        steps:
          # make pdf
          # LATEX_FILE_NAME -> main.pdf generated
          - name: Set up Git repository
            uses: actions/checkout@v2
          - name: Compile Tex File
            id: compile_tex_file
            uses: tsukuba-mas/platex-action@main
            with:
              LATEX_FILE_NAME: "main.tex"
          # Create Release
          - name: Create Release
            id: create_release
            uses: actions/create-release@v1
            env:
              GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
            with:
              tag_name: ${{github.ref}}
              release_name: Release ${{ github.ref }}
              body: |
                Compiled PDF ${{github.ref}}
              draft: false
              prerelease: false
          # Upload Asset main.pdf
          - name: Upload Release Asset
            id: upload_release_asset
            uses: actions/upload-release-asset@v1
            env:
              GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
            with:
              upload_url: ${{ steps.create_release.outputs.upload_url }}
              asset_path: ./main.pdf
              asset_name: main.pdf
              asset_content_type: application/pdf
    
    your-tex-repository/.github/workflows/tex.yamlCreate Release에서 사용자는 라벨명, 발행명, 기사를 발행하는 바디 등을 제공한다.
    또한 with에서 upload_url와 같이 지정하면 steps.create_release.outputs.upload_url 용기의 출력을 재사용할 수 있다.

    최후


    GiitHub Actions를 사용하여 TeX 파일을 컴파일하여 PDF를 만들었습니다.
    또한 릴리즈와 UPad 작업을 사용하여 PDF를 업로드했습니다.
    공식적인 액션과 조합하면 간단하게 올릴 수 있어서 좋아요.
    많이 배웠어요.
    GiitHub Action에 더 익숙해지고 싶습니다.

    좋은 웹페이지 즐겨찾기