正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。
ドキュメントに関する現在のご利用体験についてお聞かせください。アンケートにご協力ください。

GitLab Functionを作成する

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
  • ステータス: 実験的機能

GitLab Functionは、Functionのインターフェースと実装を定義するfunc.ymlファイルを持つディレクトリです。Functionは、ローカルで実行することも、OCIレジストリに公開して、ジョブやプロジェクト全体で再利用することもできます。

CI/CDジョブでのFunctionの使用に関する情報は、GitLab Functionを参照してください。Functionの例については、GitLab Functionの例を参照してください。

Functionの構造

Functionは、最低限func.ymlファイルと、実装に必要なすべてのサポートファイルを含むディレクトリです:

my-function/
├── func.yml
└── my-script.sh

func.ymlファイルには、---で区切られた2つのYAMLドキュメントが含まれています。Functionのインプットとアウトプットを定義する仕様と、Functionが行うことを記述する定義です。

yaml
# Document 1: spec
spec:
  inputs:
    message:
      type: string
  outputs:
    result:
      type: string
---
# Document 2: definition
exec:
  command: ["${{ func_dir }}/my-script.sh", "${{ inputs.message }}"]

仕様: インプットとアウトプットを宣言する

この仕様は、Functionのインターフェースを記述しています。

インプット

各インプットにはtypeが必要です。default値を持つインプットはオプションです。インプットにデフォルト値がない場合は、呼び出し元から指定する必要があります。

インプット名には英数字とアンダースコアを使用する必要があり、数字で始めることはできません。

インプットは次のいずれかの型である必要があります:

タイプ例説明
array["a","b"]型付けされていないアイテムのリスト
booleantrue真偽値
number56.7764ビット浮動小数点数
string"brown cow"テキスト
struct{"k1":"v1","k2":"v2"}構造化されたコンテンツ

例:

yaml
spec:
  inputs:
    # Required string input
    message:
      type: string

    # Optional input with a default
    count:
      type: number
      default: 1

    # Struct input for passing structured data
    config:
      type: struct
      default: {}

アウトプット

アウトプットは、Functionが後続のステップに返す値を定義します。各アウトプットにはtypeが必要です。default値を持つアウトプットはオプションです。Functionがアウトプット値を書き込まない場合、デフォルト値が使用されます。

アウトプットは、インプットと同じ型と命名規則を使用します。

例:

yaml
spec:
  outputs:
    # Required string output
    artifact_path:
      type: string

    # Optional output with a default
    compressed:
      type: boolean
      default: false

実行時に、Functionは${{ output_file }}で指定されたパスにアウトプット値を書き込みます。各行は、nameおよびvalueフィールドを持つJSONオブジェクトである必要があります:

shell
echo '{"name":"artifact_path","value":"/dist/app.tar.gz"}' >> "${{ output_file }}"
echo '{"name":"compressed","value":true}' >> "${{ output_file }}"

アウトプットを委譲する

Functionに複数のステップがあり、Functionのアウトプットを特定の1つのステップから取得したい場合は、仕様でoutputs: delegateを、定義でdelegate: <step_name>を使用します:

yaml
spec:
  outputs: delegate
---
run:
  - name: build
    func: ./build
  - name: package
    func: ./package
delegate: package  # use the package step outputs as this function outputs

定義: Functionを実装する

func.yml内の2番目のドキュメントは、実装を記述しています。Functionを実装する方法は2つあります。

exec

execを使用して、単一のコマンドまたはスクリプトを実行します。コマンドはShellなしでOSに直接渡されるため、文字列の配列である必要があります。

yaml
spec:
  inputs:
    message:
      type: string
---
exec:
  command: ["./greet", "${{ inputs.message }}"]

ワーキングディレクトリはデフォルトでCI_PROJECT_DIRです。それをオーバーライドするには、work_dirを使用します。work_dirキーワードは、exec定義にのみ有効であり、run:定義には有効ではありません。

