Refactor Build system

- Separate Travis branch deployment and release deployment stages (also makes `deploy.sh` obsolete)
- Add `clean.sh` and `release.sh` scripts to allow users to create "release" packages locally
- Use `setup/*.sh` scripts to check and install build dependencies (like PHP_CodeSniffer, phpDocumentor and cloc)
- Use `create-release.sh` of `picocms/ci-tools` to create release archives
- Streamline script usage

Use the following to test Pico and to create a "release" package locally:

```sh
cd ~/My-Pico-Workspace/Components/pico

ln -rs ../ci-tools .build/ci-tools

. ./.build/ci-tools/init/local.sh.inc
. ./.build/init.sh.inc

phpcs --standard=.phpcs.xml "$PICO_PROJECT_DIR"

clean.sh
release.sh
```
This commit is contained in:
Daniel Rudolf 2019-11-03 20:03:48 +01:00
parent 7bbd8736d1
commit 58f615403e
No known key found for this signature in database
GPG key ID: A061F02CD8DE4538
11 changed files with 176 additions and 177 deletions

25
.build/clean.sh Executable file
View file

@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -e
[ -n "$PICO_BUILD_ENV" ] || { echo "No Pico build environment specified" >&2; exit 1; }
# parameters
ARCHIVE_DIR="${1:-$PICO_PROJECT_DIR}" # directory to create release archives in
# print parameters
echo "Cleaning up build environment..."
printf 'PICO_DEPLOY_DIR="%s"\n' "$PICO_DEPLOY_DIR"
printf 'PICO_BUILD_DIR="%s"\n' "$PICO_BUILD_DIR"
printf 'ARCHIVE_DIR="%s"\n' "$ARCHIVE_DIR"
echo
echo "Removing deployment directory..."
[ ! -d "$PICO_DEPLOY_DIR" ] || rm -rf "$PICO_DEPLOY_DIR"
echo "Removing build directory..."
[ ! -d "$PICO_BUILD_DIR" ] || rm -rf "$PICO_BUILD_DIR"
echo "Removing release archives..."
find "$ARCHIVE_DIR" -mindepth 1 -maxdepth 1 \
\( -name 'pico-release-*.tar.gz' -o -name 'pico-release-*.zip' \) \
-delete

View file

