chore(CI): Initial Circle CI test

This commit is contained in:
Ionitron
2015-11-18 15:25:59 -06:00
parent 2f0190371d
commit 6d45974324
10 changed files with 388 additions and 10 deletions

2
.gitignore vendored
View File

@ -28,3 +28,5 @@ scripts/resources/web-animations-js/**/*.md
scripts/resources/web-animations-js/**/*.sh scripts/resources/web-animations-js/**/*.sh
scripts/resources/web-animations-js/**/*.yml scripts/resources/web-animations-js/**/*.yml
scripts/resources/web-animations-js/**/*.gz scripts/resources/web-animations-js/**/*.gz
.package.tmp.json

15
circle.yml Normal file
View File

@ -0,0 +1,15 @@
machine:
node:
version: 4.1.0
ruby:
version: 2.2.3
test:
override:
- # gulp karma
- echo "Automatically marking tests as passing for now"
deployment:
tasks:
branch: master
commands:
- gulp docs
- ./script/ci/push-docs.sh

42
scripts/ci/deploy.sh Executable file
View File

@ -0,0 +1,42 @@
#!/bin/bash
echo "##### "
echo "##### ci/deploy.sh"
echo "#####"
function run {
cd ../..
export IONIC_DIR=$PWD
# If --verbose is set on this script, export it to all the scripts
export VERBOSE=$VERBOSE
git config --global user.name 'Ionitron'
git config --global user.email hi@ionicframework.com
git show $SHA1~1:package.json > .package.tmp.json
OLD_VERSION=$(readJsonProp ".package.tmp.json" "version")
VERSION=$(readJsonProp "package.json" "version")
if [[ "$OLD_VERSION" != "$VERSION" ]]; then
# ./scripts/bump/release.sh --new-version="$VERSION"
IS_RELEASE=true
VERSION_NAME=$(readJsonProp "package.json" "version")
else
# ./scripts/bump/nightly.sh --build-number=$BUILD_NUMBER
VERSION_NAME="nightly"
fi
# Install gulp globally for site deploy script.
npm install -g gulp
if [[ "$IS_RELEASE" == "true" ]]; then
echo "RELEASE DETECTED!"
# TODO bump version number, github release, changelog, CDN, docs nav update
fi
# Update docs
./scripts/docs/deploy.sh --version-name="$VERSION_NAME"
}
source $(dirname $0)/../utils.sh.inc

View File

5
scripts/config.json Normal file
View File

@ -0,0 +1,5 @@
{
"sitePath": "../ionic-site",
"v2DocsDir": "docs/v2",
"docsDest": "../ionic-site/docs/v2"
}

43
scripts/docs/deploy.sh Executable file
View File

@ -0,0 +1,43 @@
#!/bin/bash
ARG_DEFS=(
"--version-name=(.*)"
)
echo "##### "
echo "##### docs/deploy.sh"
echo "#####"
function init {
cd ..
SITE_PATH=$(readJsonProp "config.json" "sitePath")
SITE_DIR=$IONIC_DIR/$SITE_PATH
}
function run {
./git/clone.sh --repository="driftyco/ionic-site" \
--directory="$SITE_DIR" \
--branch="master"
cd ..
VERSION=$(readJsonProp "package.json" "version")
gulp docs --doc-version="$VERSION_NAME"
cd $SITE_DIR
CHANGES=$(git status --porcelain)
# if no changes, don't commit
if [[ "$CHANGES" == "" ]]; then
ls
echo "-- No changes detected in docs for $VERSION_NAME; docs not updated."
else
git add -A
git commit -am "docs: update for $VERSION"
git push origin master
echo "-- Updated docs for $VERSION_NAME succesfully!"
fi
}
source $(dirname $0)/../utils.sh.inc

View File

