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.shfunc.ymlファイルには、---で区切られた2つのYAMLドキュメントが含まれています。Functionのインプットとアウトプットを定義する仕様と、Functionが行うことを記述する定義です。
# 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"] | 型付けされていないアイテムのリスト |
boolean | true | 真偽値 |
number | 56.77 | 64ビット浮動小数点数 |
string | "brown cow" | テキスト |
struct | {"k1":"v1","k2":"v2"} | 構造化されたコンテンツ |
例:
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がアウトプット値を書き込まない場合、デフォルト値が使用されます。
アウトプットは、インプットと同じ型と命名規則を使用します。
例:
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オブジェクトである必要があります:
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>を使用します:
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に直接渡されるため、文字列の配列である必要があります。
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 }}に設定します:
exec:
command: ["./build.sh"]
work_dir: "${{ func_dir }}"コマンドがゼロ以外の終了コードで終了した場合、Functionは失敗します。
run
runを、他のFunctionを順次呼び出すFunctionに使用します。
シーケンス内のいずれかのステップが失敗した場合、Functionは失敗します。シーケンスの後続のステップは、失敗後には実行されません。
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:シーケンス内のすべてのステップの環境変数を設定します。値は式を使用できます:
spec:
---
run:
- name: test
func: ./run-tests
env:
GOFLAGS: "-race"
TARGET_ENV: "${{ inputs.environment }}"環境変数をエクスポートする
Functionの実行後、ジョブの残りすべてのステップで環境変数を利用できるようにするには、${{ export_file }}に書き込みます。各行は、nameおよびvalueフィールドを持つJSONオブジェクトである必要があります:
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.shfunc.yml:
spec:
inputs:
input_path:
type: string
outputs:
output_path:
type: string
---
exec:
command: ["${{ func_dir }}/compress.sh", "${{ inputs.input_path }}", "${{ output_file }}"]compress.sh(実行可能である必要があります):
#!/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を実行できます。
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はプラットフォーム非依存性を維持します。
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タグを更新しません。
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を生成し、エクスポートします:
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を参照します:
run:
- name: run_my_function
func: registry.example.com/my-org/my-function:1.2.3