bashでtsvファイルを連想配列に入れる時にハマったこと

概要

bashtvsファイルを読み込んで連想配列に入れたい処理があり、うまくできず2時間程度ハマりました。最終的にはうまくできましたが、結構典型的なことだと思いますので、まとめてみました。

tsvファイル

例示するため、tsvファイルは以下のものを使います。

JPY<tab>日本円
USD<tab>ドル
CNY<tab>中国人民元
EUR<tab>ユーロ

このtsvファイルを詠込んで、次のような連想配列に入れる想定

currency(
["JPY"]="日本円"
["USD"]="ドル"
["CNY"]="中国人民元"
["EUR"]="ユーロ"
)

shell script

#!/usr/bin/env bash

TSV_FILE =./currency.tsv

declare -A currency
cat $TSV_FILE | while read code name; do
    echo [$code] [$name]
    currency+=([$code]=$name)
done

echo ${currency[@]}

実行結果

$ bash tsv2dict.sh
[JPY] [日本円]
[USD] [ドル]
[CNY] [中国人民元]
[EUR] [ユーロ]

あれれ、whileループ内でちゃんとtsvファイルから値を取得できたことを検証できているのに、ループを抜け後に、値を入れたはずのcurrency連想配列には何も入っていない、なぞで仕方ありません。

原因

whileが悪いではなく、cat $TSV_FILEの結果をパイプで while ループに渡してたのがいけませんでした。

bashでは、パイプでデータを while ループに渡した後の処理は、子プロセス(fork)として動くため、親プロセスの変数は受け取れて使えるが、子プロセス内に変更した値が、親プロセス内には反映されないことになるため、currency連想配列は空のママになっている訳です。

参考:シェルスクリプトのwhile文の中の変数を外で使う方法 - Qiita

解決方法

パイプで標準出力を渡すのではなく、ヒアドキュメントでwhileループにデータを渡せば、whileループ内の処理も親プロセル内になるため、currency変数の値は後から引き継がれる。

while read code name; do
    echo [$code] [$name]
    currency+=([$code]=$name)
done << EOF
$(cat $TSV_FILE)
EOF

echo ${currency[@]}

実行結果

$ bash tsv2dict.sh
[JPY] [日本円]
[USD] [ドル]
[CNY] [中国人民元]
[EUR] [ユーロ]
ドル 日本円 中国人民元 ユーロ

連想配列から正しく出力できました。

参考:シェルスクリプトのwhile readループが悪いのか?回避策は? - Qiita

参考

イントラネットからの情報収集

ローカル情報収集

ペネトレーションテスト(侵入テスト)の本質は情報収集。 * アカウント情報検索 今のアカウントのロールと権限を知り、権限昇格する必要があるかを判断するため。

win:whoami、net user username
linux:whoami、id、cat /etc/shadow、cat /etc/passwd 
  • NWとPortの情報検索
win:ipconfig、netstat -ano 
        ARP表:arp -a  
        ルーティングテーブル: route print 
        dnsキャッシュ:ipconfig/displaydns 
 
linux:ifconfig、ip a、netstat -anplt 
        ARPテーブル:arp -a / ルーティングテーブル:route -n 
        ログインログを操作しログイン元IPを特定 
  • プロセス一覧 特にセキュリティ関連アプリケーションが動いているかどうを確認する。
win:tasklist  
linux: ps、 top 
  • システムとパッチの情報検索 OSバージョンやパッチの更新情報を検索し、権限昇格の補助となる。
win:systeminfo,OSやパッチ情報 
       wmic qfe get Caption, description, HotfixID, installedOn   パッチ情報、説明へのリンク、パッチの説明、KB番号、更新情報等
       wmic qfe list full  全情報
 
Linux: uname -a でカーネルバージョン、rpm -qa でインストールパッケージを検索
Windows: 
パスワードHash、平文パスワード / ブラウザからパスワードを窃取 / サーバの平文パスワード etc.
linux: 
history記録 / shadowファイルを総当り攻撃 / mimipenguin でパスワード窃取 / Strace でログインパスワードの窃取  etc.

macOS CatalinaにMongoDBをインストール

概要

MacにMongodbをインストールする。

手順

以下のコメントではだめだった

