GitHub アクション用のコンテナーの設計


GitHub actions は、GitHub イベントによってトリガーされるワークフローです.それらは非常に柔軟で、デフォルトで「ベア」オペレーティング システム ランナーで実行されますが、さらに、 hosted in user-provided containers にすることもできます.問題は、GitHub がこれらのコンテナに特定のサービスと構造があることを期待していることです.これは、標準またはプレーン コンテナを使用する場合の問題です.

this container の作成、および GitHub community の複数の質問を通じて、コンテナーをワークフローでシームレスに使用するために必要なものは何かを発見しました.ヒントは次のとおりです.

GHA ユーザーは UID=1001 です



Linux システムで最初に作成するユーザーの UID は 1000 ですが、GHA は少し特殊で、UID 1001 を使用します.したがって、この Raku container で行われているように、その UID をユーザーに使用することをお勧めします.

FROM alpine:latest as base

ARG RAKU_RELEASE=2021.12

ENV PKGS="git make gcc musl-dev perl linux-headers bash"

RUN apk update && apk upgrade \
    && apk add --no-cache $PKGS \
    && git clone --depth 1 --branch ${RAKU_RELEASE} https://github.com/MoarVM/MoarVM.git \
    && cd MoarVM \
    && perl Configure.pl --prefix /usr \
    && make --print-data-base \
    && make install\
    && cd .. \
    && git clone --depth 1 --branch ${RAKU_RELEASE} git://github.com/Raku/nqp.git \
    && cd nqp \
    && perl Configure.pl --backends=moar --prefix /usr \
    && make install \
    && cd .. \
    && git clone --depth 1 --branch ${RAKU_RELEASE} https://github.com/rakudo/rakudo.git \
    && cd rakudo \
    && perl Configure.pl --backends=moar --prefix /usr \
    && make install \
    && ls /usr/share/nqp/

FROM alpine:latest
ARG UID=1000

LABEL version="0.5.0" maintainer="[email protected]" raku_release=${RAKU_RELEASE} raku_user_uid=${UID}

COPY --from=base /usr/lib/libmoar.so /usr/lib
COPY --from=base /usr/share/nqp/ /usr/share/nqp
COPY --from=base /usr/share/perl6/ /usr/share/perl6
COPY --from=base /usr/bin/moar /usr/bin/nqp /usr/bin/raku /usr/bin/perl6 /usr/bin/rakudo /usr/bin/


RUN mkdir /github \
    && addgroup -S raku  && adduser -S raku -G raku --uid ${UID}

USER raku
WORKDIR /home/raku

ENTRYPOINT ["raku"]


少し長めですが、実際の取引はこれらの線のすぐ上です.デフォルトでその UID を使用できますが、私の場合は、GHS で後でさらに変更が必要になった場合に備えて、2 つのバージョンが必要でした.

Spoiler: I did



したがって、UID を運ぶ ARG を使用します.デフォルトでは 1000 です.GHA には特定の build-arg があります.そして、それはそれです.

それだけですか?あまり.

GHAはホームをリセットします



コンテナはディレクトリを /github/home にマウントし、それを $HOME と呼びます.本当に know why ではありませんが、そうです.これは、ホームが最初にインストールに使用された場所であることを期待するコンテナーの言語で、少し大混乱を引き起こす可能性があります.これは、ジョブ レベルで HOME を手動で設定するだけで簡単に修正できますが、インストールされているモジュールの検索パスを調整することで修正することもできます.これは、Raku の場合は setting RAKULIB を意味します.

FROM ghcr.io/jj/raku-gha

ENV PKGS="git tar" PKGS_TMP="make gcc linux-headers musl-dev" WORKDIR="/home/raku"
LABEL version="1.0.3" maintainer="[email protected]" rakuversion=$VER

USER root
RUN apk update && apk upgrade && apk add --no-cache $PKGS $PKGS_TMP
USER raku

# Environment
ENV PATH="${WORKDIR}/.raku/bin:${WORKDIR}/.raku/share/perl6/site/bin:${PATH}" \
    ENV="${WORKDIR}/.profile"\
    RAKULIB="inst#/home/raku/.raku"

# Basic setup, programs and init
WORKDIR $WORKDIR
RUN git clone --depth 1 https://github.com/ugexe/zef.git \
    && cd zef && raku -I. bin/zef install . \
    && zef install Linenoise \
    && cd .. && rm -rf zef

USER root
RUN apk del $PGKS_TMP
USER raku

ENTRYPOINT ["raku"]


ベース イメージで明らかになったように、これは既に GHA 固有のものです. $RAKULIB はファイルの途中で定義されており、inst# プレフィックスは、既にプリコンパイルされて準備ができていることを示しています. Raku は最初にそこを検索し、次に想定される場所 inst#/github/home/.raku に進みます.生容器に記載のあるところ.常に空になりますか? Rakuによるディストリビューションのインストールに使用されるため、キャッシュする場所になるため、ロングショットではありません.しかし、最初に何か他のものが必要です.

Check also that we're including git in this image. Also useful for the checkout action (although this one has all kinds of defaults, and it's not actually essential).



ここ 最初に GNU tar をインストールする必要があります



Alpine はコンテナー用の驚くべき小さなディストリビューションですが、その魅力の一部は、多くの外部ユーティリティを に入れ、tar を含むという事実に由来しています.ただし、明らかに文書化されていない動きで、BusyBox はアーティファクトの保存と復元に BSD または the caching GHA を使用しています.つまり、コンテナに必要です.上記を確認してください:

ENV PKGS="git tar" PKGS_TMP="make gcc linux-headers musl-dev" 
// and later
RUN apk update && apk upgrade && apk add --no-cache $PKGS 

tar をインストールすると、イメージが少し重くなります (この場合、ダウンロードと開始に 10 秒かかります) が、それほど大きな問題ではありません.

GNU タール そして、あなたは行く準備ができています



実際に見てください .コンテナーが GHA の準備ができたら、デフォルトのベース ランナーを実行しているかのように、ワークフローで (少なくともこれらの) here を簡単に実行できます.