2025年4月3日木曜日

Gitlab で renovate を試す

Gitlab で renovate を試す

概要

gitlab のリポジトリに対して renovate を実行してみました
CLI で直接実行する方法と CI を使う方法を紹介します

環境

  • Gitlab 17.8

CLI

  • LOG_LEVEL=debug renovate --platform=gitlab --endpoint=https://your-gitlab-endpoint/api/v4 --username=oauth2 --token=glpat-xxx user/repo

CI

renovate/renovate-runnerを自身の Gitlab にミラーして使います
fork なりミラーしたリポジトリ名を yaml に記載します
Gitlab.com であれば以下のままで OK です

スキャン対象のリポジトリを RENOVATE_EXTRA_FLAGS に追加することで管理するようです

stages:
  - test

include:
  - project: 'renovate/renovate-runner'
    file: '/templates/renovate.gitlab-ci.yml'

renovate:
  stage: test
  variables:
    RENOVATE_EXTRA_FLAGS: "--platform=gitlab --endpoint=https://your-gitlab-endpoint/api/v4 --username=oauth2 user/repo"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
    - if: '$CI_PIPELINE_SOURCE == "push"'

CI 変数

RENOVATE_TOKEN は必須なので CI の変数に設定しましょう
設定する値は Gitlab の Personal Access Token で OK です

GITHUB_COM_TOKEN はあったほうがいいです
Github アカウントがある場合は Github の Personal Access Token を取得して設定しましょう

最後に

基本は CI を使って定期的に MR を作る感じになるかなと思います
ただ更新対象が自動で決まるのとデフォルトだと2MRしか作成してくれないのでそこは変数による調整が必要かもです

また当然ですがバージョンを固定しているケースは renovate でもバージョンを上げられないのでそこは手動によるバージョン管理になります

参考サイト

2025年4月1日火曜日

renovate を bitbucket で使ってみる

renovate を bitbucket で使ってみる

概要

前回ローカルで renovate を動かしてみました
今回は bitbucket と連携して使ってみます

bitbucket からアプリパスワードの作成

https://bitbucket.org/account/settings/app-passwords/ から作成できます
作成するパスワードに必要な権限は以下のとおりです

  • account -> Account: Read
  • team -> Workspace membership: Read
  • issue:write -> Issues: Write
  • pullrequest:write -> Pull requests: Write

renovate.json の修正

手動で実行するので schedule の部分はいつでも OK にします
特定の時間帯で renovate が PR を作成可能にする場合は時間を指定しましょう

{
  "extends": [
    "config:recommended"
  ],
  "enabledManagers": [
    "pipenv"
  ],
  "packageRules": [
    {
      "description": "Schedule all packages update on Sunday nights (9 PM - 12 AM)",
      "matchManagers": [
        "pipenv"
      ],
      "groupName": "pip dependencies",
      "schedule": ["* * * * *"],
      "automerge": true,
      "automergeType": "branch"
    }
  ],
  "pipenv": {
    "lockFileMaintenance": {
      "enabled": true,
      "schedule": ["* * * * *"]
    },
    "fileMatch": [
      "(^|/)Pipfile$"
    ]
  }
}

package.json の修正

bitbucket のユーザ名と先ほど発行したアプリパスワードを使って認証するように修正します
ユーザ名/パスワードは環境変数で渡せるようにしましょう

{
  "dependencies": {
    "renovate": "^39.222.1"
  },
  "scripts": {
    "renovate": "renovate --platform=bitbucket --username=$BITBUCKET_USERNAME --password=$BITBUCKET_TOKEN team-name/repo-name",
    "renovate_help": "renovate --help"
  }
}

team-name/repo-name の部分は自身の bitbucket 上で管理しているチーム名とリポジトリ名に変更してください
リポジトリ名を指定せずに --autodiscover=true にしても OK ですがリポジトリが大量にある場合は精査に時間がかかるのでリポジトリ名を指定したほうが速いです

トラブルシュート: PR が作成されない場合は

Renovate 用のアカウントを作成する必要があるので作成しましょう
そしてそのアカウントからアプリパスワードを取得し設定します

動作確認

とりあえずローカルで動くか試しましょう
認証情報の部分は適宜変更してください

  • BITBUCKET_USERNAME=name BITBUCKET_TOKEN=password LOG_LEVEL=debug npm run renovate

もしこれで master ブランチ上で更新するべきパッケージがあった場合には MR を作成してくれます

最後に

あとは renovate コマンドを定期的に実行する CI を設定するだけです
bitbucket の場合 Mend という専用のアプリがあるのでこれを使うのが一番簡単です

