Closed6

ttl.sh へ Dev Container の feature などを push してみる

hankei6kmhankei6km

oras を試しているときに ttl.sh の存在を知る。

https://zenn.dev/termoshtt/articles/ttlsh-ephemeral-container-registry

匿名で Container の image を push pull できるサービスらしい

イメージ名に guid などを使うことでアクセス制限的なことを行えるとしている(Google Drive のアドレスを知ってる人は 書き込み可能権限 でアクセスできるのと似た状態になる)。

hankei6kmhankei6km

OCI Artifact で試してみる

oras cli で push と pull ができるか?

push

$ IMAGE=$(uuidgen)
$ oras push "ttl.sh/${IMAGE}:1h" cover_image43.jpg:iamge/jpeg
Uploading b337e09356cb cover_image43.jpg
Uploaded  b337e09356cb cover_image43.jpg
Pushed [registry] ttl.sh/xxxxxx-xxxx-xxxx-84bb-0ff4d78a5a86:1h
Digest: sha256:c969b655ddd498871e5bae46b4654ee7140f5c8afd118163942addb538eee834

pull

$ mkdir chk
$ cd chk/
$ oras pull ttl.sh/xxxxxx-xxxx-xxxx-84bb-0ff4d78a5a86:1h
Downloading b337e09356cb cover_image43.jpg
Downloaded b337e09356cb cover_image43.jpg
Pulled [registry] ttl.sh/xxxxxx-xxxx-xxxx-84bb-0ff4d78a5a86:1h
Digest: sha256:c969b655ddd498871e5bae46b4654ee7140f5c8afd118163942addb538eee834
$ sha256sum -c <(sha256sum ../cover_image43.jpg | sed -e "s/..\\//.\\//")
./cover_image43.jpg: OK

ということで OCI artifact でも利用できる。

hankei6kmhankei6km

Dev Containers の Features で利用してみる

テンプレートだと、publish するまでは registry からのインストールを試すことができないのでどうしたものかなと思っていた。利用できならば結構うれしいかも。

devcontainer-cli で publish

$ NAMESPACE=$(uuidgen)
$ echo $NAMESPACE
xxxxxxxx-xxxx-xxxx-ae28-d285a3dfbb7e
$ devcontainer features publish --registry ttl.sh --namespace "${NAMESPACE}" src/github-copilot-cli
[1 ms] @devcontainers/cli 0.29.0. Node.js v16.17.0. linux 5.15.63 x64.
[1 ms] Packaging single feature...
[22 ms] Packaged feature 'github-copilot-cli'
[25 ms] Processing feature: github-copilot-cli...
[25 ms] Fetching published versions...
[340 ms] Publishing versions: 1,1.1,1.1.0,latest...
[342 ms] sha256:89e328476e6c442338add33318394b1a5d85506193dec5d89c885584301949c3 (size: 8192)
[342 ms] Computed Content-Digest ->  sha256:d774d766b19cb6e8e8bfd12c612cf3707d7afa76d7614b58425e840fef7d87ec (size: 64)
[1686 ms] Starting PUT of configLayer blob 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' (size=0)
[4467 ms] Starting PUT of tgzLayer blob 'sha256:89e328476e6c442338add33318394b1a5d85506193dec5d89c885584301949c3' (size=8192)
[7741 ms] Tagged: 1 -> https://ttl.sh/v2/xxxxxxxx-xxxx-xxxx-ae28-d285a3dfbb7e/github-copilot-cli/manifests/sha256:d774d766b19cb6e8e8bfd12c612cf3707d7afa76d7614b58425e840fef7d87ec
[8734 ms] Tagged: 1.1 -> https://ttl.sh/v2/xxxxxxxx-xxxx-xxxx-ae28-d285a3dfbb7e/github-copilot-cli/manifests/sha256:d774d766b19cb6e8e8bfd12c612cf3707d7afa76d7614b58425e840fef7d87ec
[9691 ms] Tagged: 1.1.0 -> https://ttl.sh/v2/xxxxxxxx-xxxx-xxxx-ae28-d285a3dfbb7e/github-copilot-cli/manifests/sha256:d774d766b19cb6e8e8bfd12c612cf3707d7afa76d7614b58425e840fef7d87ec
[10680 ms] Tagged: latest -> https://ttl.sh/v2/xxxxxxxx-xxxx-xxxx-ae28-d285a3dfbb7e/github-copilot-cli/manifests/sha256:d774d766b19cb6e8e8bfd12c612cf3707d7afa76d7614b58425e840fef7d87ec
[10680 ms] Published feature: 'github-copilot-cli'
[10680 ms] Publishing collection metadata...
[10681 ms] sha256:da1fb234cc33f977fae649b619b1e749939bb8141754263b29b4c6996f73c0c7 (size: 1063)
[10681 ms] Computed Content-Digest ->  sha256:ed461f07f4e6797015f3b3448e9236398054b38f2957b31458734472b3563577 (size: 64)
[11961 ms] Starting PUT of configLayer blob 'sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' (size=0)
[14710 ms] Starting PUT of collectionLayer blob 'sha256:da1fb234cc33f977fae649b619b1e749939bb8141754263b29b4c6996f73c0c7' (size=1063)
[17959 ms] Tagged: latest -> https://ttl.sh/v2/xxxxxxxx-xxxx-xxxx-ae28-d285a3dfbb7e/manifests/sha256:ed461f07f4e6797015f3b3448e9236398054b38f2957b31458734472b3563577
[17959 ms] Published collection metadata.
{"github-copilot-cli":{"publishedVersions":["1","1.1","1.1.0","latest"],"digest":"d774d766b19cb6e8e8bfd12c612cf3707d7afa76d7614b58425e840fef7d87ec","version":"1.1.0"}}

