Fumiya_Senoo’s diary

日々の気になったこと、役立ったことを記録しています

プロキシサーバー配下の Jenkins サーバーから秘密鍵を使用して GitHub にアクセスしたかった話

記憶だよりで書いてるから間違ってるところあるかも…

非公開リポジトリのような認証が必要なリポジトリにアクセスする場合に、秘密鍵による認証をしてアクセスしたい。

結論はめっちゃ簡単。でもこういうことは、やってみたことがないと詰まるやつ。

結論

普通にターミナル上で プロキシサーバー経由で git コマンドが通るようにすればよい。

秘密鍵/公開鍵ペアを作成する

2022/09/14 現在今時なのは下のコマンドの通りですかね。 GitHub に RSA 暗号登録できない(登録しても使えない)ですしね。

途中で色々聞かれるのは基本的にはそのままで OK。ただし、パスフレーズは入力しておきましょう。うっかり秘密鍵が漏洩したとき、使われてしまうまでの時間稼ぎができます。秘密鍵が漏洩したときは各所に登録してる対応する公開鍵削除しましょうね。

ssh-keygen -t ed25519

GitHub に公開鍵を登録する

公式が正義ですね。下記参照。

docs.github.com

ssh がプロキシサーバーを経由するようにする

他にもいろいろあるだろうけれど、例えば corkscrew を使用する。

~/.ssh/config に設定ファイルを作る。ここでいうホームディレクトリは Jenkins ユーザーのホームディレクトリのこと。標準的には /var/lib/jenkins になっているはず。

Host github.com
    HostName ssh.github.com
    ProxyCommand corkscrew {プロキシサーバーのホスト名} {プロキシサーバーのポート番号} %h %p
    User git
    Port 443

鍵が登録できたことを確認する

ssh -T github.com

でアクセス成功したら OK。ただし、シェルアクセスできないので、すぐに追い出されます。

ここで、 ~/.ssh に known_hosts が作成されます。これが大事。 Jenkins 上で Job として動作させた際に known じゃない場合、別途設定が必要になります。面倒くさいからこれで事前作成しておく。

ターミナル上で、動作確認

git clone {リポジトリ} # 例えば git@github.com:FumiyaSenoo/TwitchCommentViewer.git

Jenkins 上で動かす

Credential として、↑で作成した秘密鍵を登録しておく。そして、 Job の中で GitHub にアクセスする際にその Credential を使用すること。それだけ。簡単。

個別記事にはできないような小ネタ dd 関連編

OS イメージのインストーラーとしてふるまう USB メモリを作成する

dd で OS イメージを USB メモリに対して焼くだけ。簡単。

dd if={OS イメージのパス} of={USB メモリのパス}

以上。

もちろん、 USB メモリはアンマウントしておくこと。

壊れかけの HDD からデータを救出するためのコマンド

その名も、 ddrescue。使い方は、なぜか Wikipedia の内容がやたらと充実しているのでそちら参照。

ja.wikipedia.org

ただの dd とは違って、壊れかけの領域をいい感じに取り扱ってくれます。 HDD の挙動が怪しくなった直後に使ったことがありますが、おそらくロスなし救い出せたので優秀。

ブロックサイズを適切に設定しないと遅くなる

本当にそれだけなんだけれども、小さすぎるブロックサイズを指定していすると遅くなる場合があります。(ストレージの性質によるはず。)

すずめの戸締まり(小説版) 感想

とりあえず、面白かったです。映画も楽しみ。

「感想」(特に「作品の内容」)の項目は思いっきりネタバレありなので、ご注意を。

どんな作品か

2022年11月11日に映画が公開予定な小説です。筆者は同作品で映画監督も務める新海誠。ここ最近でいうと、「君の名は。」、「天気の子」に続く作品です。

上記2作と同じく、ちょっとした超常現象(この作品内における日本で地震が起きる理由)ありな感じで時代設定は現代なボーイミーツガール的な作品でした。