@ -1,97 +0,0 @@
#!/usr/bin/env bash
set -e
export PATH="$PICO_TOOLS_DIR:$PATH"
. "$PICO_TOOLS_DIR/functions/parse-version.sh.inc"
# parameters
ARCHIVE_DIR="$1" # directory to create release archives in
ARCHIVE_FILENAME="$2" # release archive file name (without file extension)
if [ -z "$ARCHIVE_DIR" ] || [ "$(realpath "$ARCHIVE_DIR")" == "$(realpath "$PICO_BUILD_DIR")" ]; then
echo "Unable to create release archives: Invalid release archive target dir '$ARCHIVE_DIR'" >&2
exit 1
fi
if [ -z "$ARCHIVE_FILENAME" ]; then
echo "Unable to create release archives: No release archive file name given" >&2
exit 1
fi
# parse version
if ! parse_version "$PROJECT_REPO_TAG"; then
echo "Unable to create release archive: Invalid version '$PROJECT_REPO_TAG'" >&2
exit 1
fi
# clone repo
github-clone.sh "$PICO_BUILD_DIR" "https://github.com/$RELEASE_REPO_SLUG.git" "$RELEASE_REPO_BRANCH"
cd "$PICO_BUILD_DIR"
# force Pico version
echo "Updating composer dependencies..."
composer require --no-update \
"picocms/pico $VERSION_FULL@$VERSION_STABILITY" \
"picocms/pico-theme $VERSION_FULL@$VERSION_STABILITY" \
"picocms/pico-deprecated $VERSION_FULL@$VERSION_STABILITY"
echo
# set minimum stability
if [ "$VERSION_STABILITY" != "stable" ]; then
echo "Setting minimum stability to '$VERSION_STABILITY'..."
composer config "minimum-stability" "$VERSION_STABILITY"
composer config "prefer-stable" "true"
echo
fi
# install dependencies
echo "Running \`composer install\`..."
composer install --no-suggest --prefer-dist --no-dev --optimize-autoloader
echo
# prepare release
echo "Replacing 'index.php'..."
cp vendor/picocms/pico/index.php.dist index.php
echo "Adding 'README.md', 'CONTRIBUTING.md', 'CHANGELOG.md'..."
cp vendor/picocms/pico/README.md README.md
cp vendor/picocms/pico/CONTRIBUTING.md CONTRIBUTING.md
cp vendor/picocms/pico/CHANGELOG.md CHANGELOG.md
echo "Preparing 'composer.json' for release..."
composer require --no-update \
"picocms/pico ^$VERSION_MILESTONE" \
"picocms/pico-theme ^$VERSION_MILESTONE" \
"picocms/pico-deprecated ^$VERSION_MILESTONE"
echo "Removing '.git' directory..."
rm -rf .git
echo "Removing '.git' directories of dependencies..."
find vendor/ -type d -path 'vendor/*/*/.git' -print0 | xargs -0 rm -rf
find themes/ -type d -path 'themes/*/.git' -print0 | xargs -0 rm -rf
find plugins/ -type d -path 'plugins/*/.git' -print0 | xargs -0 rm -rf
echo
# create release archives
echo "Creating release archive '$ARCHIVE.tar.gz'..."
if [ -e "$ARCHIVE_DIR/$ARCHIVE.tar.gz" ]; then
echo "Unable to create release archive: File '$ARCHIVE.tar.gz' exists" >&2
exit 1
fi
find . -mindepth 1 -maxdepth 1 -printf '%f\0' \
| xargs -0 -- tar -czf "$ARCHIVE_DIR/$ARCHIVE.tar.gz" --
echo
echo "Creating release archive '$ARCHIVE.zip'..."
if [ -e "$ARCHIVE_DIR/$ARCHIVE.zip" ]; then
echo "Unable to create release archive: File '$ARCHIVE.zip' exists" >&2
exit 1
fi
zip -q -r "$ARCHIVE_DIR/$ARCHIVE.zip" .
echo

View file

@ -1,7 +1,7 @@
#!/usr/bin/env bash
set -e
export PATH="$PICO_TOOLS_DIR:$PATH"
[ -n "$PICO_BUILD_ENV" ] || { echo "No Pico build environment specified" >&2; exit 1; }
# get current Pico milestone
VERSION="$(php -r "require_once('$PICO_PROJECT_DIR/lib/Pico.php'); echo Pico::VERSION;")"

View file

@ -1,6 +1,8 @@
#!/usr/bin/env bash
set -e
[ -n "$PICO_BUILD_ENV" ] || { echo "No Pico build environment specified" >&2; exit 1; }
DEPLOY_FULL="true"
if [ "$DEPLOY_PHPDOC_RELEASES" != "true" ]; then
echo "Skipping phpDoc release deployment because it has been disabled"
@ -31,10 +33,9 @@ if [ "$DEPLOY_FULL" != "true" ]; then
echo
fi
export PATH="$PICO_TOOLS_DIR:$PATH"
# parse version
. "$PICO_TOOLS_DIR/functions/parse-version.sh.inc"
# parse version
if ! parse_version "$PROJECT_REPO_TAG"; then
echo "Invalid version '$PROJECT_REPO_TAG'; aborting..." >&2
exit 1

View file

@ -1,6 +0,0 @@
#!/usr/bin/env bash
if [ -n "$PROJECT_REPO_TAG" ]; then
exec "$(dirname "$0")/deploy-release.sh"
else
exec "$(dirname "$0")/deploy-branch.sh"
fi