$ brew install mongodb
~~(省略))
Error: No available formula or cask with the name "mongodb".
==> Searching for a previously deleted formula (in the last month)...
Error: No previously deleted formula found.
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching taps...
==> Searching taps on GitHub...
Error: No formulae found in taps.

mongodb-communityをインストール

この資料を参考にした

$ brew tap mongodb/brew
Updating Homebrew...
==> Tapping mongodb/brew
Cloning into '/usr/local/Homebrew/Library/Taps/mongodb/homebrew-brew'...
remote: Enumerating objects: 97, done.
remote: Counting objects: 100% (97/97), done.
remote: Compressing objects: 100% (80/80), done.
remote: Total 462 (delta 38), reused 42 (delta 17), pack-reused 365
Receiving objects: 100% (462/462), 101.47 KiB | 298.00 KiB/s, done.
Resolving deltas: 100% (207/207), done.
Tapped 11 formulae (39 files, 171.5KB).
$
$ brew install mongodb-community
Updating Homebrew...
==> Installing mongodb-community from mongodb/brew
==> Downloading https://fastdl.mongodb.org/tools/db/mongodb-database-tools-macos-x86_64-100.2.0.zip
######################################################################## 100.0%
==> Downloading https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-4.4.1.tgz
######################################################################## 100.0%
==> Installing dependencies for mongodb/brew/mongodb-community: mongodb-database-tools
==> Installing mongodb/brew/mongodb-community dependency: mongodb-database-tools
🍺  /usr/local/Cellar/mongodb-database-tools/100.2.0: 13 files, 172.9MB, built in 4 seconds
==> Installing mongodb/brew/mongodb-community
==> Caveats
To have launchd start mongodb/brew/mongodb-community now and restart at login:
  brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf
==> Summary
🍺  /usr/local/Cellar/mongodb-community/4.4.1: 11 files, 136.8MB, built in 3 seconds
==> Caveats
==> mongodb-community
To have launchd start mongodb/brew/mongodb-community now and restart at login:
  brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf

以下のファイルが作成されるということだ。

設定ファイル(/usr/local/etc/mongod.conf)
ログディレクトリパス(/usr/local/var/log/mongodb)
データディレクトリパス(/usr/local/var/mongodb)

$ ls -ld /usr/local/etc/mongod.conf /usr/local/var/log/mongodb /usr/local/var/mongodb
-rw-r--r--  1 liu  admin  161 10 25 11:52 /usr/local/etc/mongod.conf
drwxr-xr-x  2 liu  admin   64 10 25 11:52 /usr/local/var/log/mongodb
drwxr-xr-x  2 liu  admin   64 10 25 11:52 /usr/local/var/mongodb

設定ファイルの内容

systemLog:
  destination: file
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  dbPath: /usr/local/var/mongodb
net:
  bindIp: 127.0.0.1

バージョンを確認

$ mongod --version
db version v4.4.1
Build Info: {
    "version": "4.4.1",
    "gitVersion": "ad91a93a5a31e175f5cbf8c69561e788bbc55ce1",
    "modules": [],
    "allocator": "system",
    "environment": {
        "distarch": "x86_64",
        "target_arch": "x86_64"
    }
}

2020/10月時点で最新の 4.4.1 である。

起動と停止

mongdbのバックグランドプロセスを自動起動させたい場合は

$ brew services start mongodb-community

自動起動を停止する場合は

$ brew services stop mongodb-community

手動で起動したい場合は、設定ファイルを指定して起動を行う(以下はバックグランドで起動させる場合)

$ mongod --config /usr/local/etc/mongod.conf &
[1] 5301

手動起動したmongodbを停止する場合は、Ctrl + C で止めるか、バックグランド起動した場合は、$ fgでフォアグランドにしてからCtrl + Cで止めればいい。

mongodbへ接続

mondodbを起動させた状態で接続するには

$ mongo

起動していない状態で接続すると、以下のようなエラーが表示される Error: couldn’t connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused :

DB操作

DB確認

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

mongodbでのテーブルと行の概念

RDB mongodb
テーブル コレクション
ドキュメント

DB作成

> use test_db
switched to db test_db

test_db が存在するならそのdbに接続し、存在しなければ新しく作成する。

