sbt-aws-cloudformationの使い方
sbt プラグインからAWSのCloudFormationを使う場合の手順です。
準備
sbt プロジェクトの project ディレクトリの plugins.sbt に次の内容を追記します
addSbtPlugin("com.pigumer.sbt.cloud" % "sbt-aws-cloudformation" % "5.0.22")
build.sbt に import と Plugin を有効にする設定を記述します
import cloudformation._ lazy val root = (project in file(".")). enablePlugins(CloudformationPlugin). settings( version := "0.1", scalaVersion := "2.12.6", awscfSettings := AwscfSettings( projectName = Some("example/"), region = "ap-northeast-1", bucketName = "YOUR BUCKET NAME", // テンプレートをアップロードするS3バケット名 templates = file("cloudformation") // アップロードするテンプレートを作成したディレクトリ ), awscfStacks := Stacks( Alias("ALIAS") → CloudformationStack( // スタック名のエイリアス stackName = "STACK_NAME", template = "YOUR_TEMPLATE_FILENAME", parameters = Map("KEY" → "VALUE"), capabilities = Seq("CAPABILITY_NAMED_IAM"))) )
awscfSettings の設定項目は次の通りです
- projectName - プロジェクト名は任意で、S3バケットのキーに追加されます。
- region - リージョンを指定します。
- bucketName - S3のバケット名です。
- templates - テンプレートを作成したディレクトリを設定します。
- roleARN - クラウドフォーメーションを実行するロールを指定する場合は、roleARNを記述します。
awscfStacks は、スタック名のエイリアスと CloudformationStack を設定します。
CloudformationStack はスタック定義を設定します。
- stackName - スタック名
- template - テンプレートファイル名(iam.yaml等)
- parameters - テンプレートのパラメータに渡す値
- capabilities - IAMロールのスタックの場合等に"CAPABILITY_IAM"や"CAPABILITY_NAMED_IAM"等の値を設定します
タスク
sbt コマンドを実行します。
sbt
テンプレートをアップロードするS3バケットの作成
awscfCreateBucket <stackName>
指定したスタック名でS3バケットを作成します(CloudFormationを使用します)
テンプレートのアップロード
awscfUploadTemplates
スタックの作成
awscfCreateStack <shortName>
shortName にはスタックのエイリアスを指定します。
スタックの更新
awscfUpdateStack <stage> <shortName>
スタックの削除
awscfDeleteStack <shortName>
Exportsの確認
awscfListExports
その他詳細、最新情報はhttps://github.com/PigumerGroup/sbt-aws-cloudformationを参照してください
DockerでConcourse CIを動かしてみた
Docker Repositoryに書いてあるのと同様ですが、https://github.com/PigumerGroup/sbt-aws-cloudformationを例に手順を説明します。
1. キーを作成し、web と worker の信頼関係を構築します
mkdir -p keys/web keys/worker ssh-keygen -t rsa -f ./keys/web/tsa_host_key -N '' ssh-keygen -t rsa -f ./keys/web/session_signing_key -N '' ssh-keygen -t rsa -f ./keys/worker/worker_key -N '' cp ./keys/worker/worker_key.pub ./keys/web/authorized_worker_keys cp ./keys/web/tsa_host_key.pub ./keys/worker
- keysに作成したキーがあります。
2. docker-compose の設定
docker-compose.yaml を記述します
concourse-db: image: postgres:9.5 environment: POSTGRES_DB: concourse POSTGRES_USER: concourse POSTGRES_PASSWORD: changeme PGDATA: /database concourse-web: image: concourse/concourse links: [concourse-db] command: web ports: ["8080:8080"] volumes: ["./keys/web:/concourse-keys"] environment: CONCOURSE_BASIC_AUTH_USERNAME: concourse CONCOURSE_BASIC_AUTH_PASSWORD: changeme CONCOURSE_EXTERNAL_URL: "${CONCOURSE_EXTERNAL_URL}" CONCOURSE_POSTGRES_DATA_SOURCE: |- postgres://concourse:changeme@concourse-db:5432/concourse?sslmode=disable concourse-worker: image: concourse/concourse privileged: true links: [concourse-web] command: worker volumes: ["./keys/worker:/concourse-keys"] environment: CONCOURSE_TSA_HOST: concourse-web
3. docker-compose コマンドを使って起動します
次のようなイメージでdocker-compose.yamlのあるディレクリに移動します
cd concourseci
起動するとき、各Dockerが通信を行うため、webの${CONCOURSE_EXTERNAL_URL}には、http://127.0.0.1:8080やhttp://loalhost:8080のようなアドレスを使用することはできません。PCに割り当てられたIPアドレス等を使用するようにします。
PCに割り当てられたIPアドレスが192.168.0.1だとすると次のようになります。
CONCOURSE_EXTERNAL_URL=http://192.168.0.1:8080 docker-compose up -d
4. ブラウザでアクセス
http://localhost:8080 にアクセスしてみてください。下のような画面が開きます。この画面で使用しているOSのflyコマンドをダウンロードします。
5. タスクの動作確認
fly execute を使って、タスクの動作を確認することができます。
まず、fly login でログインします。この例では、username は concourse, password は changeme です。
fly -t concourseci login -c http://192.168.0.1:8080
ここでのタスク例は、AWS S3やAWS CloudFormationへのアクセスが必要となるため、AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY が必要です。aws-cli を使っている場合は、~/.aws/credentials に記述されています。
AWS_ACCESS_KEY_ID=<YOUR AWS ACCESS KEY ID> AWS_SECRET_ACCESS_KEY=<YOUR SECRET ACCESS KEY> \ fly -t concourseci execute \ -c ci/build.yaml \ -i sbt-aws-cloudformation-src=.
Docker for Mac を使っていてうまく動かないなというときは、aufs driverを試してみてください
Docker → Preferences → Daemon → Advanced を次のように設定します
{ "storage-driver" : "aufs" }
6. パイプラインの登録
パイプラインの登録は次の通りです。
fly -t concourseci set-pipeline \ -p sbt-aws-cloudformation \ -c ci/buildPipeline.yaml \ -v 'AWS_ACCESS_KEY_ID=<YOUR AWS ACCESS KEY ID>' -v 'AWS_SECRET_ACCESS_KEY=<YOUR SECRET KEY>'
pause を解除します
fly -t concourseci unpause-pipeline \ -p sbt-aws-cloudformation
7. パイプラインの実行
ブラウザを開き、右上のloginのリンクを使ってログインします。チームはmainを選択します。
sbt-aws-cloudformation をクリックします
右上の + のボタンをクリックすると、パイプラインの実行が開始します
sbt-aws-cloudformationをMaven Centralに登録したときの手順メモ
上記を参考に作成したSBTプラグインをMaven Centralに登録した手順です。
Sonatypeの設定とPublishの手順は、OSSRH Guideに記述されています。 2つの有効なURLが必要です。
- 公開するプロジェクトのWebサイト https://github.com/PigumerGroup/sbt-aws-cloudformation
- プロジェクトのソースコード https://github.com/PigumerGroup/sbt-aws-cloudformation.git
SonatypeのJIRAにアカウントを作成します。 アカウントを作成したら、チケットを登録します。
GPGキーの作成とキーサーバに公開キーの送信を行います。私は、MacBookなので、GPG Suiteを使いました。
~/.sbt/0.13/sonatype.sbtにSonatypeのJIRAアカウントの情報を記述します。
credentials += Credentials("Sonatype Nexus Repository Manager", "oss.sonatype.org", "<your username>", "<your password>")
プロジェクトのpublish.sbtに以下の内容を記述します。
publishMavenStyle := true publishTo := { val nexus = "https://oss.sonatype.org/" if (isSnapshot.value) Some("snapshots" at nexus + "content/repositories/snapshots") else Some("releases" at nexus + "service/local/staging/deploy/maven2") } publishArtifact in Test := false pomIncludeRepository := { _ => false } sonatypeProfileName := "com.pigumer.sbt.cloud" pomExtra := ( <url>https://github.com/PigumerGroup/sbt-aws-cloudformation</url> <licenses> <license> <name>MIT</name> <url>https://opensource.org/licenses/MIT</url> </license> </licenses> <scm> <url>https://github.com/PigumerGroup/sbt-aws-cloudformation</url> <connection>https://github.com/PigumerGroup/sbt-aws-cloudformation.git</connection> </scm> <developers> <developer> <id>JIRA_ACCOUNT</id> <name>NAME</name> <url>https://github.com/takesection</url> </developer> </developers>)
project/plugins.sbtに以下の記述をします。
addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "1.1") addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0")
sbtを起動します
sbt
> compile
テスト(Optional)
> scripted
署名タスクとリリースタスクを実行します。
> publishSigned > sonatypeRelease
Wake console screen with SSH
Raspberry Pi のコンソールをSSH経由でブランクから復帰させるコマンド
$ sudo sh -c "setterm --blank poke --term linux > /dev/tty1 < /dev/tty1"
逆にブランクにする場合
$ sudo sh -c "setterm --blank force --term linux > /dev/tty1 < /dev/tty1"
DisplayのON, OFF
ON
$ vcgencmd display_power 1
OFF
$ vcgencmd display_power 0
Raspberry Pi から LPC1114 への書き込み
lpc21isp のソースを眺めていると、Raspberry Pi の GPIO を使って、リセットとISPモードの制御ができるようになっていたので試してみました
Raspberry Pi と LPC1114の配線
lpc21isp のコンパイル
lpc21isp のソースをダウンロードして、次のようにしてビルドすることで、リセットとISPモードの制御に Raspberry Pi の GPIO が使えるようになります。
$ tar xvzf ~/Downloads/lpc21isp_197.tar.gz $ cd lpc21isp_197 $ make CFLAGS="-Wall -DGPIO_ISP=23 -DGPIO_RST=18"
Raspberry Pi の GPIO のセットアップ
#!/bin/sh # Configure -ISP signal echo 23 >/sys/class/gpio/export echo out >/sys/class/gpio/gpio23/direction echo 1 >/sys/class/gpio/gpio23/value chown root.gpio /sys/class/gpio/gpio23/value chmod 660 /sys/class/gpio/gpio23/value # Configure -RST signal echo 18 >/sys/class/gpio/export echo out >/sys/class/gpio/gpio18/direction echo 1 >/sys/class/gpio/gpio18/value chown root.gpio /sys/class/gpio/gpio18/value chmod 660 /sys/class/gpio/gpio18/value
bin ファイルの書き込み
lpc21isp -control -bin firmware.bin /dev/ttyAMA0 115200 48000
SDKMANを使ってRaspberry PiにScalaをインストール
まず、zip をインストールします
$ sudo apt-get install zip
SDKMANをインストールしてパス設定等を反映します
$ curl -s "https://get.sdkman.io" | bash $ source "$HOME/.sdkman/bin/sdkman-init.sh"
sbt, scala をインストールします
$ sdk install sbt $ sdk install scala
activator をインストールします
$ sdk install activator
activator の起動がメモリ不足でできないときは、swap を増やして対応します
$ sudo dd if=/dev/zero of=/swapfile bs=4096 count=1048576 $ sudo mkswap /swapfile
/etc/fstab に次の記述を追加します
/swapfile swap swap defaults
$ swapon -a