pull

$ oras pull ttl.sh/xxxxxxxx-xxxx-xxxx-ae28-d285a3dfbb7e/github-copilot-cli:latest
Downloading 89e328476e6c devcontainer-feature-github-copilot-cli.tgz
Downloaded  89e328476e6c devcontainer-feature-github-copilot-cli.tgz
Pulled [registry] ttl.sh/xxxxxxxx-xxxx-xxxx-ae28-d285a3dfbb7e/github-copilot-cli:latest
Digest: sha256:d774d766b19cb6e8e8bfd12c612cf3707d7afa76d7614b58425e840fef7d87ec

$ tar -tf devcontainer-feature-github-copilot-cli.tgz
./
./README.md
./devcontainer-feature.json
./helper-gh-copilot-cli.sh
./install.sh

manifest

$ oras manifest fetch ttl.sh/xxxxxxxx-xxxx-xxxx-ae28-d285a3dfbb7e/github-copilot-cli:latest| jq
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.oci.image.manifest.v1+json",
  "config": {
    "mediaType": "application/vnd.devcontainers",
    "digest": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "size": 0
  },
  "layers": [
    {
      "mediaType": "application/vnd.devcontainers.layer.v1+tar",
      "digest": "sha256:89e328476e6c442338add33318394b1a5d85506193dec5d89c885584301949c3",
      "size": 8192,
      "annotations": {
        "org.opencontainers.image.title": "devcontainer-feature-github-copilot-cli.tgz"
      }
    }
  ]
}

VSCode で利用(Dev Containers 拡張機能のデフォルトの features へ指定)

{
  "features": {
    "ttl.sh/xxxxxxxx-xxxx-xxxx-ae28-d285a3dfbb7e/github-copilot-cli:1": {
      "helper": true
    }
  },
}

ログ

[2/2] STEP 6/10: RUN --mount=type=bind,from=dev_containers_feature_content_source,source=github-copilot-cli_1,target=/tmp/build-features-src/github-copilot-cli_1     cp -ar /tmp/build-features-src/github-copilot-cli_1 /tmp/dev-container-features  && chmod -R 0755 /tmp/dev-container-features/github-copilot-cli_1  && cd /tmp/dev-container-features/github-copilot-cli_1  && chmod +x ./devcontainer-features-install.sh  && ./devcontainer-features-install.sh  && rm -rf /tmp/dev-container-features/github-copilot-cli_1
===========================================================================
Feature       : @githubnext/github-copilot-cli (via npm)
Description   : Install the @githubnext/github-copilot-cli package via NPM registry
Id            : ttl.sh/xxxxxxxx-xxxx-xxxx-ae28-d285a3dfbb7e/github-copilot-cli
Version       : 1.1.0
Documentation : 
Options       :
    VERSION="latest"
    HELPER="true"
===========================================================================
Installing npm package: @githubnext/github-copilot-cli@latest
npm WARN tar TAR_ENTRY_ERROR EINVAL: invalid argument, fchown
npm WARN tar TAR_ENTRY_ERROR EINVAL: invalid argument, fchown
npm WARN tar TAR_ENTRY_ERROR EINVAL: invalid argument, fchown
npm WARN tar TAR_ENTRY_ERROR EINVAL: invalid argument, fchown
npm WARN deprecated @opentelemetry/api-metrics@0.33.0: Please use @opentelemetry/api >= 1.3.0

added 232 packages in 21s

47 packages are looking for funding
  run `npm fund` for details
Installing helper script: helper-gh-copilot-cli.sh

インストールされている。
VSCode で DevContainer を作成した後に、ターミナルから github-cpiolot-cli を実行しバージョンを確認、関連ファイルが存在していることを確認しているスクリーンショット

とくに問題なく利用できている。

ちょっと気になるのはタグが 1h のようにできないこと。24 時間で消えるはずだが、1latest で問題おきないかというのはある。

hankei6kmhankei6km

ワークフローで使う場合

イメージの名前に使う guid は使い捨てだからパブリックなワークフローで扱ってもよいかなくらいに思っていたが、よくよく考えると外部へ露出するとイメージ(アーティファクト)を上書きされる可能性がある。

guid をワークフロー内で生成するとやりとりが難しくなりそうなので、secret などで外部から挿入する方が簡単かな?

hankei6kmhankei6km

テスト用のワークフローを変更して一時的に push できるようにしようかと思ったのだが、根幹となる機能の不具合対応などが進んでないようなのでやめておく。

このスクラップは2023/04/11にクローズされました