参考サイト

2025年3月31日月曜日

ローカルで renovate を実行し python のパッケージバージョンの管理をする

ローカルで renovate を実行し python のパッケージバージョンの管理をする

概要

renovate は nodejs で書かれた自動パッケージ更新ツールです
python の pipenv でも使えるのでローカルで試してみました
なおローカルで試す場合には実際にブランチやPRの作成はされません
本来は CI と組み合わせて使います

環境

  • macOS 15.3.2
  • node 20.18.2
    • renovate 39.222.1

インストール

  • nvm use 20.18.2 --save
  • npm i renovate

renovate.json の作成

{
  "extends": [
    "config:recommended"
  ],
  "enabledManagers": [
    "pipenv"
  ],
  "packageRules": [
    {
      "description": "Schedule all packages update on Sunday nights (9 PM - 12 AM)",
      "matchManagers": [
        "pipenv"
      ],
      "groupName": "pip dependencies",
      "schedule": [
        "* 21-23 * * 0"
      ],
      "automerge": true,
      "automergeType": "branch"
    }
  ],
  "pipenv": {
    "lockFileMaintenance": {
      "enabled": true,
      "schedule": [
        "monthly"
      ]
    },
    "fileMatch": [
      "(^|/)Pipfile$"
    ]
  }
}

package.json への追記

{
  "dependencies": {
    "renovate": "^39.222.1"
  },
  "scripts": {
    "renovate": "renovate --platform=local --dry-run=full",
    "renovate_help": "renovate --help"
  }
}

renovate 実行

  • RENOVATE_CONFIG_FILE=renovate.json npm run renovate

ローカルで実行する場合にはいろいろとオプションが必要です
コマンドの実体は以下です

  • RENOVATE_CONFIG_FILE=renovate.json renovate --platform=local --dry-run=full

これで Pipfile に書かれたパッケージが更新されるはずです

npx で直接実行もできます

  • RENOVATE_CONFIG_FILE=renovate.json npx renovate --platform=local --dry-run=full

local 動作では --dry-run=lookup になっており Pipfile.lock が作成されないので上書きします
LOG_LEVEL=debug を指定すると詳細なログが確認できます
またまだ renovate.json がない場合には --require-config=ignore を設定してください

エラーが出なければ OK です

動作確認

通常 renovate は更新があった場合にブランチからのPRが作成されます
ただ platform=local 実行の場合にはブランチの作成が許可されていないので platform=bitbucket などを指定して実際の挙動を確認しましょう

== の場合

当然ですがバージョンが固定されているので更新されません

isort = "==6.0.0"

で renovate を実行しても 6.0.1 には更新されない

~=の場合

この場合は 6.0.1 に更新されます

isort = "~=6.0.0"

で Pipfile.lock が更新され 6.0.1 がインストールされます

最後に

ローカルで renovate を試してみました
ローカルでは設定ファイルの確認くらいしかできないので実際はリモートリポジトリと組み合わせて使います
次回は bitbucket と組み合わせてみたいと思います

参考サイト

2025年3月28日金曜日

emacs で gptel を使ってローカルで起動した ollama と接続してみる

emacs で gptel を使ってローカルで起動した ollama と接続してみる

概要

前回 Openhermes をローカルに構築しました
今回は emacs の gptel を使って Openhermes と通信してみます
なお今回の記事はすでにローカルで Openhermes で起動している前提で話を進めます

環境

  • macOS 15.3.2
  • ollama 0.6.2
  • Openhermes v2.5
  • emacs 30.1
  • gptel 0.9.8

gptel インストール

  • M-x package-list-packages
  • gptel -> i -> x

gptel 設定ファイル作成

  • vim .emacs.d/site-lisp/llm/init.el