確か、「君の名は。」は映画公開後に小説発売、「天気の子」は映画と小説が同時だったはず。今回は、小説の方が先。

あらすじ

は、適当に公式サイトでも見てください。

感想

作品の内容

この項はネタバレあり。

この作品、東日本大震災をストーリー内で取り扱っているんですよね。そろそろそうやって昇華していかないといけないような年数がたったんですね。確かに11年半(作品内では12年)経ってますからね。

2016年頃に宮城に旅行に行ったことがあって、海の近くで「あの高さまで津波が来たんだよ」といった話を聞いたんですが、結構な高さで驚いた覚えがあります。

作品の内容に戻って。いつもの新海誠作品らしく、大きく前半と後半に分かれてます。

前半は、主人公のすずめが住んでいる宮崎から、ダイジンを追いかけて、最終的に東京まで行くお話。愛媛と神戸でそれぞれ人に出会って助けられます。こういった人と人とのやりとりが新海誠作品のいいところ。

後半は、なんやかんやあって、宮城を目指すことになる。このあたりで、冒頭に書いたとおり東日本大震災をモチーフにした作品だということに気付くわけですが、「あぁ、もうそんなに昔のことになったのか。」と思わされたものです。ダイジンとサダイジンの思惑が正直よくわからなかった(一緒に(?)旅をしている中で考え方を変えたのだろうと思ってはいる)のですが、最終的にはみんな元の役割に戻って、一応ハッピーエンドでしょうかね。

地震の記憶

いわゆる大地震はいくつか経験していますが、

な感じですね。

阪神淡路大震災当時は、まだ小さかったので、朝起きると家の中で食器が多量に割れていて大変だったという覚えぐらいしかないです。地震の最中(5時台)は全然目を覚まさなかったようです。

東日本大震災当時は、関西のある大学の構内にいたのですが、ゆっくりとした揺れを感じて気持ち悪くなった覚えがあります。まだスマートフォンはもっておらず、そのとき地震だということは全然気づかず家に帰ってニュースを見たら大変なことになったなぁと思ったものです。

大阪府北部地震当時は、さすがに震度6弱地域だったために、本棚から大量の本が滑落して大変だった覚えが。食器は全然問題なかったのに。あと、後片付け中にガンプラ踏んで、足の裏をけがしました。堅いもの転がってないし大丈夫と思ったら、ガンプラが1機だけ存在したという悲しいお話。 後は、上2つの地震と違って、大地震な上に一人暮らしだったために、結構な不安には苛まれましたね。結果的には東日本大震災と違って、津波被害はなく、余震が続くこともなかったので、翌日には日常生活を取り戻しました。

余談

完全に個人的な好みの話ですが、小説を先に読んで、映像を後で見る方が好きなので今回の映画は余計に楽しみです。

あと、めんどくさいオタクなので、「秒速5センチメートル」のやるせない感じも好きだったりします。平和なハッピーエンドの方が心は穏やかなんだけれども。

2022/08 に読んだ本

感想は一言ぐらいで、とりあえず列挙します。

クラスで2番目に可愛い女の子と友だちになった2

とても面白い。いいイチャイチャといいストーリー。

男子だと思っていた幼馴染との新婚生活がうまくいきすぎる件について2

いいイチャイチャ。妹と妹のキャラがいい感じにおかしいのがいい。

マッチングアプリで元恋人と再会した。

一旦別れてしまった二人が、マッチングアプリ経由で再び出会って、なんやかんや継続して会うことになって、お互い素直になれなくて、みたいストーリー。続きが気になる。

転校先の清楚可憐な美少女が、昔男子と思って一緒に遊んだ幼馴染だった件5

4巻からは予想通りの進み方であまり進まなかったかな。次巻で一気に進むといいなぁ。

男と女は打算が9割

極端な内容だったけど、そういう考え方をする人もいるよねってことで。