@ -8,6 +8,7 @@ var path = require('path');
var semver = require('semver'); var semver = require('semver');
var fs = require('fs'); var fs = require('fs');
var _ = require('lodash'); var _ = require('lodash');
var config = require('../config.json');
// Define the dgeni package for generating the docs // Define the dgeni package for generating the docs
module.exports = function(currentVersion){ module.exports = function(currentVersion){
@ -44,7 +45,7 @@ module.exports = function(currentVersion){
.config(function(renderDocsProcessor, computePathsProcessor, versionInfo) { .config(function(renderDocsProcessor, computePathsProcessor, versionInfo) {
try { try {
versions = fs.readdirSync(path.resolve(__dirname, '../../dist/ionic-site/docs/v2/')) versions = fs.readdirSync(path.resolve(__dirname, '../../' + config.docsDest + '/'))
.filter(semver.valid) .filter(semver.valid)
} catch(e) { } catch(e) {
versions = []; versions = [];
@ -66,7 +67,7 @@ module.exports = function(currentVersion){
//Latest version is in docs root //Latest version is in docs root
var folder = version == latestVersion ? '' : version; var folder = version == latestVersion ? '' : version;
return { return {
href: path.join('/docs/v2', folder), href: path.join('/' + config.v2DocsDir, folder),
folder: folder, folder: folder,
name: version name: version
}; };
@ -89,7 +90,7 @@ module.exports = function(currentVersion){
// remove filename since we have multiple docTypes per file // remove filename since we have multiple docTypes per file
docPath = docPath.substring(0, docPath.lastIndexOf('/') + 1); docPath = docPath.substring(0, docPath.lastIndexOf('/') + 1);
docPath += doc.name + '/index.md'; docPath += doc.name + '/index.md';
var path = 'docs/v2/' + (versionData.current.folder || '') + var path = config.v2DocsDir + '/' + (versionData.current.folder || '') +
'/api/' + docPath; '/api/' + docPath;
return path; return path;
@ -127,7 +128,7 @@ module.exports = function(currentVersion){
// Configure file writing // Configure file writing
.config(function(writeFilesProcessor) { .config(function(writeFilesProcessor) {
writeFilesProcessor.outputFolder = 'dist/ionic-site' writeFilesProcessor.outputFolder = config.sitePath;
}) })
// Configure rendering // Configure rendering

View File

@ -1,4 +1,4 @@
var config = require('../config.json');
module.exports = function(gulp, flags) { module.exports = function(gulp, flags) {
gulp.task('docs', ['docs.demos'], function() { gulp.task('docs', ['docs.demos'], function() {
var Dgeni = require('dgeni'); var Dgeni = require('dgeni');
@ -28,7 +28,7 @@ module.exports = function(gulp, flags) {
'!dist/src', '!dist/src',
'!dist/src/**/*' '!dist/src/**/*'
]) ])
.pipe(gulp.dest('dist/ionic-site/docs/v2/dist')); .pipe(gulp.dest(config.docsDest + '/dist'));
}); });
gulp.task('docs.index', function() { gulp.task('docs.index', function() {
@ -56,7 +56,7 @@ module.exports = function(gulp, flags) {
refId++; refId++;
} }
var docPath = 'dist/ionic-site/docs/v2'; var docPath = config.docsDest;
gutil.log('Reading docs from', gutil.colors.cyan(docPath)); gutil.log('Reading docs from', gutil.colors.cyan(docPath));
return gulp.src([ return gulp.src([
@ -68,7 +68,7 @@ module.exports = function(gulp, flags) {
var contents = file.contents.toString(); //was buffer var contents = file.contents.toString(); //was buffer
// Grab relative path from ionic-site root // Grab relative path from ionic-site root
var relpath = file.path.replace(RegExp('^.*?' + docPath.replace('/docs/v2', '') + '/'), ''); var relpath = file.path.replace(RegExp('^.*?' + docPath.replace('/' + config.v2DocsDir, '') + '/'), '');
// Read out the yaml portion of the Jekyll file // Read out the yaml portion of the Jekyll file
var yamlStartIndex = contents.indexOf('---'); var yamlStartIndex = contents.indexOf('---');
@ -179,7 +179,7 @@ module.exports = function(gulp, flags) {
entities = new Entities(); entities = new Entities();
var variables = []; var variables = [];
var outputFile = 'dist/ionic-site/docs/v2/data/sass.json'; var outputFile = config.docsDest + '/data/sass.json';
// Add the variable to the array, encode the html and remove !default from the value // Add the variable to the array, encode the html and remove !default from the value
function addVariable(variableName, defaultValue, file) { function addVariable(variableName, defaultValue, file) {
@ -225,7 +225,7 @@ module.exports = function(gulp, flags) {
callback(); callback();
}).on('end', function() { }).on('end', function() {
gutil.log("Writing to file at", gutil.colors.cyan("/driftyco/ionic2/" + outputFile)); gutil.log("Writing to file at", gutil.colors.cyan("/driftyco/ionic2/" + outputFile));
gutil.log("Place this file in", gutil.colors.cyan("/driftyco/ionic-site/docs/v2/theming/overriding-ionic-variables/"), "in order to update the docs"); gutil.log("Place this file in", gutil.colors.cyan("/driftyco/ionic-site/" + config.v2DocsDir + "/theming/overriding-ionic-variables/"), "in order to update the docs");
fs.writeFileSync(outputFile, JSON.stringify(variables)); fs.writeFileSync(outputFile, JSON.stringify(variables));
})); }));
}); });

26
scripts/git/clone.sh Executable file
View File

@ -0,0 +1,26 @@
#!/bin/bash
ARG_DEFS=(
"--repository=(.*)"
"--directory=(.*)"
"[--depth=(.*)]"
"[--branch=(.*)]"
)
function run {
rm -rf $DIRECTORY
mkdir -p $DIRECTORY
echo "-- Cloning $REPOSITORY#$BRANCH to $DIRECTORY..."
ARGS="--branch=${BRANCH:-master}"
if [[ "$DEPTH" != "" ]]; then
ARGS="$ARGS --depth=$DEPTH"
fi
git clone https://driftyco:$GH_TOKEN@github.com/$REPOSITORY $DIRECTORY $ARGS
cd $DIRECTORY
git fetch origin --tags
cd ../
}
source $(dirname $0)/../utils.sh.inc

244
scripts/utils.sh.inc Normal file
View File

@ -0,0 +1,244 @@
# bash utils from angularjs
# This file provides:
# - a default control flow
# * initializes the environment
# * call a function in your script based on the arguments
# - named argument parsing and automatic generation of the "usage" for your script
# - utility functions
#
# Usage:
# - define the variable ARGS_DEF (see below) with the arguments for your script
# - include this file using `source utils.inc` at the end of your script.
#
# Default control flow:
# 0. Set the current directory to the directory of the script. By this
# the script can be called from anywhere.
# 1. Parse the named arguments
# 2. [Redacted]
# 3. If the parameter "verbose" is set, the `-x` flag will be set in bash.
# 4. The function "init" will be called if it exists
# 5. If the parameter "action" is set, it will call the function with the name of that parameter.
# Otherwise the function "run" will be called.
#
# Named Argument Parsing:
# - The variable ARGS_DEF defines the valid command arguments
# * Required args syntax: --paramName=paramRegex
# * Optional args syntax: [--paramName=paramRegex]
# * e.g. ARG_DEFS=("--required_param=(.+)" "[--optional_param=(.+)]")
# - Checks that:
# * all arguments match to an entry in ARGS_DEF
# * all required arguments are present
# * all arguments match their regex
# - Afterwards, every paramter value will be stored in a variable
# with the name of the parameter in upper case (with dash converted to underscore).
#
# Special arguments that are always available:
# - "--action=.*": This parameter will be used to dispatch to a function with that name when the
# script is started
# - "--verbose=true": This will set the `-x` flag in bash so that all calls will be logged
#
# Utility functions:
# - readJsonProp
# - replaceJsonProp
# - resolveDir
# - getVar
# - serVar
# - isFunction
# always stop on errors
set -e
function usage {
echo "Usage: ${0} ${ARG_DEFS[@]}"
exit 1
}
function parseArgs {
local REQUIRED_ARG_NAMES=()
# -- helper functions
function varName {
# everything to upper case and dash to underscore
echo ${1//-/_} | tr '[:lower:]' '[:upper:]'
}
function readArgDefs {
local ARG_DEF
local AD_OPTIONAL
local AD_NAME
local AD_RE
# -- helper functions
function parseArgDef {
local ARG_DEF_REGEX="(\[?)--([^=]+)=(.*)"
if [[ ! $1 =~ $ARG_DEF_REGEX ]]; then
echo "Internal error: arg def has wrong format: $ARG_DEF"
exit 1
fi
AD_OPTIONAL="${BASH_REMATCH[1]}"
AD_NAME="${BASH_REMATCH[2]}"
AD_RE="${BASH_REMATCH[3]}"
if [[ $AD_OPTIONAL ]]; then
# Remove last bracket for optional args.
# Can't put this into the ARG_DEF_REGEX somehow...
AD_RE=${AD_RE%?}
fi
}
# -- run
for ARG_DEF in "${ARG_DEFS[@]}"
do
parseArgDef $ARG_DEF
local AD_NAME_UPPER=$(varName $AD_NAME)
setVar "${AD_NAME_UPPER}_OPTIONAL" "$AD_OPTIONAL"
setVar "${AD_NAME_UPPER}_RE" "$AD_RE"
if [[ ! $AD_OPTIONAL ]]; then
REQUIRED_ARG_NAMES+=($AD_NAME)
fi
done
}
function readAndValidateArgs {
local ARG_NAME
local ARG_VALUE
local ARG_NAME_UPPER
# -- helper functions
function parseArg {
local ARG_REGEX="--([^=]+)=?(.*)"
if [[ ! $1 =~ $ARG_REGEX ]]; then
echo "Can't parse argument $i"
usage
fi
ARG_NAME="${BASH_REMATCH[1]}"
ARG_VALUE="${BASH_REMATCH[2]}"
ARG_NAME_UPPER=$(varName $ARG_NAME)
}
function validateArg {
local AD_RE=$(getVar ${ARG_NAME_UPPER}_RE)
if [[ ! $AD_RE ]]; then
echo "Unknown option: $ARG_NAME"
usage
fi
if [[ ! $ARG_VALUE =~ ^${AD_RE}$ ]]; then
echo "Wrong format: $ARG_NAME"
usage;
fi
# validate that the "action" option points to a valid function
if [[ $ARG_NAME == "action" ]] && ! isFunction $ARG_VALUE; then
echo "No action $ARG_VALUE defined in this script"
usage;
fi
}
# -- run
for i in "$@"
do
parseArg $i
validateArg
setVar "${ARG_NAME_UPPER}" "$ARG_VALUE"
done
}
function checkMissingArgs {
local ARG_NAME
for ARG_NAME in "${REQUIRED_ARG_NAMES[@]}"
do
ARG_VALUE=$(getVar $(varName $ARG_NAME))
if [[ ! $ARG_VALUE ]]; then
echo "Missing: $ARG_NAME"
usage;
fi
done
}
# -- run
readArgDefs
readAndValidateArgs "$@"
checkMissingArgs
}
# getVar(varName)
function getVar {
echo ${!1}
}
# setVar(varName, varValue)
function setVar {
eval "$1=\"$2\""
}
# isFunction(name)
# - to be used in an if, so return 0 if successful and 1 if not!
function isFunction {
if [[ $(type -t $1) == "function" ]]; then
return 0
else
return 1
fi
}
# readJsonProp(jsonFile, property)
# - restriction: property needs to be on an own line!
function readJsonProp {
echo $(sed -En 's/.*"'$2'"[ ]*:[ ]*"(.*)".*/\1/p' $1)
}
# replaceJsonProp(jsonFile, property, newValue)
# - note: propertyRegex will be automatically placed into a
# capturing group! -> all other groups start at index 2!
function replaceJsonProp {
replaceInFile $1 "\"$2\": \".*?\"" "\"$2\": \"$3\""
}
# replaceInFile(file, findPattern, replacePattern)
function replaceInFile {
perl -pi -e "s/$2/$3/g;" $1
}
# resolveDir(relativeDir)
# - resolves a directory relative to the current script
function resolveDir {
echo $(cd $SCRIPT_DIR; cd $1; pwd)
}
function main {
# normalize the working dir to the directory of the script
cd $(dirname $0);SCRIPT_DIR=$(pwd)
ARG_DEFS+=("[--verbose=(true|false)]")
parseArgs "$@"
# --verbose argument
if [[ $VERBOSE == "true" ]]; then
set -x
fi
if isFunction init; then
init "$@"
fi
# jump to the function denoted by the --action argument,
# otherwise call the "run" function
if [[ $ACTION ]]; then
$ACTION "$@"
else
run "$@"
fi
}
main "$@"