GitHub アクション用のコンテナーの設計
10069 ワード
GitHub actions は、GitHub イベントによってトリガーされるワークフローです.それらは非常に柔軟で、デフォルトで「ベア」オペレーティング システム ランナーで実行されますが、さらに、 hosted in user-provided containers にすることもできます.問題は、GitHub がこれらのコンテナに特定のサービスと構造があることを期待していることです.これは、標準またはプレーン コンテナを使用する場合の問題です.
this container の作成、および GitHub community の複数の質問を通じて、コンテナーをワークフローでシームレスに使用するために必要なものは何かを発見しました.ヒントは次のとおりです.
Linux システムで最初に作成するユーザーの UID は 1000 ですが、GHA は少し特殊で、UID 1001 を使用します.したがって、この Raku container で行われているように、その UID をユーザーに使用することをお勧めします.
少し長めですが、実際の取引はこれらの線のすぐ上です.デフォルトでその UID を使用できますが、私の場合は、GHS で後でさらに変更が必要になった場合に備えて、2 つのバージョンが必要でした.
したがって、UID を運ぶ
それだけですか?あまり.
コンテナはディレクトリを
ベース イメージで明らかになったように、これは既に GHA 固有のものです.
Alpine はコンテナー用の驚くべき小さなディストリビューションですが、その魅力の一部は、多くの外部ユーティリティを に入れ、tar を含むという事実に由来しています.ただし、明らかに文書化されていない動きで、BusyBox はアーティファクトの保存と復元に BSD または the caching GHA を使用しています.つまり、コンテナに必要です.上記を確認してください:
実際に見てください .コンテナーが GHA の準備ができたら、デフォルトのベース ランナーを実行しているかのように、ワークフローで (少なくともこれらの) here を簡単に実行できます.
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 を簡単に実行できます.
Reference
この問題について(GitHub アクション用のコンテナーの設計), 我々は、より多くの情報をここで見つけました https://dev.to/jj/designing-containers-for-github-actions-5h84テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol