2025年6月10日火曜日

bitbucket で push 時にパイプラインを実行する方法

bitbucket で push 時にパイプラインを実行する方法

概要

手動ではなく master push 時にパイプラインを実行する方法を紹介します

環境

  • bitbucket (2025/05/29時点)

bitbucket-pipelines.yml

image: python:3.12.10

pipelines:
  branches:
    master:
      - step:
          name: Install packages and Lint code
          caches:
            - pip
          script:
            - pip install pipenv
            - pipenv install -d
            - pipenv run isort --check --diff .
            - pipenv run black --check .

基本はイメージを選択しあとは実行するコマンドを並べていけば OK です

ビルドが失敗すると自動でメールが送信されます

初回は必ず手動で実行する必要がありそう

bitbucket-pipelines.yml 追加後に

  • 左メニュー -> パイプライン -> Run initial pipeline

で必ず初回は手動実行する必要がありそうです
次回以降は push 時に自動で実行されます

ダメなパターン

pipenv install と pipenv run のステップをわけるとうまくインストールしたパッケージが次に渡らないので素直に同じステップ内で実行しましょう

image: python:3.12.10

pipelines:
  branches:
    master:
      - step:
          name: Install packages
          caches:
            - pip
          script:
            - pip install pipenv
            - which pipenv
            - pipenv install -d
          artifacts:
            - /usr/loca/bin/
            - /root/.local/share/virtualenvs/
      - step:
          name: Lint code
          script:
            - pipenv run isort --check --diff .
            - pipenv run black --check .

最後に

bitbucket の無料枠でも毎月50分であればパイプラインのランナーを使えます
bitbucket の場合作成された pipeline の履歴は消せないようです

参考サイト

2025年6月9日月曜日

docker-registry-ui を localhost で起動する

docker-registry-ui を localhost で起動する

概要

registry はすでに https で起動している想定です

環境

  • macOS 15.5
  • docker 28.1.1
  • docker-registry-ui 2.5.7

Registry 側の CORS 設定

要するに localhost からアクセスできるように CORS を許可します
Access-Control-Allow-Origin はアスタリスクでもいいですが可能な限り制限しましょう

  # storage
  registry:
    image: registry:2
    ports:
      - "5000:5000"
    volumes:
      - "/home/user01/homepage/registry:/var/lib/registry"
      - "/home/user01/homepage/registry/auth_config.yml:/config/auth_config.yml"
      - "/etc/letsencrypt/live/user01.com/privkey.pem:/certs/server.key"
      - "/etc/letsencrypt/live/user01.com/fullchain.pem:/certs/server.crt"
    environment:
      - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt
      - REGISTRY_HTTP_TLS_KEY=/certs/server.key
      - REGISTRY_HTTP_HEADERS_Access-Control-Allow-Origin=["http://localhost:8080"]
      - REGISTRY_HTTP_HEADERS_Access-Control-Allow-Methods=["HEAD","GET","OPTIONS","DELETE"]
      - REGISTRY_HTTP_HEADERS_Access-Control-Allow-Credentials=["true"]
      - REGISTRY_HTTP_HEADERS_Access-Control-Allow-Headers=["Authorization","Accept","Cache-Control"]
      - REGISTRY_HTTP_HEADERS_Access-Control-Expose-Headers=["Docker-Content-Digest"]
      - REGISTRY_STORAGE_DELETE_ENABLED=true
    restart: always

docker-reigstry-ui 起動

docker コマンドで起動します

docker run -d \        
  -p 8080:80 \
  -e REGISTRY_URL=https://user01.com:5000 \
  -e DELETE_IMAGES=true \
  -e REGISTRY_TITLE="My Private Registry" \
  --name registry-ui \
  joxit/docker-registry-ui:latest

動作確認

localhost:8080 にアクセスして registry の内容が確認できれば OK です

最後に

ポイントは CORS の許可かなと思います
http な registry に対しても使うことはできますが https でアクセス可能な環境であればこれが一番簡単かなと思います

