Edited at

AWSでBuildpackを作成する方法

More than 1 year has passed since last update.


作成したAWSインスタンス

Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type - ami-40142d25

Type t2.micro

ボリューム:8GB


まずは、Goをインストールしてセットアップします。

こちらのサイトを参考にセットアップしました。


インストール

sudo yum install golang


GOPATHの設定

.bashrcに以下を追記します。

export GOPATH=$HOME/go

export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

source .bashrcを実行して環境変数を反映させたらecho $GOPATHで確認しましょう。


結果

[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ echo $GOPATH

/home/ec2-user/go

となればOKです。


次にbuild-packagerをインストールします。

このサイトREADOMEに従って、以下のコマンドを実行します。

go get github.com/cloudfoundry/libbuildpack

で、マニュアルでは次に

cd ~/go/src/github.com/cloudfoundry/libbuildpack/packager/buildpack-packager && go install

とすると書いてあるのですが、AWS上でこのまま実行すると

main.go:15:2: cannot find package "github.com/google/subcommands" in any of:

というメッセージが出てしまいます。

というわけで、こちらのパッケージも入れておきましょう。

コマンドは、

go get github.com/google/subcommands

です。

改めて、

cd ~/go/src/github.com/cloudfoundry/libbuildpack/packager/buildpack-packager && go install

とすると、正常にインストールできます。

[ec2-user@ip-XXX-XXX-XXX-XXX ~]$ buildpack-packager

Usage: buildpack-packager <flags> <subcommand> <subcommand args>

Subcommands:
commands list all command names
flags describe all known top-level flags
help describe subcommands and their syntax

Subcommands for Custom:
build Create a buildpack zipfile from the current directory
init Creates a folder with the basic structure of a new buildpack
summary Print out list of dependencies of this buildpack
upgrade Upgrades a buildpack scaffolded by buildpack-packager init

Use "buildpack-packager flags" for a list of top-level flags

となる事を確認しましょう。


パッケージをビルドしてみましょう。

私はPHPerなので、php-buildpackをforkしてカスタマイズします。

まずは、

git clone https://github.com/motuo1201/php-buildpack

でforkしたリポジトリをcloneします。

次に、

cd php-buildpack/

buildpack-packager build -cached -any-stack

とすると、以下の結果を得ることが出来ます。

[ec2-user@ip-XXX-XXX-XXX-XXX php-buildpack]$ buildpack-packager build -cached -any-stack

cached buildpack created and saved as /home/ec2-user/php-buildpack/php_buildpack-cached-v4.3.59.zip with a size of 979MB
[ec2-user@ip-XXX-XXX-XXX-XXX php-buildpack]$ ls
4.3.52.20180419122106tmp fixtures README.md
bin ISSUE_TEMPLATE requirements.txt
cf.Gemfile itf.Dockerfile.5409018274803835473 run_tests.sh
cf.Gemfile.lock lib scripts
CHANGELOG LICENSE src
compile-extensions manifest.yml tests
CONTRIBUTING.md NOTICE vendor
defaults php_buildpack-cached-v4.3.59.zip VERSION
extensions PULL_REQUEST_TEMPLATE

ここに、php_buildpack-cached-v4.3.59.zipというファイルが出来ましたね。

これが、実際に利用できるbuildpackとなります。


ちなみに、Buildpackを作成しようとした経緯

php-buildpackを使ってLaravelをデプロイする時に、.envが無くてコケるケースが多発。

原因はGithubのリポジトリには.envをコミットしない原則があるから。(セキュリティ的な観点から当然の事ですが…)

ただ、pipelineとか使ってGithubから直接、デプロイする時に、これは困る!というわけで

.env.exampleが存在するかつ、.envファイルがない場合は、.env.exampleを.envにリネームする

処理を追加する事に決定。


いや、composer.jsonのpost-install-cmdに書けよ!


というツッコミが聞こえた気がしますが、今回は勉強のため…


そしてAWSでbuildpack作った後で気が付いた:cry:

IBM CloudってGitのリポジトリから、Buildpackを作って適用しているんじゃないか?という事を。