BigGanttでJIRAのFilterが出てこないとき
BigGanttでプロジェクト作った後で、タスクを選択するためにJIRAでフィルター作っても候補が出てこない。
いつも対応方法を忘れるのでメモ。
Filterのところだけなぜか新しく作ったり修正してもなかなか反映されない。
Cacheをクリアしたら出てきたので、キャッシュクリアの方法。
詳細→アプリ→BigGantt→App configuration→Advanced→Clear cache
ラズパイ4で64bit OSをmSATA接続のSSDから起動させる
最初に書いておくと、盛大にハマりました。
この手の記事はぐぐればたくさん引っかかるし皆さんうまくいっているようです。
ただ失敗の記事はあまり引っかからないので書いとこうかなと思ったわけですね。
買ったもの
購入したのは、Raspberry Pi 4 Model B (メモリ8GB)です。
ヨドバシで共立プロダクツのスターターセットを購入しました。
付属のSDカードにはRaspberry Pi OS 32bit版が入っていました。
$ sudo dmesg | grep Machine [ 0.000000] OF: fdt: Machine model: Raspberry Pi 4 Model B Rev 1.4 $ cat /etc/os-release PRETTY_NAME="Raspbian GNU/Linux 10 (buster)" NAME="Raspbian GNU/Linux" VERSION_ID="10" VERSION="10 (buster)" VERSION_CODENAME=buster ID=raspbian ID_LIKE=debian HOME_URL="http://www.raspbian.org/" SUPPORT_URL="http://www.raspbian.org/RaspbianForums" BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs" $ uname -a Linux raspberrypi 5.10.17-v7l+ #1403 SMP Mon Feb 22 11:33:35 GMT 2021 armv7l GNU/Linux
速いストレージにしたかったので外付けのSSDも一緒に買おうと思ったのですが、ちょっと急いでいたのでヨドバシの購入ページでお勧めされていたトランセンドのmSATA3/128GB(TS128GMSA370)を一緒に買いました。
今思うとこれが良くなかった。いまさらマイナーなmSATAを買う事もなかったんだよね。ちゃんと調べとけばなー。
届いてからUSB3.0へ変換するケースが必要な事に気がつき、AmazonでZheinoのUSB3.0-mSATAケースを買いました。(アホだな)
https://www.amazon.co.jp/gp/product/B06XSD129T/
ついでに自分のモニターにはHDMIがないのでHDMI DVI変換アダプター HDMIメスタイプ BSHDADVも買いました。
ちゃんと調べないから、始めるまでが長いw
ブートローダー(EEPROM)の設定
結論から言うと、最新化する必要はありませんでした…
初期状態で以下のようになっています。
2020-09-03版ですね。
$ sudo rpi-eeprom-update BOOTLOADER: up-to-date CURRENT: 2020年 9月 3日 木曜日 12:11:43 UTC (1599135103) LATEST: 2020年 9月 3日 木曜日 12:11:43 UTC (1599135103) RELEASE: default (/lib/firmware/raspberrypi/bootloader/default) Use raspi-config to change the release. VL805_FW: Using bootloader EEPROM VL805: up-to-date CURRENT: 000138a1 LATEST: 000138a1 $ vcgencmd bootloader_version Sep 3 2020 13:11:43 version c305221a6d7e532693cc7ff57fddfc8649def167 (release) timestamp 1599135103 update-time 0 capabilities 0x00000000
最新のほうがいいかなと思って、 FIRMWARE_RELEASE_STATUS="stable"
にしてから2021-03-18版にしましたが、必要はなく元に戻しています。
USBで起動出来るようにしておく必要はあります。
初期状態の設定は以下のようになっています。
$ vcgencmd bootloader_config [all] BOOT_UART=0 WAKE_ON_GPIO=1 POWER_OFF_ON_HALT=0 DHCP_TIMEOUT=45000 DHCP_REQ_TIMEOUT=4000 TFTP_FILE_TIMEOUT=30000 TFTP_IP= TFTP_PREFIX=0 BOOT_ORDER=0x1 SD_BOOT_MAX_RETRIES=3 NET_BOOT_MAX_RETRIES=5 [none] FREEZE_VERSION=0
起動の優先順位をUSBにするには raspi-config
で簡単に出来ます。
$ sudo raspi-config → 6 Advanced Options Configure advanced settings → A6 Boot Order Choose network or USB device boot → B2 USB Boot Boot from USB if available, otherwise boot from SD Card
これでSDカードを抜かなくてもUSBから起動します。(USBが無ければSDカードで上がります)
この設定をすると再起動が要求されますが、一度シャットダウンしておきます。
※SSDから64bit OSで起動している現在の設定は以下のようになっています。
(BOOT_ORDER=0xf14
となっている所がUSB起動の設定です)
$ vcgencmd bootloader_config [all] BOOT_UART=0 WAKE_ON_GPIO=1 POWER_OFF_ON_HALT=0 DHCP_TIMEOUT=45000 DHCP_REQ_TIMEOUT=4000 TFTP_FILE_TIMEOUT=30000 ENABLE_SELF_UPDATE=1 DISABLE_HDMI=0 BOOT_ORDER=0xf14
SSDへOS書き込み
今どきは、Raspberry Pi Imagerで簡単に書き込みが出来ます。
Mac版のRaspberry Pi Imagerを以下からダウンロードして起動します。
32bit版ならこのツールから自動でダウンロードして書き込みまでしてくれますが、せっかくの8GBを有効利用したいので64bit版のRaspberry Pi OSを自分でダウンロードします。
今回は 2021-03-04-raspios-buster-arm64.zip を使います。
ここから落としました。
ホスト名やSSH、WiFiの設定をあらかじめ出来ます。
Ctrl+Shift+x
で設定画面が出てきますので設定しました。
CHOOSE OS
から Use custom
を選択し、あらかじめダウンロードしておいた 2021-03-04-raspios-buster-arm64.zip をセットします。
CHOOSE SD CARD
で、Macに繋げたSSDを選択します。
WRITE
を押します。
簡単です。
SSD起動
64bit OSを書き込んだSSDをラズパイにつなぎます。
当然、USB 3.0の口につなぐのですがこれでハマりました。
まず初回起動時ですが、root filesystemにある空き容量を検知して勝手にパーティションのリサイズが始まります。
これが結構時間がかかるので、LEDランプの点滅が収まるまで辛抱強く待ちましょう。うちは30分以上掛かりました。
その後、起動プロセスが始まるのですがなぜか EXT4-fs error が大量に出続けます。
fsck掛けたり、あらかじめパーティションを拡張しておいたり、EEPROMのバージョンを戻したり(最初は2021-03-18でやってた)、ケーブルを変えてみたり別のSSDと別のケースを持ってきたり、色々試しましたがどうしても解消しません…
いろいろぐぐって、このページにあるようにUSB 2.0にSSDを差し替えるとあっけなく起動しました。
何だったんだ…
諦めきれず、他に情報がないか調べていたら今度はこちらのサイトにあたりました。
これがビンゴ!!
自分もこの記事と同じ、 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge
でした。
この記事の通りやって無事、USB 3.0で起動しました!
まずはとりあえずUSB 2.0につないだ状態で起動して設定します。
$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge Bus 001 Device 003: ID 1bcf:0029 Sunplus Innovation Technology Inc. Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub $ lsusb -t /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M |__ Port 3: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 4: Dev 4, If 0, Class=Mass Storage, Driver=uas, 480M
JMicronのチップが使われているようです。
Driverが uas
になっている事が確認出来ます。
こちらの記事によるとUSAは、USB Attached SCSIというプロトコルで、USB mass-storageより高速なのですが、ドライバの実装がよくないと遅くなる事があるようです。
/boot/cmdline.txt
にカーネルパラメーターを追加して、usb-storageで動作するようにします。
先頭に usb-storage.quirks=152d:0578:u
というパラメータを入れます。改行は入れてはダメです。
$ sudo vi /boot/cmdline.txt console=serial0,115200 console=tty1 root=PARTUUID=7ff05857-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles ↓ usb-storage.quirks=152d:0578:u console=serial0,115200 console=tty1 root=PARTUUID=7ff05857-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
これでシャットダウンして、SSDをUSB 3.0の口に差し替えます。
電源を入れると起動しました!すばらしい!!
$ lsusb Bus 002 Device 002: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub $ lsusb -t /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M |__ Port 2: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
ちゃんとドライバが切り替わっているようです。(※マウスは外しちゃいました)
一応簡単にベンチマーク取っておきます。
- SDカード
$ sudo hdparm -t /dev/mmcblk0p2 /dev/mmcblk0p2: HDIO_DRIVE_CMD(identify) failed: Invalid argument Timing buffered disk reads: 28 MB in 3.00 seconds = 9.32 MB/sec
- USB 2.0でのSSD
$ sudo hdparm -t /dev/sda2 /dev/sda2: Timing buffered disk reads: 112 MB in 3.03 seconds = 36.97 MB/sec
- USB 3.0でのSSD
$ sudo hdparm -t /dev/sda2 /dev/sda2: Timing buffered disk reads: 690 MB in 3.00 seconds = 229.96 MB/sec
やったね。ちゃんと速くなってるよ!
フルスペックじゃないにしてもまあいいでしょう。
しかし、使い始めるまで長かったなー。
結論
ちゃんと下調べして買おう…
Macでまあまあよく使っているアプリまとめ(2021年3月)
Karabiner-Elements
ただただ素晴らしい。
Macを使う理由の一つ。(他の理由はフォントがきれいなこと、OSに統合されたUNIX likeなCLI環境があること)
vi風カーソルがないと生産性がた落ち。
設定は超簡単。自分で定義を書くのも簡単にできる。
iTerm2
素晴らしいターミナルアプリ。
Homebrew
Mac用パッケージマネージャ。
Karabiner-Elements、iTerm、Homebrewの組み合わせで快適なCLI環境がつくれる。
かわせみ3
3ライセンスキー:6,600円(税込)
Google日本語入力の変換のおかしさに耐えられなくなってかわせみに移行した。
かわせみも結構ひどいが少なくとも学習するし、そこそこカスタマイズできるので使えないということはない。
MacVim-KaoriYa
昔のviってUndoは1回だったし、syntax highlightもなかったけどそれでCのプログラム書いてた。
Vimではたいていのことが便利にできる。
軽いし、これで十分。
Firefox
会社Macだと社内システムがChromeに依存してたりするのだが、私物MacではFirefoxがメインブラウザ。
たまに使えないサイトがあるがその時はSafariを使えばいいので、Chrome使わなくても生きていける。
Chrome
会社Macだとメインブラウザ。
タブ開きすぎなので常にメモリを大量に使ってる。
Choosy
$10
Rebuildfmで紹介されてたので入れてみた。
リンクによって立ち上げるブラウザを切り分けることが出来る。
会社Macだと社内のURLはChrome、インターネットのサイトやGoogle検索はFirefoxと使い分けをしている。
Bartender
これも、Rebuildfmで紹介されてたので入れてみた。
メニューバーのアイコンが多すぎて、メニューで隠れてしまう問題があったのでちょうどよかった。
最新版のBartender4はBig Surのみ対応。会社のMacOS XがBig Surに上げられないので早く上げられるようにして欲しい。
1Password
$35.88(税抜) 1年間毎のサブスクリプション
もともとアプリで使っていたがデバイス間の同期が面倒くさくなってきたので、サブスクに切り替えた。とっても快適。
これのおかげでサービスごとに違うパスワードを使うことが出来る。
Fork
$49.99(3台まで)
動作が軽快で挙動が素直なのがよい。
SourceTreeは真逆なので乗り換えた。
Mac/Windows両方アプリがあるのも良い。
チェコの人が夫婦でつくっているらしい。
Alfred
Mega License £49
⌘+スペースで起動するようにしてSpotlightの替わりに使っている。
シングルクォート'からファイル名で簡単にファイルが開けるのとクリップボード履歴は必需品。
もちろんランチャーとしても使っている。ぱっと出るのが良い。
Logitech Options
このソフトでMX Anywhere 2のミドルボタンを範囲選択キャプチャ(クリップボード)に割り当ててる。
とりあえずどんどんキャプチャしていけば、Alfredのクリップボード履歴(画像)に残るので結構便利。
私物Macはマウス使ってないので入れてない。
Twitter App
apps.apple.comブラウザだとマウスオーバーのポップアップがうざいので何もでない公式アプリの方が良い。軽いし。
会社Macには入れてない。本当に入れてないよ。まじでw
LINE App
apps.apple.comたまに使う程度。入れとけば何かと便利。
メッセージ App
公式アプリ。
iPhoneのiMessageや連絡先と共有されるのが便利。
仕事だと割と長い文章を書かないといけないことがあるのでたまに使う。
私物Macだとそもそも携帯がAndroidなので使い道はない。
Slack
仕事ではお世話になってます。
ブラウザだとWorkspaceの切り替えが面倒くさいのでアプリを入れてる。
メモリ食いだけど。
辞書 App
英和辞典として、結構使ってる。
写真 App
iPhotoからようやく移行した。
iPhoto課金ユーザだったのになぁ。。。
特に便利とか無いけどとりあえず使ってる。
Pixelmator Classic App
apps.apple.comずいぶん前に買ったので値段は忘れた。いまは、\3,680
ちょっとしたサイトのデザインサンプルとかを書くときに使っている。
Pro用も出たけどこれで十分。(Proは使わずに言ってます)
X Lossless Decoder(XLD)
大量にある昔のCDを気が向いたらFLACでリッピングするために使っている。
VOX MUSIC PLAYER
XLDでリッピングした曲を確認するために入れている。
LICEcap
アニメーションGIFをつくるために入れている。
KeyCast
github.com アニメーションGIFをつくるときにキー入力を表示するために使っている。
VirtualBox
仕事でWindows開発用に使っている。
Google File Stream
会社でGoogle Workspaceを契約しているので使っている。
遅いし、誰かが大量のファイルを上げるとOSごとフリーズすることもあるけど、まあ便利。
Microsoft Office
仕事用。周りの人が使うので仕方なく使っている。
株価 App
公式アプリ。
ネット証券が出しているアプリはたいていWindows用なんですよね。
Macでチャートを見るのに結局これが一番使いやすい。
Steam
Factorioをやるために入れた。
WindowsでもMacのKarabiner-Elementsのようにキーバインドを変更したい
ということでAutoHotKeyの紹介なんですが、まずは前置き
まえおき
キーボード
20代の頃は仕事上キーボードは現場で用意されているものを何でも使わないといけなかったのですが、よく使っていたのはNEC EWS-4800、PC9801シリーズ、SunのType-5, Type-6などのキーボードでした。
日本語キーボードもあれば英語キーボードもありましたし、キーマップもわりとそれぞれ違ってたりしましたね。
なかでも、SunのType-5をこよなく愛するプロジェクトリーダーの下で仕事をしたときに英語配列を気に入り、以降は選べるときは英語配列を選ぶようになっていきました。
30代ではHHKBとThinkPad Keyboard、40代から現在にかけてはHHKB Professional2 Type-S(US)を個人でも会社でも両方使うようになっています。
EWS-4800用キーボード
Sun Type5 UNIX Keyboard, Type 6 Keyboard
HHKB Professional2 Type-S(US)
主な使い方
現在の主な使い方の組み合わせは以下のようになっています。
場所 | 所有 | PC | OS | Keyboard | 注意点 |
---|---|---|---|---|---|
自宅 | 個人 | Macbook Air 2018 | OS X BigSur | US版 | ノートPC |
自宅 | 会社 | Mac mini 2018 | OS X Catalina | HHKB Type-S(US) | メイン |
自宅 | 会社 | Mac mini 2018 | Windows10 | HHKB Type-S(US) | VirtualBox |
自宅 | 会社 | ThinkPad X1 Carbon Gen7 2019 | Windows10 | US版 | ノートPC |
会社 | 会社 | ThinkPad X1 Carbon Gen7 2019 | Windows10 | HHKB Type-S(US) | キーボードのみオフィスに置いてる |
一番使っている時間が長いのは、Mac miniにつないでいるHHKB Type-S(US)なのですが、ThinkPadにもつなぐ事があるのでWindowsでもそれなりに同じ操作ができないと仕事になりません。
そこでAutoHotKeyの出番というわけです。(やっとか)
※WindowsのCapsLockはCtrl2Capを使って入れ替え済みです。
AutoHotKeyで矢印キーを実現する
一番使用頻度が高いHHKB Type-S(US)には、矢印キーがありません。
デフォルトでは Fn + ;/['
なのですが、そんなの使いにくくてしょうがないので自分は Ctrl + hjkl
を割り当ててます。
いわゆるvi風ってやつですね。(ちなみにメインのエディタはVimです)
MacだとKarabiner-Elementsという素晴らしいソフトで実現しているのですが、Windowsでいい感じのソフトを探していたらAutoHotKeyというので出来ました。
Windows + HHKB Type-S(US)を使うときだけでなくThinkPad単体で使うときもうまく行ってます。
ちなみにMac mini上のVMでWindowsを使うときはMacのキーバインドがそのまま使えるので何もしていません。
レシピ
AutoHotKeyは設定を拡張子ahkのファイルにテキストで記述し、コンパイルしたものを起動時に実行させます。
矢印キーは押しっぱなしになるのでキーリピートの設定を入れてます。
; キーリピートの早いキーボードだと警告が出るので設定 #HotkeyInterval 100
矢印キーの制御を記述します。
; vi like key ^h::Send, {Left} ^j::Send, {Down} ^k::Send, {Up} ^l::Send, {Right}
以下のページからリファレンスを見ることが出来ます。
「ホットキー」と「キーリスト」を見ると定義がわかります。
修飾シンボルとして ^
がCtrlキーとなり、Leftはキーリストから探すと矢印キーの左になりますね。
つまり ^h::Send, {Left}
は Ctrl+h
が来たら 左矢印キー
になるということです。
j, k, lも同じように定義します。
Shiftを押しながら選択移動も定義します。
^+h::Send, +{Left} ^+j::Send, +{Down} ^+k::Send, +{Up} ^+l::Send, +{Right}
Shiftの修飾シンボルは +
です。
つまり ^+h::Send, +{Left}
は Ctrl+Shift+h
が来たら Shift+左矢印キー
になるということです。
その他
Emacs風のもの少し
Emacs風というよりはbashやzshの対話シェルのときによく使ってるからという感じでしょうか。
特に Ctrl + a
と Ctrl + e
は多用するので設定しています。
^a::Send, {Home} ^+a::Send, +{Home} ^e::Send, {End} ^+e::Send, +{End}
Slackの送信ボタン
Slackを日本語モードにすると Enter
が改行になるのはいいんですが、送信がMacだと Cmd + Enter
、Windowsだと Ctrl + Enter
でよく間違えます。
両方同時に使ってると頭のモード切替が間に合わなくてw
よく使うMacに合わせるためにWindowsでは Alt + Enter
で送信出来るように設定します。
この設定はSlackのときだけ使えるようしています。
; slack #IfWinActive, ahk_exe slack.exe !Enter:: Send, ^{Enter} return #IfWinActive
#IfWinActive
はWindowタイトルやプロセスを指定してその時だけ動作するように設定できます。
Windowタイトルやプロセスはahkスクリプトを実行したときにタスクトレイのアイコンを右クリックすると、出てくるWindow Spyというツールで調べることが出来ます。
※1行で書くときはreturnが省略できますが、複数行ではreturnを書かないと次に流れていってしまいます。(思わぬ挙動になったりします…)
今後
とりあえず今はこれだけですが、Karabiner-Elementsで出来ているCtrlキーを一回押すとEscになって、長押しはCtrlとして動く、というのも実現したいな。
Karabiner-ElementsはWebでほしい設定をポチポチ押すだけで設定できるので他にも色々設定しているけど、AutoHotKeyは記述しても思ったように動かないことが多くて、デバッグが結構必要になるし、ちょっとづつ増やしてる感じですね。
VMWare ESXi 7.0をアップデートする
ESXiにHDDを追加したのでついでにアップデートしました。
ESXi 7.0 15843807から16324942にしてます。
以前やったのは5.5から6.5にしたのですが、7.0ではアップデート用のファイル名が変わっていました。
7.0では、VMware vSphere Hypervisor (ESXi) Offline Bundle というのを使うようです。VMware-ESXi-7.0b-16324942-depot.zipですね。
# esxcli software sources profile list -d /vmfs/volumes/datastore/VMware-ESXi-7.0b-16324942-depot.zip Name Vendor Acceptance Level Creation Time Modification Time ---------------------------- ------------ ---------------- ------------------- ----------------- ESXi-7.0bs-16321839-no-tools VMware, Inc. PartnerSupported 2020-06-02T05:57:00 2020-06-02T05:57:00 ESXi-7.0b-16324942-standard VMware, Inc. PartnerSupported 2020-06-02T17:26:43 2020-06-02T17:26:43 ESXi-7.0bs-16321839-standard VMware, Inc. PartnerSupported 2020-06-02T05:57:00 2020-06-02T05:57:00 ESXi-7.0b-16324942-no-tools VMware, Inc. PartnerSupported 2020-06-02T17:26:43 2020-06-02T17:26:43
ESXi-7.0bとESXi-7.0bsの2つが入ってる…。
ここを見ると、
名称とバージョン | リリース日 | カテゴリ | 詳細 |
---|---|---|---|
ESXi 7.0b - 16324942 | 06/16/2020 | 機能拡張 | セキュリティとバグ修正のイメージ |
ESXi 7.0bs - 16321839 | 06/16/2020 | 機能拡張 | セキュリティのみのイメージ |
ということなので、ESXi 7.0bを採用。
# esxcli software profile update -p ESXi-7.0b-16324942-standard -d /vmfs/volumes/datastore/VMware-ESXi-7.0b-16324942-depot.zip Update Result Message: The update completed successfully, but the system needs to be rebooted for the changes to be effective. Reboot Required: true VIBs Installed: VMW_bootbank_nvme-pcie_1.2.2.14-1vmw.700.1.25.16324942, … VIBs Removed: VMW_bootbank_nvme-pcie_1.2.2.13-1vmw.700.1.0.15843807, … VIBs Skipped: VMW_bootbank_bnxtnet_216.0.50.0-4vmw.700.1.0.15843807, …
アップデートできました!
後で気がついたんですが、VMware-ESXi-7.0U1c-17325551が出てますね…。
Bitbucket Server(オンプレ)からbitbucket.org(クラウド)への移行
この記事は、Infocom Advent Calendar 2020 15日目の記事です。
2020年の9月くらいからBitbucket Serverの移行をしたときの話です。
まえがき
自分が所属している部署では2014年に自分が導入したBitbucket Serverを使っています。(その前はSubversion)
COVID-19以降は基本在宅勤務になり、制約はあまりないが接続が面倒なSSL-VPNから接続を意識しないブラウザベースのPre App VPN主体へと切り替わり、CloneやPush/Pull出来ないオンプレのGitサーバが使いにくいと思う事が増えてきてました。
また、20年以上その時々に所属する部署の開発環境を整備してきたのだけど、いつまでも自分がやれないこともあるし、残してきたシステムが古くなるさまを見ると、マネージドなサービスに移行すべきなんだろうなと考えていたりして、移行に踏み切れたのかもしれないですね。
移行直後に、AtlassianからオンプレミスのServer製品EOLが発表されたのでタイミングとしては良かったのかなと思ってます。
事前調査
中身はGitなのでリポジトリが移行出来るというのはわかってました。これはbitbucket.orgじゃなくて別サービス、例えばgithub.comでも一緒です。
Pull Requestは移行できないというのが公式サイトにも書いてあったのでそこは考えた末に、過去分はオンプレで見れるからいいやということにしました。
やってみて、気がついたのがフォーク(fork)でした。今までフォークしたリポジトリ間でPull Requestを出すようなワークフローでした。
が、普通にリポジトリを移行しただけではフォーク関係が切れてしまいました。
これでは今のワークフローが回らなくなるので、フォークを維持しながら移行できるか調べたら、なんとかなりました。
支払いはドル建てのクレジットカード払いになるということはわかっていたので、そこは社内で精算方法を確認しておきました。
移行
大まかな手順はこんな感じです。
git clone --mirror
で社内リポジトリのミラーを作成- APIでクラウドにリポジトリ作成
- 社内のミラーに、クラウドリポジトリをremoteとして登録
- 社内ミラーをクラウドリポジトリへpush
フォークがあるともうちょっと複雑になります。
git clone --mirror
で社内リポジトリのミラーを作成- APIでクラウドにリポジトリ作成
- 社内のミラーに、クラウドリポジトリをremoteとして登録
- 1のforkリポジトリのミラーを作成
- APIでクラウドに2のforkリポジトリ作成
- 社内のforkミラーに、クラウドforkをremoteとして登録
- 社内forkミラーをクラウドforkへpush
- 社内ミラーをクラウドリポジトリへpush
という感じです。
リポジトリ
Bitbucket Serverとbitbucket.orgのリポジトリはURLが違います。
Bitbucket Serverは、 https://git.intra.example.com/scm/$PROJECT/$REPO
という構成になっています。
bitbucket.orgは、 https://bitbucket.org/$WORKSPACE/$REPO
です。
概念としてはクラウドにもプロジェクトはありますが、URLで識別するものではなくなっています。
単純なリポジトリの移行ならこんなスクリプトでやってます。
Macでやってますが、デフォルトのbashでは使えない機能を使ってしまったので、homebrewで入れたbashを使っています。
#!/usr/local/bin/bash
リポジトリは --mirror
オプションを付けてクローンしてます。
git clone --mirror https://userid@git.intra.example.com/scm/$ORG_PROJECT/$REPO
クラウドにリポジトリを作るAPIは、割と単純ですが、プロジェクトを指定するために指定するJSONは結構試行錯誤しました。
消してから作るようにしているので、移行後に流すのは厳禁です。
(※実際にはコマンドは改行なしの1行です)
curl -v -X DELETE -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,} curl -v -X POST -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,} -d { "scm": "git", "is_private": true, "fork_policy": "no_public_forks", "name": "'$R'", "project": { "type": "project", "name": "'$PROJECT'", "key": "'${PROJECT^^}'" } }
Git-LFSは使っているところが少ないのですが、もれないようにスクリプトの中で発行してしまってます。
git lfs fetch --all ... git lfs push --all new
remoteにpushするのは --mirror
オプションを付けていますが、 git push --all new && git push --tags
の方がいいのかもしれない?
git push --mirror new
次に移行するリポジトリがあったら調べてみようかな。
以下スクリプトの全文です。
#!/usr/local/bin/bash BASE_DIR="/Users/gozu/projects/migration" WORKSPACE="example_ws" ORG_PROJECT="Project1" PROJECT="Project1" REPOS="repo1 repo2" rm -rf $PROJECT mkdir $PROJECT cd $PROJECT for R in $REPOS ; do REPO=$R.git rm -rf $REPO git clone --mirror https://userid@git.intra.example.com/scm/$ORG_PROJECT/$REPO curl -v -X DELETE -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,} curl -v -X POST -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,} -d '{"scm":"git", "is_private":true, "fork_policy":"no_public_forks", "name":"'$R'", "project": {"type":"project", "name":"'$PROJECT'", "key":"'${PROJECT^^}'"} }' cd $REPO git lfs fetch --all git remote add --mirror=push new https://userid@bitbucket.org/$WORKSPACE/$REPO git push --mirror new git lfs push --all new cd .. done cd $BASE_DIR
- 参考
フォーク
bitbucket.orgのリポジトリはURLにプロジェクトが入らなくなったので、forkして同じリポジトリ名を別プロジェクトに作ることが出来ません。
なので、forkを移行するときはリポジトリ名の後ろに -fork
を付加して移行しました。
https://git.intra.example.com/scm/$PROJECT/$REPO
→ https://bitbucket.org/$WORKSPACE/$REPO-fork
という感じですね。
以下のスクリプトは、repo1, repo2にそれぞれ別プロジェクトでフォークがあった場合です。
forkを含めて空のリポジトリを作ってからpushしてます。
フォークはリポジトリ名に -fork
を付加してAPIで作ってます。
(※実際にはコマンドは改行なしの1行です)
curl -v -X DELETE -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${FORK_R,,}-fork curl -v -X POST -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${FORK_R,,}/forks -H 'Content-Type: application/json' -d { "name": "'$FORK_R'-fork", "workspace": { "slug": "$WORKSPACE" }, "project": { "type": "project", "name": "'$FORK_PROJECT'", "key": "'${FORK_PROJECT^^}'" } }
以下スクリプトの全文です。
#!/usr/local/bin/bash BASE_DIR="/Users/gozu/projects/migration" WORKSPACE="example_ws" ORG_PROJECT="Project1" PROJECT="Project1" REPOS="repo1 repo2" rm -rf $PROJECT mkdir $PROJECT cd $PROJECT for R in $REPOS ; do REPO=$R.git rm -rf $REPO git clone --mirror https://userid@git.intra.example.com/scm/$ORG_PROJECT/$REPO curl -v -X DELETE -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,} curl -v -X POST -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,} -d '{"scm":"git", "is_private":true, "fork_policy":"no_public_forks", "name":"'$R'", "project": {"type":"project", "name":"'$PROJECT'", "key":"'${PROJECT^^}'"} }' cd $REPO git lfs fetch --all git remote add --mirror=push new https://userid@bitbucket.org/$WORKSPACE/$REPO #git push --mirror new ← fork作ってからPushする #git lfs push --all new ← fork作ってからPushする cd .. done cd $BASE_DIR FORK_PROJECT="ForkProject" FORK_ORG_PROJECT="fp" FORK_REPOS="repo1 repo2" rm -rf $FORK_PROJECT mkdir $FORK_PROJECT cd $FORK_PROJECT for FORK_R in $FORK_REPOS ; do FORK_REPO=$FORK_R.git rm -rf $FORK_REPO git clone --mirror https://userid@git.intra.example.com/scm/$FORK_ORG_PROJECT/$FORK_REPO curl -v -X DELETE -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${FORK_R,,}-fork curl -v -X POST -u userid:passwd https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${FORK_R,,}/forks -H 'Content-Type: application/json' -d '{ "name": "'$FORK_R'-fork", "workspace": { "slug": "$WORKSPACE" }, "project": {"type":"project", "name":"'$FORK_PROJECT'", "key":"'${FORK_PROJECT^^}'"} }' cd $FORK_REPO git lfs fetch --all git remote add --mirror=push new https://userid@bitbucket.org/$WORKSPACE/$FORK_R-fork.git git push --mirror new git lfs push --all new cd .. done cd $BASE_DIR cd $PROJECT for R in $REPOS ; do REPO=$R.git cd $REPO git push --mirror new git lfs push --all new cd .. done
- 参考
機能差
移行後に気が付きましたが、細かい機能差があります。
どうやらクラウド版とオンプレ版では別製品のようですね。(クラウド版はPython実装で、オンプレ版はJava実装みたい)
パッと気がついたところで以下のような差異があります。だいたいクラウドでは出来ないという感じ・・・。今後に期待。
- Shift-JISが文字化けする
- Pull Requestで旧表示(See the old experience)にすると化けないこともある
.gitattribute
でdiffは直るようだが、ファイル表示では化けてる
- 要作業がない
- 昨日(2020/12/14)、
Request changes
がリリースされた!
- 昨日(2020/12/14)、
- Pull Request作成後、添付ファイルを追加できない
- Pull Requestを作るときは添付できる
- プロジェクト設定がない
- git lfsの容量で課金額が変わる
- むやみに使わないようにするしか無いかな
- Pull Requestの削除がない
- 却下のみ
- クラウド版のJIRAとの連携は強化されている
- JIRAも同じ時期にCloudへ移行したのでこれは嬉しかった
- SourceTreeがうまく使えない
- 特に社内のProxy環境下で・・・
- なんか意味不明な挙動をするので、早々に諦めて私はForkというアプリに移行しました。VS Codeに移行したメンバーも居るよう
- CI(pipeline)がついた
- まだ使ってない(既存のCIはJenkins)
- オンラインエディターがついてた
- 以前はAddonを買っていたので節約できた
- Markdownのレンダリング結果が違う
- 修正するしか無い
- 自動マージングがなくなった
- これはすごい不便。git-flowでやってるので、releaseブランチをmasterとdevelopの両方に自動でマージしたいのに・・・
- Addonだけど、Auto Unapprove for Bitbucket Serverに相当するものがない
APIでまとめて設定
プロジェクト設定がなくなったので、リポジトリ毎に設定をしないといけないが1つづやってられない・・・
APIでやりたいことは一応出来た。
とりあえずやったことは、ブランチのアクセス許可の設定です。
masterとdevelopの削除禁止と履歴の書き換え禁止、プルリクエストでマージ(全員)です。(他もやればできそう)
(※実際にはコマンドは改行なしの1行です)
curl -v -X POST -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,}/branch-restrictions -d '{ "kind": "force", "pattern": "master", "branch_match_kind": "glob" }' curl -v -X POST -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,}/branch-restrictions -d '{ "kind": "delete", "pattern": "master", "branch_match_kind": "glob" }' curl -v -X POST -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE/${R,,}/branch-restrictions -d '{ "kind": "push", "user": [], "pattern": "master", "branch_match_kind": "glob", "groups": [] }'
全リポジトリに強制的に付与したので、リポジトリの一覧を取得してます。
APIでリポジトリの一覧を取得しているのですが、一回のリクエストに付き最大100個しか取れないので以下のようにしてます。
2ページ取ればよかったのでループにはしてないですね。。。
以下スクリプトの概要です。
#!/usr/local/bin/bash #--- page 1 --- REPOS=`curl -v -X GET -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE\?pagelen\=100\&page\=1 | jq -r '.values[].name'` for R in $REPOS ; do ... done #--- page 2 --- REPOS=`curl -v -X GET -u userid:passwd -H "Content-type: application/json" https://api.bitbucket.org/2.0/repositories/$WORKSPACE\?pagelen\=100\&page\=2 | jq -r '.values[].name'` for R in $REPOS ; do ... done
- 参考
残課題
bitbucket.orgのミラーを社内に残ったBitbucket Serverに作って、1日1回くらい同期させておきたい。
バックアップにもなるし、メンテ落ちのときにソースも見られるし。
Macでリンクによって起動するブラウザを切り替える
rebuild.fm で何回か紹介されていたChoosyを入れてみました。
在宅勤務が常態化して8ヶ月位なのですが、社内で勤務していたときにはなかった事が起きてます。
例えば、社内のサイトを見るために、ブラウザベース(Chrome)のPer App VPNが導入されたとかですね。
社内勤務のときは例えばSlackからリンクを押しても、Proxyを通るか通らないかの違いくらいで、どのブラウザでも同じようにページを開くことが出来ました。
しかし、現在の在宅勤務では、Per App VPN経由の社内サイトはChromeでしか開けず、GSuiteはクラウド認証をしないと使えず、という状況になっています。
社内サイトはChrome一択です。
Chrome以外のFirefox、Safariは常時クラウド認証を通してないのでGSuiteもChromeで開きたいです。
逆に、インターネット上のサイトはFirefoxで開きたいです。これは理由があってGoogle meetをChromeでやってるときに、別のタブで重いページを開くとmeetが止まったりして嫌なので、裏で調べ物などをするときはFirefoxを常用しているからですね。
で、Choosyの出番なのですが、SlackにはられているURLをクリックすると全部Chromeに飛んでしまうので、URL毎にブラウザを切り替えたかったということです。
下の図のようにSlackのリンクを押したらリンクの内容に応じて、
- 社内にあるConfluence、Redmineやクラウド認証が必要なGSuiteなら、Chrome起動
- Cloud版を利用しているJIRAやBitbucket、Stack Overflowやgithub.comならFirefox起動
- 判断に困るようなサイトがあれば手動選択
というようなことが出来ます。
しばらく使った結果、とてもいい感じだったのでPayPalで10$支払いました。
ルールの設定方法は簡単で、Choosyを起動したら Rules
タブを開き、 +
を押してルールとどのブラウザを選ぶか(それともブラウザを手動で選ぶか)決めるだけです。
この例だと、Slackで社内サイトならChromeを使うことにしてます。
GSuiteなら以下のように設定してますね。