接続中のdbを表示するには

> db
test_db

dbを作成しただけでは、show dbsコマンドでは追加されない

>show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

追加するには、コレクションを作成する必要がある(下の例では vuln というコレクションを作成した)

db.createCollection('vuln')
{ "ok" : 1 }
> show dbs
admin    0.000GB
config   0.000GB
local    0.000GB
test_db  0.000GB

ドキュメントの作成

mongodbでは、列名やデータ型などを先にきめてから行を追加することはない。
1件のドキュメントを作成するには inserOne コマンドを使う。

> db.vuln({ name: "Apache Struts 2の脆弱性", level: "S0", limit_date: "2020-12-31"})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5f954c22051b138e6af85465")
}

insertOneでドキュメントを作成する時、もし vuln コレクションが存在しない場合、その時に一緒に作成してくれる(便利!)。

作成したドキュメントを確認するには

> db.vuln.find()
{ "_id" : ObjectId("5f954d22051b138e6af85466"), "name" : "Apache Struts 2の脆弱性", "level" : "S0", "limit_date" : "2020-12-31" }

もう1つを作成する

> db.vuln.insertOne({ name: "ATS DDoS脆弱性", level: "S1", limit_date: "2021-01-31"})
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5f95571d051b138e6af85467")
}
> db.vuln.find()
{ "_id" : ObjectId("5f954d22051b138e6af85466"), "name" : "Apache Struts 2の脆弱性", "level" : "S0", "limit_date" : "2020-12-31" }
{ "_id" : ObjectId("5f95571d051b138e6af85467"), "name" : "ATS DDoS脆弱性", "level" : "S1", "limit_date" : "2021-01-31" }

find()で確認する内容をきれいにしたい場合は、pretty() を使う。

> db.vuln.find().pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S0",
    "limit_date" : "2020-12-31"
}
{
    "_id" : ObjectId("5f95571d051b138e6af85467"),
    "name" : "ATS DDoS脆弱性",
    "level" : "S1",
    "limit_date" : "2021-01-31"
}

まさにjson形式。

ドキュメントを探す

2つの方法があり、1つはObjectIdを使うこと、もう1つはキーとその値を使って探すことができる。

> db.vuln.find(ObjectId("5f954d22051b138e6af85466")).pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S0",
    "limit_date" : "2020-12-31"
}
> db.vuln.find({"name": "Apache Struts 2の脆弱性"}).pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S0",
    "limit_date" : "2020-12-31"
}

ドキュメントの更新

Apache Strusts 2の脆弱性のレベルをS1に更新したい、