コマンドがfunc.ymlと同じディレクトリ内のファイルを参照する必要がある場合は、work_dirを${{ func_dir }}に設定します:

yaml
exec:
  command: ["./build.sh"]
  work_dir: "${{ func_dir }}"

コマンドがゼロ以外の終了コードで終了した場合、Functionは失敗します。

run

runを、他のFunctionを順次呼び出すFunctionに使用します。

シーケンス内のいずれかのステップが失敗した場合、Functionは失敗します。シーケンスの後続のステップは、失敗後には実行されません。

yaml
spec:
  inputs:
    environment:
      type: string
  outputs:
    url:
      type: string
---
run:
  - name: build
    func: ./build
  - name: push
    func: registry.example.com/my-org/push:1.0.0
    inputs:
      artifact: ${{ steps.build.outputs.artifact_path }}
  - name: deploy
    func: ./deploy
    inputs:
      env: ${{ inputs.environment }}
      image: ${{ steps.push.outputs.image_ref }}
outputs:
  url: ${{ steps.deploy.outputs.url }}

環境変数を設定する

定義でenvを使用して、execコマンドまたはrun:シーケンス内のすべてのステップの環境変数を設定します。値は式を使用できます:

yaml
spec:
---
run:
  - name: test
    func: ./run-tests
env:
  GOFLAGS: "-race"
  TARGET_ENV: "${{ inputs.environment }}"

環境変数をエクスポートする

Functionの実行後、ジョブの残りすべてのステップで環境変数を利用できるようにするには、${{ export_file }}に書き込みます。各行は、nameおよびvalueフィールドを持つJSONオブジェクトである必要があります:

shell
echo '{"name":"INSTALL_PATH","value":"/opt/myapp"}' >> "${{ export_file }}"

string、number、booleanの値のみが環境変数としてエクスポートできます。

エクスポートされた変数がenv:およびより広範な環境とどのように相互作用するかについての詳細は、環境変数を参照してください。

式

式は${{ }}構文を使用し、Functionが実行される直前に評価されます。それらは、inputsの値、envの値、execコマンド引数、およびwork_dirに表示されます。

式で説明されているものに加えて、以下のコンテキスト変数がFunction定義内で利用可能です:

変数説明
inputs.<name>このFunctionに渡される名前付きインプットの値。
func_dirこのfunc.ymlを含むディレクトリへの絶対パス。バンドルされたファイルを参照するために使用します。
output_fileアウトプットを書き込むためのパス。
export_file環境変数をエクスポートするためのパス。
steps.<step_name>.outputs.<output_name>名前付きステップからのアウトプット(run:定義でのみ利用可能)。

完全な例

以下のFunctionは、ファイルパスを受け入れ、gzipで圧縮し、圧縮されたファイルへのパスを返します。

Functionを作成する

ディレクトリのレイアウト:

compress/
├── func.yml
└── compress.sh

func.yml:

yaml
spec:
  inputs:
    input_path:
      type: string
  outputs:
    output_path:
      type: string
---
exec:
  command: ["${{ func_dir }}/compress.sh", "${{ inputs.input_path }}", "${{ output_file }}"]

compress.sh(実行可能である必要があります):

shell
#!/usr/bin/env sh
set -e

INPUT_PATH="$1"
OUTPUT_FILE="$2"

gzip --keep "$INPUT_PATH"

echo "{\"name\":\"output_path\",\"value\":\"${INPUT_PATH}.gz\"}" >> "$OUTPUT_FILE"

ジョブからFunctionを使用する

このFunctionでは、ジョブ環境にgzipが必要です。この例では、gzipがジョブが実行されるインスタンスで既に利用可能であると想定しています。そうでない場合は、script:ステップで最初にインストールするか、compressを呼び出す前にインストールを処理するFunctionを実行できます。

