2019年10月29日火曜日

[Shippable] CentOS free plan に変更した

Pricing | Shippable


Ubuntu/CentOS は Free Plan があるので、両方使えるかな?と思ったがそうではなかった。
という話。


プランの変更は 「Settings」 の 「Billing」 にあります。
ここで SKU を追加できるのですが、SKU を2つにすると請求額が $0 じゃなくなります。



SKU が1つ、かつ「Enable unlimited private repo builds」のチェックを外すと $0 になります。
(Size は L 、キャッシュもなし)



つまり、フリーで使う場合は OS は1つしか選べないようです。

残念。。
というわけで、Ubuntu から CentOS に変更しました。

今回は以上です。

2019年10月23日水曜日

Windows Docker toolbox (VirtualBox) で USB 接続を使う

OpenSTF を使ってみようと思って、Windows + Docker toolbox 環境でやってみようとしたところ、すんなりいかなかったのでメモ。

USB コントローラーを有効にする(VirtualBox)
まずは、
docker-machine stop default
で VM を停止します。



USB を認識させるために VirtualBox Manager の設定から「USBコントローラーを有効」にチェックをいれ、コントローラーを選択します。


設定はこれで以上の場合もありますが、Docker toolbox を起動した際に以下のようなエラーになった場合は追加のインストールが必要です。
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
Unable to start the VM: C:\Program Files\Oracle\VirtualBox\VBoxManage.exe startvm default --type headless failed:
VBoxManage.exe: error: Implementation of the USB 3.0 controller not found!
VBoxManage.exe: error: Because the USB 3.0 controller state is part of the saved VM state, the VM cannot be started. To fix this problem, either install the 'Oracle VM VirtualBox Extension Pack' or disable USB 3.0 support in the VM settings (VERR_NOT_FOUND)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole

Details: 00:00:01.074731 Power up failed (vrc=VERR_NOT_FOUND, rc=E_FAIL (0X80004005))
Looks like something went wrong in step ´Checking status on default´... Press any key to continue...
VirtualBox Extension Pack をインストールする
VirtualBox のサイトから Extension Pack をダウンロードしてインストールするだけで良いのですが、現在使用している VirtualBox の Version と同じバージョンの Extension Pack をインストールする必要があるので注意してください。


自分の環境では 5.2.8 だったので、「Download_Old_Builds – Oracle VM VirtualBox」から 5.2.8 の Extension Pack をダウンロードしました。



ダウンロードしたら、あとはインストールするだけです。
(バージョンが違うとインストールに失敗します)



これで、Docker toolbox で USB を使う準備が整いました。
今回は以上です。それでは。

2019年10月16日水曜日

Docker toolbox QuickStart ショートカットを起動したときに history にゴミが溜まるのを抑制する

Docker toolbox の QuickStart でシェルを立ち上げると、ものすごい量の history が溜まって邪魔だったので対策しました。





設定でできること
HISTCONTROL
HISTCONTROL 環境変数をセットしておくと、空白から始まるコマンドや重複するコマンドを履歴に残さないようにできます。

  • ignoredups
    直前と同じコマンドの場合は保存しない
    commandhistory
    ls
    ls
    ls
    ls
    ls -a
    ls
    ls
    ls -a
    ls
  • ignorespace
    空白から始まるコマンドは保存しない
    commandhistory
    ls
    ls
    ls
    ls
    ls -a
    ls
    ls
    ls -a
    ls
  • ignoreboth
    ignoredups + ignorespace
  • erasedups
    重複するコマンドは最新のものだけが保存される
    (履歴にある重複コマンドは削除される)

自分は以下のようにしました。
export HISTCONTROL=ignoreboth

HISTIGNORE
HISTIGNORE に履歴に残したくないコマンドを列挙できます。
コマンドとコマンドの区切り文字は ':' です。

自分は以下のようにしました。
export HISTIGNORE=history:echo:'#*'

設定だけでは限界がある・・
上記の設定をしても、すこしだけ残ってほしくない履歴が減るくらいです。
自分でコマンド打つときにも便利な設定なので、しておいて損はないですが、当初の目的はこれだけでは達成できません。

というわけで、次に続きます。





