Skip to content

Commit

Permalink
Merge pull request #6 from grimzy/refactor-into-functions
Browse files Browse the repository at this point in the history
Refactored hooks into reusable functions
  • Loading branch information
grimzy authored Oct 19, 2019
2 parents bb6cfb9 + 82c8b18 commit a218557
Show file tree
Hide file tree
Showing 8 changed files with 224 additions and 114 deletions.
10 changes: 9 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,22 @@ This project adheres to [Semantic Versioning][semver].

Refer to master branch

## \[v1.1.2\] - 2019-10-19

### Refactor Hooks into Functions:
- Refactored Docker hook scripts into reusable functions
- Fix issue with short tags not being pushed
- Fixed `make rm_build`
- Removed source branch image name in templates

## \[v1.1.1\] - 2019-10-14

### Split PHP builds, PHP FPM, Latest tag:
- Split builds by PHP version and variant
- Use builds Docker hooks in Makefile
- Added `fpm` variant
- Now using `DOCKER_REPO` and `DOCKER_TAG` build variables
- Push `latest` tags when building latest version (checks for Semantic Version in $SOURCE_BRANCH)
- Push `latest` tags when building latest version (checks for Semantic Version in `$SOURCE_BRANCH`)
- Set latest PHP version to 7.2 and variant to CLI

## \[v1.1.0\] - 2019-10-13
Expand Down
19 changes: 11 additions & 8 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@

# Build variables
# https://docs.docker.com/docker-hub/builds/advanced/#environment-variables-for-building-and-testing
SOURCE_BRANCH:=$(shell git rev-parse --abbrev-ref HEAD)
DOCKER_REPO=jestefane/php-dev
Expand All @@ -10,6 +10,7 @@ PHP_VERSIONS=5.5 5.6 7.0 7.1 7.2
# Possible PHP variants: cli, fpm
PHP_VARIANTS=cli fpm

# Script/Shortcut generation variables
BIN_DIR=/usr/local/bin
SCRIPTS_DIR=scripts

Expand All @@ -34,13 +35,14 @@ post_push:
.PHONY: rm_build
rm_build:
@{ \
for php_version in $(PHP_VERSIONS); do \
for php_variant in $(PHP_VARIANTS); do \
image_name=$(DOCKER_REPO):$$php_version-$$php_variant-$(SOURCE_BRANCH); \
echo Removing image: $$image_name; \
docker rmi $$image_name || true; \
done; \
done; \
. ./build/hooks/_common; \
\
PHP_VERSIONS="$(PHP_VERSIONS)" \
PHP_VARIANTS="$(PHP_VARIANTS)" \
SOURCE_BRANCH="$(SOURCE_BRANCH)" \
DOCKER_REPO="$(DOCKER_REPO)" \
DOCKER_TAG="$(DOCKER_TAG)" \
loopVersionsVariants remove_image; \
}

