Artifacts の Workers binding を使い、Worker から直接リポジトリの作成、インポート、確認、フォーク、削除ができます。Artifacts バインディングは、トークン管理やフォークなど、リポジトリ単位の操作ができるリポジトリハンドルを返します。
先に Namespaces を確認し、ここでバインドする名前空間名を選んでください。
Wrangler 設定ファイルに Artifacts バインディングを追加します。
{
"$schema": "./node_modules/wrangler/config-schema.json",
"artifacts": [
{
"binding": "ARTIFACTS",
"namespace": "default"
}
]
}[[artifacts]]
binding = "ARTIFACTS"
namespace = "default" # replace with your Artifacts namespace
# remote = true # optional: use the remote Artifacts service in local devnpx wrangler types を実行すると、Worker の環境は次のようになります。
export interface Env {
ARTIFACTS: Artifacts;
}Wrangler は利用側向けに Artifacts 型を生成し、環境に直接バインドします。
名前付き Wrangler 環境では、artifacts は継承されません。必要な環境ごとにバインディングを繰り返してください。
実行時、デプロイ済みの Worker は設定したバインディングを直接使います。wrangler dev、wrangler deploy、wrangler types などのローカル Wrangler コマンドでは、先に Wrangler に認証してください。ローカルの OAuth 認証は wrangler login を参照してください。CI やヘッドレス環境は CI/CD で Wrangler を実行する を参照してください。
env.ARTIFACTS の名前空間メソッドで、リポジトリの作成、一覧、確認、インポート、削除ができます。
nameRepoName必須opts.readOnlyboolean任意opts.descriptionstring任意opts.setDefaultBranchstring任意- 戻り値
Promise<ArtifactsCreateRepoResult>
create() は、name、remote、defaultBranch、初期トークンを含むリポジトリメタデータを返します。あとで使う場合は、これらの値を保存してください。
async function createRepo(artifacts) {
const created = await artifacts.create("starter-repo", {
description: "Repository for automation experiments",
readOnly: false,
setDefaultBranch: "main",
});
return {
defaultBranch: created.defaultBranch,
name: created.name,
remote: created.remote,
initialToken: created.token,
};
}async function createRepo(artifacts: Artifacts) {
const created = await artifacts.create("starter-repo", {
description: "Repository for automation experiments",
readOnly: false,
setDefaultBranch: "main",
});
return {
defaultBranch: created.defaultBranch,
name: created.name,
remote: created.remote,
initialToken: created.token,
};
}nameRepoName必須- 戻り値
Promise<ArtifactsRepo> - リポジトリが存在しない、またはまだ準備できていない場合は例外を投げます。
get() は、既存リポジトリのハンドルを返します。ハンドルで createToken()、listTokens()、revokeToken()、fork() などの非同期メソッドを呼び出します。
async function getRepoHandle(artifacts) {
const repo = await artifacts.get("starter-repo");
const token = await repo.createToken("read", 3600);
return token;
}async function getRepoHandle(artifacts: Artifacts) {
const repo = await artifacts.get("starter-repo");
const token = await repo.createToken("read", 3600);
return token;
}opts.limitnumber任意opts.cursorCursor任意- 戻り値
Promise<ArtifactsRepoListResult>
async function listRepos(artifacts) {
const page = await artifacts.list({ limit: 10 });
return {
repos: page.repos.map((repo) => ({
name: repo.name,
status: repo.status,
})),
nextCursor: page.cursor ?? null,
};
}async function listRepos(artifacts: Artifacts) {
const page = await artifacts.list({ limit: 10 });
return {
repos: page.repos.map((repo) => ({
name: repo.name,
status: repo.status,
})),
nextCursor: page.cursor ?? null,
};
}一覧の各リポジトリには、ready、importing、forking のいずれかの status が含まれます。
外部の git remote からリポジトリをインポートします。
params.source.urlstring必須 — ソースリポジトリの HTTPS URL。params.source.branchstring任意 — インポートするブランチ(デフォルトは remote のデフォルトブランチ)。params.source.depthnumber任意 — 浅いクローンの深さ。params.target.nameRepoName必須 — インポート先リポジトリの名前。params.target.opts.descriptionstring任意params.target.opts.readOnlyboolean任意- 戻り値
Promise<ArtifactsCreateRepoResult>
import() は、name、remote、defaultBranch、初期トークンを含むリポジトリメタデータを返します。あとで使う場合は、remote と name を保存してください。
async function importFromGitHub(artifacts) {
const imported = await artifacts.import({
source: {
url: "https://github.com/cloudflare/workers-sdk",
branch: "main",
},
target: {
name: "workers-sdk",
},
});
return {
name: imported.name,
remote: imported.remote,
token: imported.token,
};
}async function importFromGitHub(artifacts: Artifacts) {
const imported = await artifacts.import({
source: {
url: "https://github.com/cloudflare/workers-sdk",
branch: "main",
},
target: {
name: "workers-sdk",
},
});
return {
name: imported.name,
remote: imported.remote,
token: imported.token,
};
}nameRepoName必須- 戻り値
Promise<boolean>
async function deleteRepo(artifacts) {
return artifacts.delete("starter-repo");
}async function deleteRepo(artifacts: Artifacts) {
return artifacts.delete("starter-repo");
}await artifacts.get(name) でリポジトリハンドルを取得します。ハンドルでリポジトリの非同期メソッドを呼び出します。
scope"read" | "write"任意(デフォルト: "write")ttlnumber任意(秒)- 戻り値
Promise<ArtifactsCreateTokenResult>
async function mintReadToken(artifacts) {
const repo = await artifacts.get("starter-repo");
return repo.createToken("read", 3600);
}async function mintReadToken(artifacts: Artifacts) {
const repo = await artifacts.get("starter-repo");
return repo.createToken("read", 3600);
}create() や import() と異なり、repo.createToken() は plaintext と expiresAt を含む構造化結果を返します。plaintext は Git トークン文字列です。
- 戻り値
Promise<ArtifactsTokenListResult>
async function listRepoTokens(artifacts) {
const repo = await artifacts.get("starter-repo");
const result = await repo.listTokens();
return {
total: result.total,
tokens: result.tokens,
};
}async function listRepoTokens(artifacts: Artifacts) {
const repo = await artifacts.get("starter-repo");
const result = await repo.listTokens();
return {
total: result.total,
tokens: result.tokens,
};
}tokenOrIdstring必須- 戻り値
Promise<boolean>
async function revokeToken(artifacts, tokenOrId) {
const repo = await artifacts.get("starter-repo");
return repo.revokeToken(tokenOrId);
}async function revokeToken(artifacts: Artifacts, tokenOrId: string) {
const repo = await artifacts.get("starter-repo");
return repo.revokeToken(tokenOrId);
}nameRepoName必須opts.descriptionstring任意opts.readOnlyboolean任意opts.defaultBranchOnlyboolean任意- 戻り値
Promise<ArtifactsCreateRepoResult>
fork() は新しいリポジトリのメタデータを返します。あとで使う場合は、remote と name を保存してください。
async function forkRepo(artifacts) {
const repo = await artifacts.get("starter-repo");
const forked = await repo.fork("starter-repo-copy", {
description: "Fork for testing",
defaultBranchOnly: true,
readOnly: false,
});
return forked.remote;
}async function forkRepo(artifacts: Artifacts) {
const repo = await artifacts.get("starter-repo");
const forked = await repo.fork("starter-repo-copy", {
description: "Fork for testing",
defaultBranchOnly: true,
readOnly: false,
});
return forked.remote;
}opts.refstring任意 — ブランチ、タグ、またはコミットハッシュ。opts.limitnumber任意opts.offsetnumber任意- 戻り値
Promise<ArtifactsLogResult>
async function readCommitHistory(artifacts) {
const repo = await artifacts.get("starter-repo");
const history = await repo.log({ ref: "main", limit: 10 });
return history;
}async function readCommitHistory(artifacts: Artifacts) {
const repo = await artifacts.get("starter-repo");
const history = await repo.log({ ref: "main", limit: 10 });
return history;
}hashstring必須 — コミットの SHA-1 ハッシュ。- 戻り値
Promise<ArtifactsCommit>
async function readCommit(artifacts, hash) {
const repo = await artifacts.get("starter-repo");
return repo.readCommit(hash);
}async function readCommit(artifacts: Artifacts, hash: string) {
const repo = await artifacts.get("starter-repo");
return repo.readCommit(hash);
}hashstring必須 — ツリーの SHA-1 ハッシュ。- 戻り値
Promise<ArtifactsTree>
async function readTree(artifacts, hash) {
const repo = await artifacts.get("starter-repo");
return repo.readTree(hash);
}async function readTree(artifacts: Artifacts, hash: string) {
const repo = await artifacts.get("starter-repo");
return repo.readTree(hash);
}この例は、1 つの Worker ルートでバインディングのメソッドを組み合わせます。
export default {
async fetch(request, env) {
const url = new URL(request.url);
if (request.method === "POST" && url.pathname === "/repos") {
const created = await env.ARTIFACTS.create("starter-repo");
return Response.json({
name: created.name,
remote: created.remote,
});
}
if (request.method === "POST" && url.pathname === "/tokens") {
const repo = await env.ARTIFACTS.get("starter-repo");
const token = await repo.createToken("read", 3600);
return Response.json(token);
}
return Response.json(
{ message: "Use POST /repos or POST /tokens." },
{ status: 404 },
);
},
};interface Env {
ARTIFACTS: Artifacts;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
if (request.method === "POST" && url.pathname === "/repos") {
const created = await env.ARTIFACTS.create("starter-repo");
return Response.json({
name: created.name,
remote: created.remote,
});
}
if (request.method === "POST" && url.pathname === "/tokens") {
const repo = await env.ARTIFACTS.get("starter-repo");
const token = await repo.createToken("read", 3600);
return Response.json(token);
}
return Response.json(
{ message: "Use POST /repos or POST /tokens." },
{ status: 404 },
);
},
} satisfies ExportedHandler<Env>;自分のプロジェクトで npx wrangler types を実行してください。その環境の Artifacts バインディング型は、生成された worker-configuration.d.ts を正として扱います。