mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-17 10:41:13 +08:00
chore(CI): Initial Circle CI test
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@ -28,3 +28,5 @@ scripts/resources/web-animations-js/**/*.md
|
||||
scripts/resources/web-animations-js/**/*.sh
|
||||
scripts/resources/web-animations-js/**/*.yml
|
||||
scripts/resources/web-animations-js/**/*.gz
|
||||
|
||||
.package.tmp.json
|
||||
|
15
circle.yml
Normal file
15
circle.yml
Normal 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
42
scripts/ci/deploy.sh
Executable 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
|
5
scripts/config.json
Normal file
5
scripts/config.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"sitePath": "../ionic-site",
|
||||
"v2DocsDir": "docs/v2",
|
||||
"docsDest": "../ionic-site/docs/v2"
|
||||
}
|
43
scripts/docs/deploy.sh
Executable file
43
scripts/docs/deploy.sh
Executable 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
|
@ -8,6 +8,7 @@ var path = require('path');
|
||||
var semver = require('semver');
|
||||
var fs = require('fs');
|
||||
var _ = require('lodash');
|
||||
var config = require('../config.json');
|
||||
|
||||
// Define the dgeni package for generating the docs
|
||||
module.exports = function(currentVersion){
|
||||
@ -44,7 +45,7 @@ module.exports = function(currentVersion){
|
||||
|
||||
.config(function(renderDocsProcessor, computePathsProcessor, versionInfo) {
|
||||
try {
|
||||
versions = fs.readdirSync(path.resolve(__dirname, '../../dist/ionic-site/docs/v2/'))
|
||||
versions = fs.readdirSync(path.resolve(__dirname, '../../' + config.docsDest + '/'))
|
||||
.filter(semver.valid)
|
||||
} catch(e) {
|
||||
versions = [];
|
||||
@ -66,7 +67,7 @@ module.exports = function(currentVersion){
|
||||
//Latest version is in docs root
|
||||
var folder = version == latestVersion ? '' : version;
|
||||
return {
|
||||
href: path.join('/docs/v2', folder),
|
||||
href: path.join('/' + config.v2DocsDir, folder),
|
||||
folder: folder,
|
||||
name: version
|
||||
};
|
||||
@ -89,7 +90,7 @@ module.exports = function(currentVersion){
|
||||
// remove filename since we have multiple docTypes per file
|
||||
docPath = docPath.substring(0, docPath.lastIndexOf('/') + 1);
|
||||
docPath += doc.name + '/index.md';
|
||||
var path = 'docs/v2/' + (versionData.current.folder || '') +
|
||||
var path = config.v2DocsDir + '/' + (versionData.current.folder || '') +
|
||||
'/api/' + docPath;
|
||||
|
||||
return path;
|
||||
@ -127,7 +128,7 @@ module.exports = function(currentVersion){
|
||||
|
||||
// Configure file writing
|
||||
.config(function(writeFilesProcessor) {
|
||||
writeFilesProcessor.outputFolder = 'dist/ionic-site'
|
||||
writeFilesProcessor.outputFolder = config.sitePath;
|
||||
})
|
||||
|
||||
// Configure rendering
|
||||
|
@ -1,4 +1,4 @@
|
||||
|
||||
var config = require('../config.json');
|
||||
module.exports = function(gulp, flags) {
|
||||
gulp.task('docs', ['docs.demos'], function() {
|
||||
var Dgeni = require('dgeni');
|
||||
@ -28,7 +28,7 @@ module.exports = function(gulp, flags) {
|
||||
'!dist/src',
|
||||
'!dist/src/**/*'
|
||||
])
|
||||
.pipe(gulp.dest('dist/ionic-site/docs/v2/dist'));
|
||||
.pipe(gulp.dest(config.docsDest + '/dist'));
|
||||
});
|
||||
|
||||
gulp.task('docs.index', function() {
|
||||
@ -56,7 +56,7 @@ module.exports = function(gulp, flags) {
|
||||
refId++;
|
||||
}
|
||||
|
||||
var docPath = 'dist/ionic-site/docs/v2';
|
||||
var docPath = config.docsDest;
|
||||
gutil.log('Reading docs from', gutil.colors.cyan(docPath));
|
||||
|
||||
return gulp.src([
|
||||
@ -68,7 +68,7 @@ module.exports = function(gulp, flags) {
|
||||
var contents = file.contents.toString(); //was buffer
|
||||
|
||||
// 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
|
||||
var yamlStartIndex = contents.indexOf('---');
|
||||
@ -179,7 +179,7 @@ module.exports = function(gulp, flags) {
|
||||
entities = new Entities();
|
||||
|
||||
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
|
||||
function addVariable(variableName, defaultValue, file) {
|
||||
@ -225,7 +225,7 @@ module.exports = function(gulp, flags) {
|
||||
callback();
|
||||
}).on('end', function() {
|
||||
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));
|
||||
}));
|
||||
});
|
||||
|
26
scripts/git/clone.sh
Executable file
26
scripts/git/clone.sh
Executable 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
244
scripts/utils.sh.inc
Normal 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 "$@"
|
Reference in New Issue
Block a user