当然ですが registry (今回で言うところの https://user01.com:5000) に対してはアクセス可能な環境で docker-registry-ui を起動してアクセスする必要があります

参考サイト

2025年6月8日日曜日

Github Copilot には Chat API はない

Github Copilot には Chat API はない

概要

いつも忘れるのでメモです
Github Copilot 自体に API の機能はありますが使える API は 2 つだけです

  • メトリックスを取得する機能 (Github Copilot の利用状況など
  • アカウントの制御 (Copilot を利用可能なユーザの管理など

OpenAI の用に API キーを払い出しそれを使って dspy などのプログラムからチャットをすることは Github Copilot ではできません

参考サイト

2025年6月7日土曜日

Swift でリントとフォーマットをしてみる

Swift でリントとフォーマットをしてみる

概要

コード規約を作成します

環境

  • macOS 15.5
  • SwiftFormat 0.56.1
  • SwiftLint 0.59.1

インストール

  • vim Podfile
pod 'SwiftLint'
pod 'SwiftFormat/CLI'
  • pod install

フォーマット

  • ./Pods/SwiftFormat/CommandLineTool/swiftformat .

リント

  • ./Pods/SwiftLint/swiftlint .

おすすめ .swiftlint.yml 設定

excluded:
- Pods
disabled_rules:
- force_cast
- force_try
- line_length
- function_body_length

要約すると

  • force try (try!) は使っても OK
  • 1行の長さ120以上 OK
  • 1クラスの行数250以上 OK
  • 1メソッドの行数100以上 OK

です
これ以外はちゃんと対応したほうがいいと思います

その他

  • コード内で個別にリントを 無視する
    • 例えば関数の複雑性を無視する場合は関数の上に以下を記載します
// swiftlint:disable:next cyclomatic_complexity
  • コード内で個別にフォーマットさせないようにする
    • 例えば強制改行を SwiftFormat でさせないようにするには以下のように記載します
// swiftformat:disable wrapMultilineStatementBraces

最後に

フォーマットしても普通にリントで引っかかるのであとは手動で直すしかありません

参考サイト

2025年6月6日金曜日

自分でホストしているdocker reigistryからイメージを削除する方法

自分でホストしているdocker reigistryからイメージを削除する方法

概要

API を使って削除する方法を紹介します

環境

  • Ubuntu 22.04
  • docker registry 2.8.3
  • docker 27.0.3

削除 API の実行

registry='your-registry-domain:5000'
name='image_name'
curl -v -sSL -X DELETE "https://${registry}/v2/${name}/manifests/$(
    curl -sSL -I \
        -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
        "https://${registry}/v2/${name}/manifests/$(
            curl -sSL "https://${registry}/v2/${name}/tags/list" | jq -r '.tags[0]'
        )" \
    | awk '$1 == "docker-content-digest:" { print $2 }' \
    | tr -d $'\r' \
)"

3つAPIをコール必要があります

  1. タグを取得
  2. タグのハッシュを取得
  3. ハッシュを元に削除

ディレクトリも削除する

  • sudo rm -rf registry/docker/registry/v2/repositories/image_name

これを削除しないと v2/_catalog で表示されてしまいます

最後に

必ずディレクトリまで削除するようにしましょう

2025年6月5日木曜日

Gitlab で reCAPTCHA を使ってみる

Gitlab で reCAPTCHA を使ってみる

概要

Gitlab と reCAPTCHA v2 を連携しログイン時にロボット化どうかを判定するチェックを導入してみました
v3 にはまだ対応していないので v2 を使いましょう

環境

  • reCAPTCHA v2
  • Gitlab 17.9.3

reCAPTCHA の登録

Gitlab は reCAPTCHA v3 をまだサポートしていないんどえ v2 のキーを取得しましょう

ここから申し込みます
GCP のプロダクトと紐づける必要があります
ドメインには Gitlab の URL を指定しましょう

サイトキーとシークレットキーが発行されるのでメモしておきます
また GCP 側のプロジェクトにも紐づいているのでそちらでも reCAPTCHA の情報を確認できます

Gitlab 側の設定

  • Admin ユーザでログイン
  • 左下の Admin ボタンをクリック
  • 左メニュー Settings -> Reporting
  • Spam and Anti-bot Protection
    • Enable reCAPTCHA -> ON
    • Enable reCAPTCHA for login. -> ON
    • reCAPTCHA site key -> 先ほど取得したサイトキーを入力
    • reCAPTCHA private key -> 先ほど取得したシークレットキーを入力
  • Save Change

動作確認

Gitlab にアクセスしてログインページで reCAPTCHA が表示されることを確認します
表示されない場合は以下を試してください

  • ブラウザのシークレットモードでアクセスする
  • パスワードを何回か間違えて表示されることを確認
  • ブラウザのキャッシュをクリアする
  • 異なる IP の環境からアクセスする

一度信頼されている環境だと reCAPTCHA は表示されないので注意してください GCP 上の reCAPTCHA でも保護がカウントされていることが確認できます

gitlab.rb の編集

これはいらないかもです
一応入れておくと安心です
Omnibus Gitlab であれば docker-compose.yml などに記載しましょう

  • vim /etc/gitlab/gitlab.rb
nginx['proxy_set_headers'] = { 'X-GitLab-Show-Login-Captcha' => '1' }

ロックアウトされた場合は

DB に直接触れたり Admin 権限のあるアクトークンがあるのであれば API から reCAPTCHA を一時的に無効にすることも可能です

curl --request PUT --header \
"PRIVATE-TOKEN: <PersonalAccessToken>" \
"https://gitlab.example.com/api/v4/application/settings?recaptcha_private_key=<SecretKey>&recaptcha_site_key=<SiteKey>"

最後に

Gitlab と reCAPTCHA を連携してみました
テストする場合はロックアウトされる可能性もあるのでログイン状態を保持したブラウザを用意しておくことをおすすめします

参考サイト

2025年6月4日水曜日

Github Actions の使用状況を取得する方法

Github Actions の使用状況を取得する方法

概要

Github Actions の Usage API は現状廃止されているので CSV レポートを Github のサイトからダウンロードしシェルで集計します

環境

  • macOS 15.5

レポートのダウンロード

  • Github にログイン
  • Settings
  • Billing and licensing
  • Usage
  • Get usage report

でメールに CSV ファイルが送信されます

集計コマンド

awk -F, 'NR > 1 { gsub(/"/, "", $4); sum += $4 } END { print sum }' usageReport_1_e462831328724579817d955401dc46df.csv

Github Actions の実行時間を管理するカラムは4番目です (quantity)
macOS で実行する場合にダブルクォートで囲まれた数値は sum できないのでダブルクォートをなくしてから計算しています

最後に

いちいち CSV をダウンロードしなければいけないのが面倒ですが現状これが一番簡単だと思います
Github Actions の実行時間は無料の場合 2000分までは無料で実行できます

参考サイト