19
.build/init.sh.inc Normal file
View file

@ -0,0 +1,19 @@
if [ -z "$PICO_BUILD_ENV" ]; then
echo "No Pico build environment specified" >&2
exit 1
fi
# add project build dir to $PATH
export PATH="$PICO_PROJECT_DIR/.build:$PATH"
# set environment variables
__picocms_cmd export RELEASE_REPO_SLUG="${RELEASE_REPO_SLUG:-picocms/pico-composer}"
__picocms_cmd export RELEASE_REPO_BRANCH="${RELEASE_REPO_BRANCH:-master}"
if [ "$PROJECT_REPO_SLUG" != "picocms/Pico" ]; then
__picocms_cmd export DEPLOY_REPO_SLUG="${DEPLOY_REPO_SLUG:-$PROJECT_REPO_SLUG}"
__picocms_cmd export DEPLOY_REPO_BRANCH="${DEPLOY_REPO_BRANCH:-gh-pages}"
else
__picocms_cmd export DEPLOY_REPO_SLUG="${DEPLOY_REPO_SLUG:-picocms.github.io}"
__picocms_cmd export DEPLOY_REPO_BRANCH="${DEPLOY_REPO_BRANCH:-master}"
fi

View file

@ -1,55 +1,17 @@
#!/usr/bin/env bash
set -e
[ -n "$PICO_BUILD_ENV" ] || { echo "No Pico build environment specified" >&2; exit 1; }
# setup build system
echo "Installing build dependencies..."
echo
case "$1" in
"--deploy")
echo "Synchronizing package index files..."
sudo apt-get update
echo
echo "Installing cloc..."
sudo apt-get install -y cloc
echo
echo "Installing phpDocumentor..."
curl --location --output "$PICO_TOOLS_DIR/phpdoc" \
"https://github.com/phpDocumentor/phpDocumentor2/releases/latest/download/phpDocumentor.phar"
chmod +x "$PICO_TOOLS_DIR/phpdoc"
echo
;;
esac
echo "Installing PHP_CodeSniffer..."
if [ "$(php -r 'echo PHP_VERSION_ID;')" -ge 50400 ]; then
PHPCS_DOWNLOAD="https://github.com/squizlabs/PHP_CodeSniffer/releases/latest/download/"
else
PHPCS_DOWNLOAD="https://github.com/squizlabs/PHP_CodeSniffer/releases/download/2.9.2/"
fi
curl --location --output "$PICO_TOOLS_DIR/phpcs" \
"$PHPCS_DOWNLOAD/phpcs.phar"
chmod +x "$PICO_TOOLS_DIR/phpcs"
curl --location --output "$PICO_TOOLS_DIR/phpcbf" \
"$PHPCS_DOWNLOAD/phpcbf.phar"
chmod +x "$PICO_TOOLS_DIR/phpcbf"
echo
# setup composer
echo "Setup Composer..."
# let composer use our GITHUB_OAUTH_TOKEN
if [ -n "$GITHUB_OAUTH_TOKEN" ]; then
composer config --global github-oauth.github.com "$GITHUB_OAUTH_TOKEN"
fi
BUILD_REQUIREMENTS=( --phpcs )
[ "$1" != "--deploy" ] || BUILD_REQUIREMENTS+=( --cloc --phpdoc )
"$PICO_TOOLS_DIR/setup/$PICO_BUILD_ENV.sh" "${BUILD_REQUIREMENTS[@]}"
# set COMPOSER_ROOT_VERSION when necessary
if [ -z "$COMPOSER_ROOT_VERSION" ] && [ -n "$PROJECT_REPO_BRANCH" ]; then
echo "Setting up Composer..."
PICO_VERSION_PATTERN="$(php -r "
\$json = json_decode(file_get_contents('$PICO_PROJECT_DIR/composer.json'), true);
if (\$json !== null) {
@ -69,9 +31,9 @@ if [ -z "$COMPOSER_ROOT_VERSION" ] && [ -n "$PROJECT_REPO_BRANCH" ]; then
if [ -n "$PICO_VERSION_PATTERN" ]; then
export COMPOSER_ROOT_VERSION="$PICO_VERSION_PATTERN"
fi
fi
echo
fi
# install dependencies
echo "Running \`composer install\`$([ -n "$COMPOSER_ROOT_VERSION" ] && echo -n " ($COMPOSER_ROOT_VERSION)")..."

86
.build/release.sh Executable file
View file

@ -0,0 +1,86 @@
#!/usr/bin/env bash
set -e
[ -n "$PICO_BUILD_ENV" ] || { echo "No Pico build environment specified" >&2; exit 1; }
# parameters
VERSION="${1:-$PROJECT_REPO_TAG}" # version to create a release for
ARCHIVE_DIR="${2:-$PICO_PROJECT_DIR}" # directory to create release archives in
# print parameters
echo "Creating new release..."
printf 'VERSION="%s"\n' "$VERSION"
echo
# guess version string
if [ -z "$VERSION" ]; then
PICO_VERSION="$(php -r "
require_once('$PICO_PROJECT_DIR/lib/Pico.php');
echo preg_replace('/-(?:dev|n|nightly)(?:[.-]?[0-9]+)?(?:[.-]dev)?$/', '', Pico::VERSION);
")"
VERSION="v$PICO_VERSION-dev+${PROJECT_REPO_BRANCH:-master}"
echo "Creating development release of Pico v$PICO_VERSION ($VERSION)..."
echo
fi
# parse version
. "$PICO_TOOLS_DIR/functions/parse-version.sh.inc"
if ! parse_version "$VERSION"; then
echo "Unable to create release archive: Invalid version '$VERSION'" >&2
exit 1
fi
DEPENDENCY_VERSION="$VERSION_FULL@$VERSION_STABILITY"
if [ "$VERSION_STABILITY" == "dev" ] && [ -n "$VERSION_BUILD" ]; then
DEPENDENCY_VERSION="dev-$VERSION_BUILD"
fi
# clone repo
github-clone.sh "$PICO_BUILD_DIR" "https://github.com/$RELEASE_REPO_SLUG.git" "$RELEASE_REPO_BRANCH"
cd "$PICO_BUILD_DIR"
# force Pico version
echo "Updating composer dependencies..."
composer require --no-update \
"picocms/pico $DEPENDENCY_VERSION" \
"picocms/pico-theme $DEPENDENCY_VERSION" \
"picocms/pico-deprecated $DEPENDENCY_VERSION"
echo
# set minimum stability
if [ "$VERSION_STABILITY" != "stable" ]; then
echo "Setting minimum stability to '$VERSION_STABILITY'..."
composer config "minimum-stability" "$VERSION_STABILITY"
composer config "prefer-stable" "true"
echo
fi
# install dependencies
echo "Running \`composer install\`..."
composer install --no-suggest --prefer-dist --no-dev --optimize-autoloader
echo
# prepare release
echo "Replacing 'index.php'..."
cp vendor/picocms/pico/index.php.dist index.php
echo "Adding 'README.md', 'CONTRIBUTING.md', 'CHANGELOG.md'..."
cp vendor/picocms/pico/README.md README.md
cp vendor/picocms/pico/CONTRIBUTING.md CONTRIBUTING.md
cp vendor/picocms/pico/CHANGELOG.md CHANGELOG.md
echo "Removing '.git' directories of plugins and themes..."
find themes/ -type d -path 'themes/*/.git' -print0 | xargs -0 rm -rf
find plugins/ -type d -path 'plugins/*/.git' -print0 | xargs -0 rm -rf
echo "Preparing 'composer.json' for release..."
composer require --no-update \
"picocms/pico ^$VERSION_MILESTONE" \
"picocms/pico-theme ^$VERSION_MILESTONE" \
"picocms/pico-deprecated ^$VERSION_MILESTONE"
# create release archives
create-release.sh "$PICO_BUILD_DIR" "$ARCHIVE_DIR" "pico-release-v$VERSION_FULL"

2
.gitattributes vendored
View file

@ -1,5 +1,5 @@
/.github export-ignore
/.build export-ignore
/.github export-ignore
/assets/.gitignore export-ignore
/config/.gitignore export-ignore
/content/.gitignore export-ignore

11
.gitignore vendored
View file

@ -10,12 +10,17 @@ desktop.ini
.DS_Store
._*
# composer
# Composer
/composer.lock
/composer.phar
/vendor
# Build system
/.build/build
/.build/deploy
/.build/ci-tools
/pico-release-*.tar.gz
/pico-release-*.zip
# phpDocumentor
/.build/phpdoc
/.build/phpdoc.cache
/phpDocumentor.phar

View file

@ -23,48 +23,52 @@ jobs:
- php: hhvm-3.27 # until Sep 2019
- php: hhvm-3.30 # until Nov 2019
# Deployment stage
- stage: deploy
php: 5.3
dist: precise
# Branch deployment stage
- stage: deploy-branch
if: type == "push" && tag IS blank
php: 5.6
sudo: required
install:
- '[ "$TRAVIS_PULL_REQUEST" == "false" ] || travis_terminate 0'
- '[ -n "$TRAVIS_TAG" ] || [[ ",$DEPLOY_PHPDOC_BRANCHES," == *,"$TRAVIS_BRANCH",* ]] || travis_terminate 0'
- '[[ ",$DEPLOY_PHPDOC_BRANCHES," == *,"$TRAVIS_BRANCH",* ]] || travis_terminate 0'
- install.sh --deploy
script:
- deploy.sh
- deploy-branch.sh
# Release deployment stage
- stage: deploy-release
if: tag IS present
php: 5.3
dist: precise
install:
- install.sh --deploy
script:
- '[ "$PROJECT_REPO_TAG" == "v$(php -r "require_once(\"lib/Pico.php\"); echo Pico::VERSION;")" ]'
- deploy-release.sh
before_deploy:
- '[ "$TRAVIS_TAG" == "v$(php -r "require_once(\"lib/Pico.php\"); echo Pico::VERSION;")" ]'
- create-release.sh "$TRAVIS_BUILD_DIR" "pico-release-$TRAVIS_TAG"
- release.sh
deploy:
provider: releases
api_key: ${GITHUB_OAUTH_TOKEN}
file:
- pico-release-$TRAVIS_TAG.tar.gz
- pico-release-$TRAVIS_TAG.zip
- pico-release-$PROJECT_REPO_TAG.tar.gz
- pico-release-$PROJECT_REPO_TAG.zip
skip_cleanup: true
name: Version ${TRAVIS_TAG:1}
name: Version ${PROJECT_REPO_TAG:1}
draft: true
on:
tags: true
# Ignore nightly build failures
allow_failures:
- php: nightly
fast-finish: true
fast_finish: true
before_install:
- export PATH="$TRAVIS_BUILD_DIR/.build:$PATH"
- export PICO_TOOLS_DIR="$HOME/__picocms_tools"
- git clone --branch="$TOOLS_REPO_BRANCH" "https://github.com/$TOOLS_REPO_SLUG.git" "$PICO_TOOLS_DIR"
- . "$PICO_TOOLS_DIR/init/travis.sh.inc"
- . "$PICO_PROJECT_DIR/.build/init.sh.inc"
install:
- install.sh
before_script:
- export PATH="$TRAVIS_BUILD_DIR/vendor/bin:$PATH"
script:
- phpcs --standard=.phpcs.xml "$TRAVIS_BUILD_DIR"
- phpcs --standard=.phpcs.xml "$PICO_PROJECT_DIR"