start.sh を書き換える
できれば外部から非侵入的に解決したかったのですが、自分の知識ではここまでが限界でした。
Docker Toolbox のインストールディレクトリ「C:\Program Files\Docker Toolbox」に start.sh があります。
ショートカットはこちらの .sh を呼び出しており、こちらを少し書き換えることで対策しました。

ファイルの先頭で set +o history をして履歴を無効にします。
※ここで set コマンドの前に1つスペースを上げていることに注意。最初の設定で空白で始まるコマンドを履歴に残さないようにしたので
set +o history
#!/bin/bash
 set +o history

そして、ファイルの末尾あたりで set -o history で履歴を有効にします。
bash の呼び出しあたりは先頭空白を入れて、HISTCONTROL による抑制が効くようにしました。
set -o history

 if [ $# -eq 0 ]; then
   echo "Start interactive shell"
   exec "$BASH" --login -i
 else
   echo "Start shell with command"
   exec "$BASH" -c "$*"
 fi


最後に
これで設定は以上です。
きれいになりました。

2019年10月7日月曜日

GitHub Actions で [ci skip] できるようにしました

[ci skip] とは
多くの CI サービスで採用されている、コミットメッセージでビルドスキップができるコマンドです。
ドキュメントのみの更新とかでわざわざビルドしなくてもいい場合に便利な機能です。

GitHub Actions における ci skip
GitHub Actions は Azure Pipelines から派生しているので
***NO_CI***」が使sえるかな?と思っていましたが、それはない模様。

* Build pipeline triggers - Azure Pipelines | Microsoft Docs
* GitHub Actions ***NO_CI*** alternative - Stack Overflow

Azure Pipelines ベースなので、一般的な 「[ci skip]」 も使えません。
つまり、GitHub Actions では現状 CI をコミットコメントからスキップすることができません。


・・・とはいえ、スキップしたい!ということで今ある機能でなんとかできないかやってみました。
Workaround
steps.if でなんとかしてみた
steps.if は条件付きでステップを実行するかしないかを制御する機能です。
これがあったので、以下のようにすることで、「ステップ」のスキップは実現できていました。

steps:
    - name: Check condition
      if: "! contains(github.event.head_commit.message, '[ci skip]')"

上記の方法で、最新コミットのコミットメッセージに「[ci skip]」が含まれていたら、そのステップをスキップすることができます。
ただ、これはあくまでステップのスキップなので、他サービスの [ci skip] とはだいぶ異なります。。

job.if がキターー
GitHub Actions - new workflow syntax features - The GitHub Blog
job 単位での制御がしたい!と思っていたら来ました!!

jobs:
  build:
    runs-on: ubuntu-latest
    if: "! contains(github.event.head_commit.message, '[ci skip]')"

steps.if のときと書き方は同じで、job のところに書けるようになりました。
これで job のスキップができるようになりました。

受け入れジョブを作ってそこを起点にする
さらに他 CI サービスでの挙動に近づけるために、依存関係を作成します。
[ci skip] をチェックするジョブを起点にジョブをぶら下げることで、スキップしたジョブの後続もスキップするようにします。


jobs:
  prepare:
    runs-on: ubuntu-latest
    if: "! contains(github.event.head_commit.message, '[ci skip]')"
    steps:
      - run: echo "${{ github.event.head_commit.message }}"

  build:
    runs-on: ubuntu-latest
    needs: prepare

prepare ジョブがスキップすると build ジョブもスキップします。
これで完成です。

スキップ結果
スキップすると以下のように表示されます。


checks にはのらないようです。(CI サービスによっては出たりする)



まとめ
ci-skip/WORKAROUND.md at master · srz-zumix/ci-skip
いろいろ説明を省きましたが、こちらで今回の方法をまとめいます。

今回のポイントは github context の使い方かな、と思います。
公式ドキュメントの github context では省かれていますが、ドキュメントの表以外にも取得可能な情報がたくさんあります。
今回は 'github.event.head_commit.message' でコミットメッセージを取得しました。

↑のまとめに github context から取得できる値の例と、ダンプ方法も書いてあるので参考にしてください。

最後に
私が使っている CI サービスでの [ci skip] 機能に関して、まとめているリポジトリがありますので
他のサービスでの [ci skip] を確認する場合、よろしければこちらも参考にしてください。

https://github.com/srz-zumix/ci-skip


では。