.PHONY: rebuild
Expand All @@ -60,6 +62,7 @@ scripts: rm_scripts_dir
echo ">>> Script Composer $$php_version"; \
sed $$regex template/composer.template > $(SCRIPTS_DIR)/composer-$$php_version; \
done; \
chmod +x $(SCRIPTS_DIR)/*; \
}

.PHONY: rm_scripts_dir
Expand Down
59 changes: 34 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#### PHP Development Docker Images

[![Docker Cloud Automated build][docker-cloud-automated]][docker-builds] [![Docker Cloud Build Status][docker-cloud-build]][docker-builds] [![Docker Pulls][docker-pulls]][docker-overview] [![Docker Stars][docker-stars]][docker-overview] [![MicroBadger Layers][microbadger-layers]][docker-overview] [![MicroBadger Size][microbadger-image-size]][docker-overview]
[![Docker Cloud Automated build][docker-cloud-automated]][docker-builds] [![Docker Cloud Build Status][docker-cloud-build]][docker-builds] [![Docker Pulls][docker-pulls]][docker-overview] [![Docker Stars][docker-stars]][docker-overview] [![MicroBadger Layers][microbadger-layers]][microbadger-url] [![MicroBadger Size][microbadger-image-size]][microbadger-url]

> Super simple Docker images for PHP development.
Expand All @@ -26,7 +26,7 @@ $ docker pull jestefane/php-dev
**Pull a specific version:**

```sh
$ docker pull jestefane/php-dev:7.2-cli-1.1.1
$ docker pull jestefane/php-dev:7.2-cli
```

Pick between the various [images provided in this repository][images].
Expand All @@ -37,28 +37,34 @@ To use the Docker images more like binaries, we're providing [Shortcuts][shortcu

## Images

> Image names have the following format:
>
> ```
> <docker repo>:<php version>-<php variant>-<github repo version>
> ```
Image names have the following format:

```
<docker repo>:<php version>-<php variant>-<branch or version>
```

For convenience, the latest stable version/variant is also tagged as:

```
<docker repo>:<php version>-<php variant>
```

### CLI

**Images names**:

- `jestefane/php-dev:5.5-cli-1.1.1`
- `jestefane/php-dev:5.6-cli-1.1.1`
- `jestefane/php-dev:7.0-cli-1.1.1`
- `jestefane/php-dev:7.1-cli-1.1.1`
- `jestefane/php-dev:7.2-cli-1.1.1`
- `jestefane/php-dev:7.2-cli`
- `jestefane/php-dev:7.1-cli`
- `jestefane/php-dev:7.0-cli`
- `jestefane/php-dev:5.6-cli`
- `jestefane/php-dev:5.5-cli`

**Shortcuts**: [`php-cli`][php-cli-ref], [`composer`][composer-ref]

**Example**:

```bash
$ docker run jestefane/php-dev:7.2-cli-1.1.1 hello-world.php
$ docker run jestefane/php-dev:7.2-cli hello-world.php

# or using one of the provided shortcuts
$ php-7.2-cli hello-world.php
Expand All @@ -68,18 +74,18 @@ $ php-7.2-cli hello-world.php

**Images names**:

- `jestefane/php-dev:5.5-fpm-1.1.1`
- `jestefane/php-dev:5.6-fpm-1.1.1`
- `jestefane/php-dev:7.0-fpm-1.1.1`
- `jestefane/php-dev:7.1-fpm-1.1.1`
- `jestefane/php-dev:7.2-fpm-1.1.1`
- `jestefane/php-dev:5.5-fpm`
- `jestefane/php-dev:5.6-fpm`
- `jestefane/php-dev:7.0-fpm`
- `jestefane/php-dev:7.1-fpm`
- `jestefane/php-dev:7.2-fpm`

**Shortcuts**: [`php-fpm`][php-fpm-ref]

**Example**:

```bash
$ docker run jestefane/php-dev:7.2-fpm-1.1.1 hello-world.php
$ docker run jestefane/php-dev:7.2-fpm hello-world.php

# or using one of the provided shortcuts
$ php-7.2-fpm hello-world.php
Expand Down Expand Up @@ -176,10 +182,12 @@ Script template: [template/composer.template][composer-template]
| `BIN_DIR` | Directory in your `PATH` where you would like to symlink the scripts | `/usr/local/bin` | Any path on your system. Preferaby one already in your `PATH` |
| `SCRIPTS_DIR` | Directory where the scripts are generated (or removed). Relative to the repository's root | `scripts` | Any path on your system |

> **Note**: When overriding space separated values from the CLI, you have to escape spaces. For example in `bash` you use `\`:
> **Note**: When overriding space separated values from the CLI, you have to escape spaces. For example in `bash` you can use `\` or wrap your values in `"`:
>
> ```sh
> $ make build PHP_VERSIONS=7.0\ 7.1\ 7.2 PHP_VARIANTS=cli\ fpm
> # or
> $ make build PHP_VERSIONS="7.0 7.1 7.2" PHP_VARIANTS="cli fpm"
> ```
### Tasks
Expand All @@ -191,17 +199,17 @@ Locally builds all images from all possible combinations of `PHP_VERSIONS` and `
**Command:**
```sh
$ make build [PHP_VERSIONS=] [PHP_VARIANTS=] [SOURCE_BRANCH=] [DOCKER_TAG=] [DOCKER_REPO=]
$ make build [PHP_VERSIONS=] [PHP_VARIANTS=] [SOURCE_BRANCH=] [DOCKER_TAG=] [DOCKER_REPO=] [DOCKER_TAG=]
```
#### Remove the Images

Remove all locally cached images from all possible combinations of `PHP_VERSIONS` and `PHP_VARIANTS`.
Remove all locally cached images from all possible combinations of `PHP_VERSIONS` and `PHP_VARIANTS`. The `DOCKER_TAG` is used to target a specific PHP version, variant.

**Command:**

```sh
$ make rm_build [PHP_VERSIONS=] [PHP_VARIANTS=] [SOURCE_BRANCH=] [DOCKER_REPO=]
$ make rm_build [PHP_VERSIONS=] [PHP_VARIANTS=] [SOURCE_BRANCH=] [DOCKER_TAG=] [DOCKER_REPO=]
```

#### Rebuild the Images
Expand Down Expand Up @@ -287,8 +295,9 @@ $ make rm_dangling
[docker-stars]: https://img.shields.io/docker/stars/jestefane/php-dev "Docker Stars"
[docker-builds]: https://hub.docker.com/r/jestefane/php-dev/builds "Docker Builds"
[docker-overview]: https://hub.docker.com/r/jestefane/php-dev "Docker Overview"
[microbadger-layers]: https://img.shields.io/microbadger/layers/jestefane/php-dev/7.2-cli-1.1.1 "MicroBadger Layers"
[microbadger-image-size]: https://img.shields.io/microbadger/image-size/jestefane/php-dev/7.2-cli-1.1.1 "MicroBadger Size"
[microbadger-layers]: https://img.shields.io/microbadger/layers/jestefane/php-dev/latest "MicroBadger Layers"
[microbadger-image-size]: https://img.shields.io/microbadger/image-size/jestefane/php-dev/latest "MicroBadger Size"
[microbadger-url]: https://microbadger.com/images/jestefane/php-dev "MicroBadger Estefane/php-dev"
[shortcuts]: #shortcuts "Shortcuts"
[install-the-shortcuts]: #install-the-shortcuts "Install the Shortcuts"
[docker-php]: https://hub.docker.com/_/php "Official Docker PHP Images"
Expand Down
120 changes: 90 additions & 30 deletions build/hooks/_common
Original file line number Diff line number Diff line change
@@ -1,36 +1,96 @@
#!/usr/bin/env bash

echo
echo "************************************************"
echo " Build/Testing Environment variables"
echo "************************************************"
echo "SOURCE_BRANCH: ${SOURCE_BRANCH}"
echo "SOURCE_COMMIT: ${SOURCE_COMMIT}"
echo "COMMIT_MSG: ${COMMIT_MSG}"
echo "DOCKER_REPO: ${DOCKER_REPO}"
echo "DOCKERFILE_PATH: ${DOCKERFILE_PATH}"
echo "DOCKER_TAG: ${DOCKER_TAG}"
echo "IMAGE_NAME: ${IMAGE_NAME}"
echo "************************************************"
echo "Available PHP_VERSIONS: ${PHP_VERSIONS}"
echo "Available PHP_VARIANTS: ${PHP_VARIANTS}"
echo "************************************************"
echo

# extract version and variant from the DOCKER_TAG
if [ -n "${DOCKER_TAG}" ]; then
php_version="${DOCKER_TAG%%-*}"
if [[ "${PHP_VERSIONS}" == *"$php_version"* ]]; then
PHP_VERSIONS="$php_version"
echo ">>> Set PHP_VERSIONS to: $PHP_VERSIONS"
function echoEnvVars() {
echo
echo "************************************************"
echo " Build/Testing Environment variables"
echo "************************************************"
echo "SOURCE_BRANCH: ${SOURCE_BRANCH}"
echo "SOURCE_COMMIT: ${SOURCE_COMMIT}"
echo "COMMIT_MSG: ${COMMIT_MSG}"
echo "DOCKER_REPO: ${DOCKER_REPO}"
echo "DOCKERFILE_PATH: ${DOCKERFILE_PATH}"
echo "DOCKER_TAG: ${DOCKER_TAG}"
echo "IMAGE_NAME: ${IMAGE_NAME}"
echo "************************************************"
echo "Available PHP_VERSIONS: ${PHP_VERSIONS}"
echo "Available PHP_VARIANTS: ${PHP_VARIANTS}"
echo "************************************************"
echo
}

# Loops
function loopVersionsVariants() {
echoEnvVars

if [ -n "${DOCKER_TAG}" ]; then
php_version=$(getVersionFromDockerTag)
php_variant=$(getVariantFromDockerTag)

checkForVersionVariant "$php_version" "$php_variant"
$1 "$php_version" "$php_variant"
else
for php_version in $PHP_VERSIONS; do
for php_variant in $PHP_VARIANTS; do
checkForVersionVariant "$php_version" "$php_variant"
$1 "$php_version" "$php_variant"
done
done
fi
}

php_variant="${DOCKER_TAG#*-}"
php_variant=${php_variant%%-*}
if [[ "${PHP_VARIANTS}" == *"$php_variant"* ]]; then
PHP_VARIANTS="$php_variant"
echo ">>> Set PHP_VARIANTS to: $PHP_VARIANTS"
# extract version from $DOCKER_TAG
function getVersionFromDockerTag() {
if [ -n "$DOCKER_TAG" ]; then
local php_version="${DOCKER_TAG%%-*}"
if [[ "$PHP_VERSIONS" == *"$php_version"* ]]; then
echo "$php_version"
fi
fi
fi
}

# extract variant from $DOCKER_TAG
function getVariantFromDockerTag() {
if [ -n "${DOCKER_TAG}" ]; then
local trimed_left="${DOCKER_TAG#*-}"
local php_variant=${trimed_left%%-*}
if [[ "${PHP_VARIANTS}" == *"$php_variant"* ]]; then
echo "$php_variant"
fi
fi
}

# returns the IMAGE_NAME or generate one
function getImageName() {
local image_name="$IMAGE_NAME"
if [ -z "$image_name" ]; then
local php_version=$1
local php_variant=$2
local image_name="$DOCKER_REPO:$php_version-$php_variant"
if [ -n "$SOURCE_BRANCH" ]; then
image_name="$image_name-$SOURCE_BRANCH"
fi
fi
echo "$image_name"
}

# exits the script if either or are missing
function checkForVersionVariant() {
local php_version=$1
local php_variant=$2

if [ -z "$php_version" ] || [ -z "$php_variant" ]; then
echo "Missing php_version or php_variant"
exit 1
fi
}

# Remove loally built images
function remove_image() {
local php_version=$1
local php_variant=$2

echo
image_name=$(getImageName "$php_version" "$php_variant")
echo "Removing image: $image_name"
docker rmi "$image_name" || true
}
Loading

0 comments on commit a218557

Please sign in to comment.