;; OPTIONAL configuration
(setq
 gptel-model 'openhermes:latest
 gptel-backend
 (gptel-make-ollama
  "Ollama"
  :host "localhost:11434"
  :stream t
  :models '(openhermes:latest)))

動作確認

gptel

M-x gptel を実行すると Openhermes とやりとりするバッファを選択するので *Ollama* バッファを選択します

すると ### というプロンプトになるのでここに質問を入力します
質問を入力したら C-c RET で質問を送信できます

gptel-send

gptel-send は現在のカーソル位置より上部のテキストを送信します
また返答も現在のバッファにそのまま書き込まれます

gptel-rewrite

gptel-rewrite はリファクタなどに使えます
現在選択している部分を上書きしてくれる機能です
リファクタする際に一行ずつやリファクタする方法などを追加で送信することもできます

最後に

他にもいろいろ機能はありそうです
Tools モードを使うと特定のパスに設定ファイルを作成してくれるタスクをインタラクティブに生成することもできるようです

copilot-mode と混同しているとキーバインドが同じケースがあるので別の割当てをする必要がありそうです

copilot-mode はデフォルトで auto-complete のように自動で補完してくれます
gptel はデフォルトではそうでなく修正したい箇所や新規でコードを追加してい場合で質問して LLM 側に書いてもらう感じになります

おそらくどちらも同じ機能があるかなと思うので使い分けというよりかはどちらか一方を使い倒すほうがいいかなと思います

copilot は無料だと制限があるので無制限にかつ無料で使いたい場合には必然的に gptel になるかなと思います
ただ gptel は当然ですがローカルに LLM を動かす環境が必要になるのでそれなりのマシンスペックが要求される点に注意です

参考サイト

2025年3月27日木曜日

M2 Pro Mac mini で Openhermes を動かす

M2 Pro Mac mini で Openhermes を動かす

概要

Ollama を使ってローカルで動かします

環境

  • macOS 15.3.2
  • ollama 0.6.2
  • Openhermes v2.5

ollama インストール

  • brew install ollama

ollama 起動

  • ollama services run ollama

Openhermes 起動

  • ollama run openhermes

この時点でインタラクティブモードになり質問することもできます

Open-WebUI 起動

  • docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

動作確認

localhost:3000 にアクセスすると UI を経由して Openhermes を使うことができます

最後に

精度はそこそこと言った感じです
軽量で日本語にも対応してるのでローカルで動かす LLM としては十分かもしれません
ただそこまで回答に期待はしないほうがいいかもです

参考サイト

2025年3月25日火曜日

eslint を 8 系から 9 系にするメモ

eslint を 8 系から 9 系にするメモ

概要

設定ファイルのマイグレーションが必要です

環境

  • node 20.18.2
  • eslint 8.41.0 -> 9.22.0

マイグレーション

.eslintrc.js を eslint.config.mjs にマイグレーションします

  • npx @eslint/migrate-config .eslintrc.js

バージョンアップ

devDependencies の部分を手動で書き換えます

  • vim package.json
{
  "devDependencies": {
    "eslint": "^9.22.0"
  }
}

ちなみに最新バージョンの確認は npm outdated で確認します
あとはインストールするだけです

  • npm i

ちなみに "eslint": "^8.41.0" という感じで書いている場合に npm update すると 8 系の最新までは自動でアップデートしてくれます

最後に

npm だけを使っている場合には手動でバージョンを書き換えて update する必要があります

2025年3月24日月曜日

treemacs の workspace の設定ファイルがあるパス

treemacs の workspace の設定ファイルがあるパス

概要

複数のワークスペースを手動で追加したい場合には直接設定ファイルを編集しちゃうのが簡単です

環境

  • macOS 15.3.2
  • emacs 30.1

パス

~/.emacs.d/.cache/treemacs-persist

直接編集する

先に emacs を停止しましょう

treemacs-persist とバックアップファイルを直接編集します
例えば以下のように特定のディレクトリ配下のプロジェクトを一括で追加できます

echo "* Default" > ~/.emacs.d/.cache/treemacs-persist && for i in `ls | grep -v update_libs.sh`; do echo "** ${i}\n - path :: ~/data/repo/${i}"; done >> ~/.emacs.d/.cache/treemacs-persist
echo "* Default" > ~/.emacs.d/.cache/treemacs-persist\~ && for i in `ls | grep -v update_libs.sh`; do echo "** ${i}\n - path :: ~/data/repo/${i}"; done >> ~/.emacs.d/.cache/treemacs-persist\~

動作確認

これで再度 emacs を開くと treemacs にプロジェクトが追加されています

トラブルシューティング

なぜか .emacs.d/.cache/treemacs-persist が改行されるというなぞの現象になるので修正します
この現象は before-save-hook などで自動フォーマットが設定されている場合に自動的に treemacs-persist もフォーマットしてしまい発生してる可能性が高いです

  • cat ~/.emacs.d/.cache/treemacs-persist-at-last-error
# State when last error occurred on 2025-03-20 10:36:48
# Error was 'First item must be a workspace name' in line '*'

*
Default
**
python-try
-
path
::
~/data/repo/python-try
  • vim ~/.emacs.d/.cache/treemacs-persist
* Default
** python-try
- path :: ~/data/repo/python-try

最後に

面倒な場合は直接キャッシュファイルを編集しちゃいましょう
フォーマットがあるのでそこだけ気をつけてください