Skip to content

Commit

Permalink
Adds buidpacks and improves install instructions (#3)
Browse files Browse the repository at this point in the history
  • Loading branch information
Adam Hevenor authored and poy committed May 6, 2019
1 parent 0564167 commit be5539b
Show file tree
Hide file tree
Showing 33 changed files with 1,005 additions and 5 deletions.
17 changes: 12 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,20 @@

`kf` is like `cf` for Knative

## Getting started.
Build a `kf` binary and follow our [install instructions](/.install.md)
for Knative.

## How to build

**Dependencies:**

[go mod](https://github.com/golang/go/wiki/Modules#quick-start) is used and required for dependencies
[go mod](https://github.com/golang/go/wiki/Modules#quick-start)
is used and required for dependencies

**Requirements:**

- Golang `1.11.4`
- Golang `1.12`

**Building:**

Expand All @@ -20,9 +25,11 @@ $ go build ./cmd/...

**Notes:**

- `kf` CLI must be built outside of the `$GOPATH` folder unless you explicitly use `export GO111MODULE=on`.

- `kf` CLI must be built outside of the `$GOPATH` folder unless
you explicitly use `export GO111MODULE=on`.

## Development and releasing

We use [ko](https://github.com/google/ko) for rapid development and during the release process to build a full set of `kf` images and installation YAML.
We use [ko](https://github.com/google/ko) for rapid development
and during the release process to build a full set of `kf` images
and installation YAML.
9 changes: 9 additions & 0 deletions buildpack-samples/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Buildpack Samples

This repository contains sample implementations for learning and testing purposes.

Includes:
- Buildpacks
- Lifecycles
- Apps

28 changes: 28 additions & 0 deletions buildpack-samples/builder.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
[[buildpacks]]
id = "io.buildpacks.samples.nodejs"
uri = "./nodejs-buildpack"
latest = true

[[buildpacks]]
id = "io.buildpacks.samples.go"
uri = "./go-buildpack"
latest = true

[[buildpacks]]
id = "io.buildpacks.samples.java"
uri = "./java-buildpack"
latest = true

[[groups]]
buildpacks = [ { id = "io.buildpacks.samples.nodejs", version = "latest" } ]

[[groups]]
buildpacks = [ { id = "io.buildpacks.samples.go", version = "latest" } ]

[[groups]]
buildpacks = [ { id = "io.buildpacks.samples.java", version = "latest" } ]

[stack]
id = "io.buildpacks.stack.bionic"
run-image = "packs/run:0.1.0"
build-image = "packs/build:0.1.0"
3 changes: 3 additions & 0 deletions buildpack-samples/go-buildpack/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Sample: Go Buildpack

Works with go module apps
48 changes: 48 additions & 0 deletions buildpack-samples/go-buildpack/bin/build
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#!/usr/bin/env bash

set -eo pipefail

env_dir="$2/env"
layers_dir="$1"
plan_path="$3"

cat $plan_path

go_version=1.12.1
go_url=https://dl.google.com/go/go${go_version}.linux-amd64.tar.gz

# Load user-provided build-time environment variables
if compgen -G "$env_dir/*" > /dev/null; then
for var in "$env_dir"/*; do
declare "$(basename "$var")=$(<"$var")"
done
fi

# If it doesn't exist locally, create a Go cache layer with POSIX-style root
# for build (bin, src, etc). This makes Go available to subsequent buildpacks
# as well.
if [[ -f $layers_dir/go.toml ]]; then
cached_go_version=$(cat "$layers_dir/go.toml" | yj -t | jq -r .metadata.version)
fi
if [[ $go_version != $cached_go_version ]] ; then
rm -rf "$layers_dir/go"
rm -rf "$layers_dir/go.toml"
mkdir "$layers_dir/go"
echo "Downloading go: ($go_url)..."
wget -q -O - "$go_url" | tar -xzf - -C "$layers_dir/go" --strip-components=1
echo "Done installing go: ($go_version)."
mkdir -p "$layers_dir/go/env"
echo "launch = true" > "$layers_dir/go.toml"
echo "build = true" >> "$layers_dir/go.toml"
echo "cache = true" >> "$layers_dir/go.toml"
echo -e "[metadata]\n version = \"$go_version\"" >> "$layers_dir/go.toml"
fi

export PATH=$PATH:$layers_dir/go/bin
export GO111MODULE=on

go version
go build -o app.out

# Set default start command
echo 'processes = [{ type = "web", command = "./app.out"}]' > "$layers_dir/launch.toml"
11 changes: 11 additions & 0 deletions buildpack-samples/go-buildpack/bin/detect
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/usr/bin/env bash

set -eo pipefail

plan_path=$2

if [[ ! -f go.mod ]]; then
exit 100
fi

exit 0
7 changes: 7 additions & 0 deletions buildpack-samples/go-buildpack/buildpack.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[buildpack]
id = "io.buildpacks.samples.go"
version = "0.0.1"
name = "Sample Go Buildpack"

[[stacks]]
id = "io.buildpacks.stacks.bionic"
4 changes: 4 additions & 0 deletions buildpack-samples/gradle-buildpack/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Sample: Java Gradle Buildpack

Compatible apps:
- Gradle apps
75 changes: 75 additions & 0 deletions buildpack-samples/gradle-buildpack/bin/build
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#!/usr/bin/env bash

echo "---> Gradle buildpack"

set -eo pipefail

env_dir="$2/env"
layers_dir="$1"
plan_path="$3"

jdk_url="https://cdn.azul.com/zulu/bin/zulu8.28.0.1-jdk8.0.163-linux_x64.tar.gz"
jdk_version="1.8.0_163"

# Load user-provided build-time environment variables
if compgen -G "$env_dir/*" > /dev/null; then
for var in "$env_dir"/*; do
declare "$(basename "$var")=$(<"$var")"
done
fi

echo "---> Installing JDK"

# If it doesn't exist locally, create a JDK cache layer
# This makes JDK available to subsequent buildpacks as well.
if [[ -f $layers_dir/jdk.toml ]]; then
cached_jdk_url=$(cat "$layers_dir/jdk.toml" | yj -t | jq -r .metadata.url 2>/dev/null || echo 'JDK TOML parsing failed')
fi
if [[ $jdk_url != $cached_jdk_url ]] ; then
rm -rf "$layers_dir"/jdk
mkdir -p "$layers_dir"/jdk/env
wget -q -O - "$jdk_url" | tar pxz -C "$layers_dir"/jdk --strip-components=1
echo "launch = true" > "$layers_dir"/jdk.toml
echo "build = true" >> "$layers_dir"/jdk.toml
echo "cache = true" >> "$layers_dir"/jdk.toml
echo -e "[metadata]\n version = \"$jdk_version\"\n url = \"$jdk_url\"" >> "$layers_dir"/jdk.toml

echo "$layers_dir"/jdk > "$layers_dir"/jdk/env/JAVA_HOME
if [[ -z $LD_LIBRARY_PATH ]]; then
echo "$JAVA_HOME/jre/lib/amd64/server" > $layers_dir/jdk/env/LD_LIBRARY_PATH
else
echo "$JAVA_HOME/jre/lib/amd64/server:$LD_LIBRARY_PATH" > $layers_dir/jdk/env/LD_LIBRARY_PATH
fi

mkdir -p $layers_dir/jdk/profile.d
cat << EOF > $layers_dir/jdk/profile.d/jdk.sh
export JAVA_HOME=$layers_dir/jdk
if [[ -z \$LD_LIBRARY_PATH ]]; then
export LD_LIBRARY_PATH="\$JAVA_HOME/jre/lib/amd64/server"
else
export LD_LIBRARY_PATH="\$JAVA_HOME/jre/lib/amd64/server:$LD_LIBRARY_PATH"
fi
EOF
fi
# Set env variables to make jdk accessible
for var in "$layers_dir"/jdk/env/*; do
declare "$(basename "$var")=$(<"$var")"
done
export PATH=$layers_dir/jdk/bin:$PATH

target_dir="build/libs"

if [[ ! -d $layers_dir/gradle ]]; then
mkdir -p $layers_dir/gradle
echo "cache = true" > $layers_dir/gradle.toml
fi
ln -s $layers_dir/gradle $HOME/.gradle

echo "---> Running Gradle Wrapper"
./gradlew clean build -x test --no-daemon

# Set default start command
for jarFile in $(find "$target_dir" -maxdepth 1 -name "*.jar" -type f); do
echo "processes = [{ type = \"web\", command = \"java -jar $jarFile\"}]" > "$layers_dir/launch.toml"
break;
done
9 changes: 9 additions & 0 deletions buildpack-samples/gradle-buildpack/bin/detect
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bash

set -eo pipefail

if [[ -f build.gradle ]]; then
exit 0
fi

exit 1
7 changes: 7 additions & 0 deletions buildpack-samples/gradle-buildpack/buildpack.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[buildpack]
id = "io.buildpacks.samples.gradle"
version = "0.0.1"
name = "Sample Gradle Buildpack"

[[stacks]]
id = "io.buildpacks.stacks.bionic"
3 changes: 3 additions & 0 deletions buildpack-samples/hello-world-buildpack/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Sample: Hello World Buildpack

A no-op buildpack
15 changes: 15 additions & 0 deletions buildpack-samples/hello-world-buildpack/bin/build
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/usr/bin/env bash

echo "---> Hello World buildpack"

set -eo pipefail

env_dir=$2/env
layers_dir=$1
plan_path=$3

echo " env_dir: ${env_dir}"
echo " plan_path: ${plan_path}"
echo " layers_dir: ${layers_dir}"

echo "---> Done"
5 changes: 5 additions & 0 deletions buildpack-samples/hello-world-buildpack/bin/detect
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/usr/bin/env bash

set -eo pipefail

exit 0
4 changes: 4 additions & 0 deletions buildpack-samples/hello-world-buildpack/buildpack.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
id = "io.buildpacks.samples.buildpack.hello-world"
version = "0.0.1"
name = "Hello World Buildpack"
stacks = ["packs/v3"]
4 changes: 4 additions & 0 deletions buildpack-samples/java-buildpack/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Sample: Java Buildpack

Compatible apps:
- Maven apps
100 changes: 100 additions & 0 deletions buildpack-samples/java-buildpack/bin/build
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#!/usr/bin/env bash

echo "---> Java buildpack"

set -eo pipefail
set -x

env_dir="$2/env"
layers_dir="$1"
plan_path="$3"

jdk_url="https://cdn.azul.com/zulu/bin/zulu8.28.0.1-jdk8.0.163-linux_x64.tar.gz"
jdk_version="1.8.0_163"

maven_url="https://apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz"
maven_version="3.5.4"

# Load user-provided build-time environment variables
if compgen -G "$env_dir/*" > /dev/null; then
for var in "$env_dir"/*; do
declare "$(basename "$var")=$(<"$var")"
done
fi

echo "---> Installing JDK"

# If it doesn't exist locally, create a JDK cache layer
# This makes JDK available to subsequent buildpacks as well.
if [[ -f $layers_dir/jdk.toml ]]; then
cached_jdk_url=$(cat "$layers_dir/jdk.toml" | yj -t | jq -r .metadata.url 2>/dev/null || echo 'JDK TOML parsing failed')
fi
if [[ $jdk_url != $cached_jdk_url ]] ; then
rm -rf "$layers_dir"/jdk
mkdir -p "$layers_dir"/jdk/env
wget -q -O - "$jdk_url" | tar pxz -C "$layers_dir"/jdk --strip-components=1
echo "launch = true" > "$layers_dir"/jdk.toml
echo "build = true" >> "$layers_dir"/jdk.toml
echo "cache = true" >> "$layers_dir"/jdk.toml
echo -e "[metadata]\n version = \"$jdk_version\"\n url = \"$jdk_url\"" >> "$layers_dir"/jdk.toml

echo "$layers_dir"/jdk > "$layers_dir"/jdk/env/JAVA_HOME
if [[ -z $LD_LIBRARY_PATH ]]; then
echo "$JAVA_HOME/jre/lib/amd64/server" > $layers_dir/jdk/env/LD_LIBRARY_PATH
else
echo "$JAVA_HOME/jre/lib/amd64/server:$LD_LIBRARY_PATH" > $layers_dir/jdk/env/LD_LIBRARY_PATH
fi

mkdir -p $layers_dir/jdk/profile.d
cat << EOF > $layers_dir/jdk/profile.d/jdk.sh
export JAVA_HOME=$layers_dir/jdk
if [[ -z \$LD_LIBRARY_PATH ]]; then
export LD_LIBRARY_PATH="\$JAVA_HOME/jre/lib/amd64/server"
else
export LD_LIBRARY_PATH="\$JAVA_HOME/jre/lib/amd64/server:$LD_LIBRARY_PATH"
fi
EOF
fi
# Set env variables to make jdk accessible
for var in "$layers_dir"/jdk/env/*; do
declare "$(basename "$var")=$(<"$var")"
done
export PATH=$layers_dir/jdk/bin:$PATH


if [[ ! -d $layers_dir/maven_m2 ]]; then
mkdir -p $layers_dir/maven_m2
echo "cache = true" > $layers_dir/maven_m2.toml
fi
ln -s $layers_dir/maven_m2 $HOME/.m2
MAVEN_OPTS="${MAVEN_OPTS:-"-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap"}"

if [[ -x mvnw ]]; then
echo "---> Running Maven Wrapper"
./mvnw clean install -B -DskipTests
else
if [[ -f $layers_dir/maven.toml ]]; then
cached_maven_url=$(cat "$layers_dir/maven.toml" | yj -t | jq -r .metadata.url 2>/dev/null || echo 'Maven TOML parsing failed')
fi
if [[ $maven_url != $cached_maven_url ]] ; then
echo "---> Installing Maven"
maven_dir="$layers_dir/maven"
rm -rf "$maven_dir"
mkdir -p "$maven_dir"
wget -q -O - "$maven_url" | tar pxz -C "$maven_dir" --strip-components=1
echo "launch = false" > "$layers_dir"/maven.toml
echo "build = true" >> "$layers_dir"/maven.toml
echo "cache = true" >> "$layers_dir"/maven.toml
echo -e "[metadata]\n version = \"$maven_version\"\n url = \"$maven_url\"" >> "$layers_dir"/maven.toml
fi
export PATH=$PATH:$layers_dir/maven/bin

echo "---> Running Maven"
mvn clean install -B -DskipTests
fi

# Set default start command
for jarFile in $(find target -maxdepth 1 -name "*.jar" -type f); do
echo "processes = [{ type = \"web\", command = \"java -jar $jarFile\"}]" > "$layers_dir/launch.toml"
break;
done
9 changes: 9 additions & 0 deletions buildpack-samples/java-buildpack/bin/detect
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bash

set -eo pipefail

if [[ -f pom.xml ]]; then
exit 0
fi

exit 1
Loading

0 comments on commit be5539b

Please sign in to comment.