yaml
my-job:
  run:
    - name: compress_artifact
      func: ./compress
      inputs:
        input_path: "dist/app.tar"
    - name: list_compressed
      script: ls -lh ${{ steps.compress_artifact.outputs.output_path }}

その他のFunctionの例については、GitLab Functionの例を参照してください。

Functionをビルドしてリリースする

FunctionはOCIイメージとして配布されます。ステップRunnerは、Functionイメージをビルドおよび公開するための2つの組み込みFunctionを提供します。

ビルド

builtin://function/oci/build Functionは、プロジェクトディレクトリ内のファイルからマルチアーキテクチャFunction OCIイメージをビルドし、CI_PROJECT_DIR内にfunction-image.tarとしてアーカイブします。

common.filesはすべてのプラットフォームで共有されるファイルをコピーします。platforms.<os/arch>.filesは、そのプラットフォーム固有のファイルをコピーします。どちらの場合も、マップキーはイメージ内の宛先パスであり、値はCI_PROJECT_DIRに対するソースパスです。

以下の例では、function-image.tarはlinux/amd64とlinux/arm64の2つのプラットフォームをサポートするFunction OCIイメージです。各プラットフォームイメージには、func.yml、my-script.sh、bin/my-binaryの3つのファイルがあります。プラットフォームバイナリに同じファイル名を使用することで、func.ymlはプラットフォーム非依存性を維持します。

yaml
build_function:
  artifacts:
    paths:
      - function-image.tar
  run:
    - name: build
      func: builtin://function/oci/build
      inputs:
        version: "1.2.3"
        common:
          files:
            func.yml: func.yml
            my-script.sh: my-script.sh
        platforms:
          linux/amd64:
            files:
              bin/my-binary: bin/linux-amd64/my-binary
          linux/arm64:
            files:
              bin/my-binary: bin/linux-arm64/my-binary

リリース

builtin://function/oci/publishFunctionは、function/oci/buildからのアーカイブをOCIレジストリに公開します。

公開Functionは、Functionイメージタグにセマンティックバージョニングを使用します: 1.0.0、1.1.0、2.0.0。Functionはfunction-image.tarファイルからバージョンを抽出します。公開は、必要に応じてmajor、major.minor、major.minor.patch、およびlatestタグを更新します。

リリース候補は、1.2.0-rc1のようなプレリリースサフィックスを使用します。リリース候補を公開すると、正確なmajor.minor.patch-prereleaseタグのみが作成されます。それはmajor、major.minor、またはlatestタグを更新しません。

yaml
publish_function:
  needs: [build_function]
  run:
    - name: publish
      func: builtin://function/oci/publish
      inputs:
        archive: function-image.tar  # version is baked into the tar file
        to_repository: registry.example.com/my-org/my-function

レジストリに認証する

プライベートレジストリに公開するには、function/oci/publishを実行する前に認証します。公開する前のステップとして、Docker Auth Functionを使用して、DOCKER_AUTH_CONFIGを生成し、エクスポートします:

yaml
publish_function:
  needs: [build_function]
  run:
    - name: auth
      func: registry.gitlab.com/gitlab-org/ci-cd/runner-tools/gitlab-functions-examples/docker-auth:1
      inputs:
        registry: ${{ vars.CI_REGISTRY }}
        username: ${{ vars.CI_REGISTRY_USER }}
        password: ${{ vars.CI_REGISTRY_PASSWORD }}
    - name: publish
      func: builtin://function/oci/publish
      inputs:
        archive: function-image.tar
        to_repository: ${{ vars.CI_REGISTRY_IMAGE }}

docker-authはDOCKER_AUTH_CONFIGをすべての後続ステップにエクスポートするため、function/oci/publishが自動的にそれを検出します。

公開されると、呼び出し元はレジストリのURLとタグを使用してFunctionを参照します:

yaml
run:
  - name: run_my_function
    func: registry.example.com/my-org/my-function:1.2.3