珈琲店タレーランの事件簿 8 願いを叶えるマキアート

このシリーズ好きなんだ。面白かった。ちゃんと感想書くべきだったなぁ。一時期、刊行期間がかなり空いたので、大丈夫かな?と思っていたんだけど、8巻は7巻あとがきでの予定通り刊行されてよかった。

微熱空間 4

刊行期間が長いので、 3 がどんな話か忘れてしまいましたが…面白かったです。

イチャイチャするとお金が湧いちゃう2人の話

いいイチャイチャだった。

ごくごく普通の夫婦の話

↑の続きの話。こちらもいいイチャイチャ。

[メディアミックスメイデン(3)

面白かった。次最終巻っぽい?

新しいきみへ

面白い。これからどうなるのか楽しみ。パンデミックもの?といえばいいのだろうか。

三ヶ月前に別れた先輩後輩の話

Twitter で流れてきたので買ってみたんだけど、正直微妙だった。

「君恋」シリーズ

1, 2, 4, 3巻の順に読んでしまった。ただ、3巻が番外編、4巻が短編集でほぼ3巻の内容関係なしだったので、何とかなった。3巻の外伝はちょっと微妙だったが、1, 2巻はいいすれ違いものだった。4巻もいい短編集だった。続刊あればうれしいけど、難しいかな?筆者買いしてもいいと思ってる。

未熟なふたりでございますが(12)

いいイチャイチャもの。

[この会社に好きな人がいます(12)

こちらもいいイチャイチャもの。社会人イチャイチャものが好きなのか?

ゴブリンスレイヤー 13巻

アニメ化されてから買ってる。惰性で買っているのではあるけど面白い。

ぜんぶきみの性 5

緩めの TS もの。面白い。ストーリー的には転換点かな?

Pomera DM250 に Linux をインストールして、 i3status を導入したのに、メモリ使用量が表示できなかった

原因はわかった。

解決方法も分かった。が、解決はしていない。(面倒くさかった)

DM 250 に Linux を導入する

参考にしたページだけ。

Debian on Pomera DM200/DM250 – 記録

pomera DM250 の Linux 化のメモ - Qiita

i3status 導入したのに、メモリ資料量が表示できなかった件

事象

メモリ使用量が「can't read memory」と表示されている。

原因

/proc/meminfo を見ると、 MemAvailable の行が存在しなかった。

解決方法

王道の解決方法は Linux カーネルをビルドしなおすことになるはず。が、この解決方法はちょっと現実的ではない(/proc/meminfo の表示内容を変更したいだけのために Linux カーネルをビルドするのはいくら何でも大仰すぎる)。

現実的な解決方法は i3status 以外を使用する。

調べると、いろいろ存在する(conky とか)。が、簡単に自作できるようなので、それでいもいいかなと。

i3status のふるまいと代替物の自作

i3status コマンドを実行してみるとわかるが、定期的に1行分標準出力に文字列を表示するだけのアプリケーションである。つまり、同等なものを作ればよい。

例えば、シェルスクリプトで書くなら以下のような感じ。(実際には echo の部分は表示したい内容)

#!/usr/bin/env bash

num=0
while :
do
    num=`expr $num + 1`
    echo "$num"
    sleep 5
done

おまけ

どうやって原因を特定したか

i3status のソースコード(i3status/print_mem.c at main · i3/i3status · GitHub)を見ると、 /proc/meminfo が開けない(read 出来ない) or /proc/meminfo の中に特定の6行が表示されていないと「can't read memory」と表示してしまう。

通常ユーザーで、

cat /proc/meminfo

してちゃんと表示されるので、 read できないはないだろう。で、 /proc/meminfo を見てみると↑に書いた原因であった。

そして、 /proc/meminfo を表示する部分のソースコード(linux/meminfo.c at master · torvalds/linux · GitHub)を見る限り、普通、 MemAvailable の行が表示されるはずなのだが、表示されていなかった。

結局、困ったときはソースコードをあたることになるんだなぁ。こういう時の原因追及のしやすさがオープンソースのいいところよね。

DM250 Linux 環境での Tips

オリジナル環境で生成されるテキストファイルの形式

UTF-8 の場合 BOM 付きであった。 hexdump 最強。(そもそも設定で ShiftJIS か UTF-8 かは選べます)

オリジナルの環境と Linux 環境でファイルを共有する

Linux 側は /mnt/sd/ にマウントされている。オリジナル側は SD カードに保存すればよい。

US 配列で認識させる

/etc/default/keyboard を編集しても、なぜか日本語配列で認識されてしまったので、 .zshrc に以下を追加した。

setxkbmap -layout us

WSL2 で Jenkins 動かして、 Docker を操作する

ちょっと、 Jenkins で Docker を操作したかったので試してみた。

WSL2 は Stable Diffusion 触ってみました - Fumiya_Senoo’s diary のときにインストールした。

Jenkins のインストール

www.jenkins.io より

curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo tee \
  /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins

インストールが終わったら↓で Jenkins サービスを起動する。

service jenkins start

Windows 上で localhost:8080 にアクセスすると Jenkins 管理画面へアクセスできる。 初期設定の流れはちゃんと読めばできるので割愛。

Docker のインストール

japan.zdnet.com より

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo aptinstall apt-transport-https ca-certificates curl gnupg lsb-release -y
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y
sudo usermod -aG docker $USER

Docker の起動確認

docker run hello-world

で、以下のように表示されれば、ちゃんと起動している(はず)。

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

以下のメッセージが表示される場合は、起動失敗している。

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

エラーの原因を探る

エラー発生直後に以下のコマンドを実行する。

dockerd

今回試した環境では以下のエラーが発生していた。

failed to start daemon: Error initializing network controller: error obtaining controller instance: unable to add return rule in DOCKER-ISOLATION-STAGE-1 chain:  (iptables failed: iptables --wait -A DOCKER-ISOLATION-STAGE-1 -j RETURN: iptables v1.8.7 (nf_tables):  RULE_APPEND failed (No such file or directory): rule in chain DOCKER-ISOLATION-STAGE-1
 (exit status 4))

iptables 周りで問題が起きている様子。

エラーを回避する

iptables を使用しないようにする。 当然ですが、公に公開する環境で iptables を使用しないようにするだけはまずいでしょう…

docs.docker.jp より

/etc/docker/daemon.json に以下を記載する。

{
    "iptables": false
}

エラーが解消したか確認する

以下コマンドで改めて Docker サービスを開始する。

service docker stop
service docker start

改めて docker run などで起動するか確認する。

(実際には dockerd プロセスが立ち上げっているか見たんだけれども)

# ps -ef | grep docker
root      5112    17  0 16:59 ?        00:00:00 /usr/bin/dockerd -p /var/run/docker.pid
root      5129  5112  0 16:59 ?        00:00:00 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
root      5210    18  0 16:59 pts/0    00:00:00 grep --color=auto docker
#

Jenkins で Docker を操作する

Docker Pipeline | Jenkins plugin をインストールしたうえで、Jenkins のパイプラインを使用すると動きます。

Jenkins のパイプラインの書き方が正直よくわからなくて、以下を見ながら真似だけしました。

www.kimullaa.com mitomito.hatenablog.jp

もうちょっとわかったら Jenkins パイプラインについて書きたい。

Web サーバー側に URL のハッシュ値は送られない

タイトル通りなのですが、サーバー側でハッシュの要素を取ろうとして取れなかったので備忘録。

例えば、以下のような URL があった時、 aaa=bbb の部分が取れないという話。

http://localhost/#aaa=bbb

OAuth でがちゃがちゃやってるときにこれでかなりはまってしまった。サーバー側、ブラウザ側両方でデバッガ走らせてやっとわかった…