> db.vuln.update({"name": "Apache Struts 2の脆弱性"}, {$set: {"level": "S1"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.vuln.find().pretty()
{
    "_id" : ObjectId("5f954d22051b138e6af85466"),
    "name" : "Apache Struts 2の脆弱性",
    "level" : "S1",
    "limit_date" : "2020-12-31"
}
{
    "_id" : ObjectId("5f95571d051b138e6af85467"),
    "name" : "ATS DDoS脆弱性",
    "level" : "S1",
    "limit_date" : "2021-01-31"
}

#### ドキュメントの削除
1件削除するにはdeleteOneを使う。

db.vuln.deleteOne({"name" : "ATS DDoS脆弱性"}) { "acknowledged" : true, "deletedCount" : 1 }

db.vuln.find().pretty() { "_id" : ObjectId("5f954d22051b138e6af85466"), "name" : "Apache Struts 2の脆弱性", "level" : "S1", "limit_date" : "2020-12-31" }

#### コレクション一覧

show collections vuln

#### コレクションの削除
drop()コマンドを使う。

db.vuln.drop() true

コレクションがなくなると、先に作成したtest_dbが表示されなくなった。

show dbs admin 0.000GB config 0.000GB local 0.000GB

#### DBの削除

use test_db switched to db test_db db.dropDatabase() { "dropped" : "test_db", "ok" : 1 }

### まとめ
mongodbをMacにインストールし、一番初歩的な操作方法を体験した。使った感想としては、DBのスキーマに気にする必要がなく、json形式なドキュメントであれば、簡単に追加することができた。しかし、手打ちでDB操作コマンドを打つには、ちょっと慣れが必要と感じた。

大量な構造化されたjsonデータを追加し、表示させるような単純な動作(Webスクレイピング等)であれば、mongodbは手軽に利用できていいのではないかと思った。

### 参考資料
- [https://reffect.co.jp/windows/mac-mongodb-install:title]
- [https://qastack.jp/programming/58283257/mongodb-cant-find-data-directory-after-upgrading-to-mac-os-10-15-catalina:title]

Docker centos:centos8のロケール等を設定

概要

dockerでcentos:centos8のコンテナを作った時に、日本語ロケールになっていなかったので、設定した。

設定した手順をメモ書きする。

現在のロケール値を確認する

# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
# 
# locale -a | grep  ja_JP
#

日本語ロケールが定義されていない。

日本語の言語パックを入れる

glibc-locale-source と glibc-langpack-ja をインストール

# dnf install glibc-locale-source glibc-langpack-ja
~~(省略)~~
#
# locale -a | grep ja_JP
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
ja_JP.eucjp
ja_JP.utf8

ja_JP.eucjp と ja_JP.utf8 が入るようになったが、以前とエラーが出ている。
エラーの原因は、おそらくen_US.utf8 がインストールされていないことを推測。
以下のように対処する。

英語の言語パックを入れる

#  LANG=C dnf install langpacks-en glibc-langpack-en
Last metadata expiration check: 2:17:15 ago on Thu Oct 22 13:03:32 2020.
Package langpacks-en-1.0-12.el8.noarch is already installed.
Dependencies resolved.
========================================================================================
 Package                    Architecture    Version               Repository       Size
========================================================================================
Installing:
 glibc-langpack-en          x86_64          2.28-101.el8          BaseOS          821 k

Transaction Summary
========================================================================================
Install  1 Package

Total download size: 821 k
Installed size: 6.0 M
Is this ok [y/N]: y
Downloading Packages:
glibc-langpack-en-2.28-101.el8.x86_64.rpm               3.6 MB/s | 821 kB     00:00
----------------------------------------------------------------------------------------
Total                                                   993 kB/s | 821 kB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                1/1
  Installing       : glibc-langpack-en-2.28-101.el8.x86_64                          1/1
  Running scriptlet: glibc-langpack-en-2.28-101.el8.x86_64                          1/1
  Verifying        : glibc-langpack-en-2.28-101.el8.x86_64                          1/1

Installed:
  glibc-langpack-en-2.28-101.el8.x86_64

Complete!

現在のロケール値を再確認する

# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

これまで出ていたエラーがでなくなったが、英語ロケールになっている。

日本語ロケールに設定

# cat /etc/locale.conf
LANG=ja_JP.UTF-8
# source /etc/locale.conf ← これが重要!
# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
#
# echo $LANG
ja_JP.UTF-8
# date
2020年 10月 22日 木曜日 15:28:22 UTC

日本語環境にはなったが、TZが日本になっていない。

日本TZに設定する

# timedatectl set-timezone Asia/Tokyo
# date
2020年 10月 23日 金曜日 00:31:30 JST

ようやくロケールタイムゾーンを正しく設定できた。

参考資料

Adobe CS6は最新macOSでは起動できない

Adobe Illustrator&Photoshop CS6は最新のmasOS Catalinaでは動かない。
原因はmasOS Catalinaからは32bitアプリケーションが全部使えなくなったからだ。

以下のサイトにはいい参考情報が書かれている(ありがとうございます)

321web.link

ちょっと待ってよ、みれる方法があるみたい。

shinbido.com

不勉強だが、初めて「Parallels Desktop」というmasOSの最強と言われている仮想マシンを知った。

ゼロ幅スペースの謎を解く

ゼロ幅スペース(Zero Width Space, ZWSP)とは?

ゼロ幅スペース - Wikipedia

によれば、

  • コンピュータの組版に用いられる非表示文字で、文書処理システムに対して語の切れ目を示すのに用いる。
  • HTMLでは要素の代替として、長い単語の途中で改行可能な場所を示すのに使われる。

例として、以下の文字列では、キャメルケースの単語間には、ZWSPがそれぞれ入っている(非表示のため目には見えない)

Lorem​Ipsum​Dolor​Sit​Amet​Consectetur​Adipiscing​Elit​Sed​Do​Eiusmod​Tempor​Incididunt​Ut​Labore​Et​Dolore

Vimで開くと以下のように見える

Lorem<200b>Ipsum<200b>Dolor<200b>Sit<200b>Amet<200b>Consectetur<200b>Adipiscing<200b>Elit<200b>Sed<    200b>Do<200b>Eiusmod<200b>Tempor<200b>Incididunt<200b>Ut<200b>Labore<200b>Et<200b>Dolore

このなぞの「<200b>」がZWSPである。

<200b>は何のコードか

<200b>は「ゼロ幅スペース」のUnicodeである。

Unicode Character Table

をみると、<200b>のUTF-8での16進数は「E2 80 8B」である。

バイナリエディタでみてみる

それでは、文字列

Lorem​Ipsum​Dolor​Sit​Amet​Consectetur​Adipiscing​Elit​Sed​Do​Eiusmod​Tempor​Incididunt​Ut​Labore​Et​Dolore

バイナリエディタで16進数をdumpしてみる

$ echo "Lorem​Ipsum​Dolor​Sit​Amet​Consectetur​Adipiscing​Elit​Sed​Do​Eiusmod​Tempor​Incididunt​Ut​Labore​Et​Dolore" | od -t x1

0000000 4c 6f 72 65 6d e2 80 8b 49 70 73 75 6d e2 80 8b
0000020 44 6f 6c 6f 72 e2 80 8b 53 69 74 e2 80 8b 41 6d
0000040 65 74 e2 80 8b 43 6f 6e 73 65 63 74 65 74 75 72
(省略)

テキストファイルから<200b>文字を削除する

ファイルをvimで開いて、

:%s/\%u200b//g

これで、ファイル内すべての<200b>を削除できる。

vim以外の方法で、sedなどいろいろ試してみたが、うまく行かず諦めた。。

<200b>のコピペ

コピーについては、以下の資料を参考にうまく行けた。

unicodeでU+200B;幅なしスペース(幅が0)という文字があるん... - Yahoo!知恵袋

まず、文字幅0のスペースの左側に文字カーソルを置きます。 次に、Shift+→ で文字幅0のスペースを選択します。 (ただし、反転表示されないので、選択されたかどうか解り難いです)
Ctrl+C でコピー
Ctrl+V で貼り付け

<200b>の入力

あくまでもMacしか試していないので、Windowsの方はもっといろいろな方法があるかもしれない。

ChromeのConsoleから

Consoleを開いて、copy("\u200B")を打てば文字がクリップボードに入ったため、後はペストすればいい。 個人的にこの方法が好き。

Unicode Character Table から

Unicode Character Table から「Copy」ボタンを押せばコピーされ、後はペストすればいい。

coolsymbol.comから

Symbols に色々なシンボルがあり、画面下部に「Zero-Width Space (ZWSP) Character」あるので、コピーして後はペストすればいい。

普段仕事上めったに<200b>にあうことはないが、自分は今日仕事上遭ったため、調べてブログにした。 インターネット上で調べている方のいい参考になれればと思います。

参考資料

screwdriver.cdを使ってローカルでビルド

環境

macOS Catalina

前提

  • Docker Desktop がインストールされている
  • git コマンドが使える

手順

screwdriverクラスタをローカルに起動させる

$ python <(curl -L https://git.io/sd-in-a-box)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  9392  100  9392    0     0   7120      0  0:00:01  0:00:01 --:--:--  7120
🎁   Boxing up Screwdriver
👀   Checking prerequisites
🔐   Generating signing secrets
📤   Which SCM provider would you like to use? (github/gitlab/bitbucket) github
📦   Generating OAuth credentials

    Please create a new OAuth application on GitHub.com
    Go to https://github.com/settings/applications/new to start the process
    For 'Homepage URL' put http://192.168.0.2:9000
    For 'Authorization callback URL' put http://192.168.0.2:9001/v4/auth/login

    When done, please provide the following values:

    Client ID: 9baf4ee73bcbd1110a04
    Client Secret:

💾   Writing Docker Compose file
🚀   Screwdriver is ready to launch!

    Just run the following commands to get started!
      $ docker-compose pull
      $ docker-compose -p screwdriver up -d
      $ open http://192.168.0.2:9000

    Would you like to run them now? (y/n) y
Pulling api   ... done
Pulling ui    ... done
Pulling store ... done
Creating network "screwdriver_default" with the default driver
Creating screwdriver_store_1 ... done
Creating screwdriver_api_1   ... done
Creating screwdriver_ui_1    ... done

👍   Launched!

    A few more things to note:
      - To stop/reset Screwdriver
        $ docker-compose -p screwdriver down
      - If your internal IP changes, update the docker-compose.yml and your SCM OAuth application
      - In-a-box does not support Webhooks including PullRequests for triggering builds
      - To create your own cluster, see https://docs.screwdriver.cd/cluster-management/kubernetes
      - For help with this and more, find us on Slack at https://slack.screwdriver.cd

❤️   Screwdriver Crew

ui が立ち上がった。

screwdriver

Sign in with SCM Provider」リンクをクリックすると、以下のように権限認可画面が出る Authorize

状況確認

コンテナ
$ docker ps -a
CONTAINER ID        IMAGE                              COMMAND                  CREATED              STATUS                           PORTS                            NAMES
b42f1bb49d9f        screwdrivercd/ui:stable            "nginx -g 'daemon of…"   About a minute ago   Up About a minute                0.0.0.0:9000->80/tcp             screwdriver_ui_1
e18174d2bac6        screwdrivercd/screwdriver:stable   "docker-entrypoint.s…"   About a minute ago   Up About a minute                8080/tcp, 0.0.0.0:9001->80/tcp   screwdriver_api_1
eb1b350f4355        screwdrivercd/store:stable         "docker-entrypoint.s…"   About a minute ago   Up About a minute                0.0.0.0:9002->80/tcp             screwdriver_store_1
af6b538f8bee        centos:centos8                     "/sbin/init"             7 days ago           Exited (137) About an hour ago
イメージ
$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
centos                      centos8             0d120b6ccaa8        2 months ago        215MB
screwdrivercd/screwdriver   stable              bfc1a62afe5a        5 months ago        1.05GB
screwdrivercd/ui            stable              321c51c4e647        5 months ago        25.8MB
screwdrivercd/store         stable              692bb501be06        8 months ago        1.02GB

screwdrivercdだけで合計2GB以上もある。。

コンテナを停止

$ docker-compose -p screwdriver down
Stopping screwdriver_ui_1    ... done
Stopping screwdriver_api_1   ... done
Stopping screwdriver_store_1 ... done
Removing screwdriver_ui_1    ... done
Removing screwdriver_api_1   ... done
Removing screwdriver_store_1 ... done
Removing network screwdriver_default

コンテナ再確認

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
af6b538f8bee        centos:centos8      "/sbin/init"        29 hours ago        Exited (137) 25 hours ago                       centos8

メモ:コンテナ起動

$ docker-compose -p screwdriver up

Get Started

Getting Started with Screwdriver を参考し

$ git clone git@github.com:<YOUR_USERNAME_HERE>/quickstart-generic.git
$ cd quickstart-generic/
screwdriver.yaml

サンプルのscrewdriver.yamlにはコメント行が沢山あり、見づらいため、

$ sed -e '/^[\t ]*#/d' screwdriver.yaml 
---
shared:
  image: buildpack-deps

jobs:
  main:
    requires: [~pr, ~commit]
    steps:
      - export: export GREETING="Hello, world!"
      - hello: echo $GREETING
      - set-metadata: meta set example.coverage 99.95
  second_job:
    requires: main
    steps:
      - make_target: make greetings
      - get-metadata: meta get example
      - run_arbitrary_script: ./my_script.sh

でコメント行を除外して表示した。

Create a New Pipeline

screwdriver.cdのuiから、SCM(githubを選択していた)にログインして(OAuth認証)、Create Pipelineする。
下図にある[my_github_accoutn]部分は、実際に自分のアカウントが入る。 pipeline

Startボタンを押してビルド開始。 Start to build

以下のエラーが出てしまった

 (HTTP code 404) no such container - No such image: screwdrivercd/launcher:stable

参考資料