Skip to content
This repository has been archived by the owner on Jun 3, 2021. It is now read-only.

Commit

Permalink
[Travis] Add Lint in TravisCI and Update iOS TravisCI (#2731)
Browse files Browse the repository at this point in the history
Add the following tasks:

* Android Lint
* OCLint
  • Loading branch information
wrmswindmill authored and YorkShen committed Aug 8, 2019
1 parent 0135e3c commit 3bfb619
Show file tree
Hide file tree
Showing 9 changed files with 276 additions and 70 deletions.
117 changes: 99 additions & 18 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
os: linux
language: node_js
node_js: 7.6
node_js: 12.6.0
matrix:
fast_finish: true
include:
Expand All @@ -25,29 +25,63 @@ matrix:
- android-26
- extra-android-m2repository
- env: TEST_SUITE=android ABI=x86
language: android
dist: trusty
jdk: oraclejdk8
android:
components:
- android-26
- extra-android-m2repository
# static check
- env: TEST_SUITE=static_code_analysis OCLINT=true
osx_image: xcode7.2
language: objective-c
- env: TEST_SUITE=static_code_analysis ANDROID_LINT=true
language: android
dist: trusty
jdk: oraclejdk8
android:
components:
- android-26
- extra-android-m2repository

cache:
directories:
- npm
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
- $HOME/.android/build-cache
- $HOME/android-ndk-r18b
- bundle

before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/
- rm -fr $HOME/node_modules/*

before_install:
- |
# install android lint
if [[ ("$TEST_SUITE" = "static_code_analysis") && ("${ANDROID_LINT}" = "true") ]]; then
apt-get install rubygems
gem install bundler
bundle install
fi
# install oclint
if [[ ("$TEST_SUITE" = "static_code_analysis") && ("${OCLINT}" = "true") ]]; then
brew cask uninstall oclint
brew tap oclint/formulae
brew install oclint
fi
install:
- |
case $TEST_SUITE in
"android")
if [[ ("$TEST_SUITE" = "android") || ("${ANDROID_LINT}" = "true") ]]; then
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
nvm install 7.6
nvm install 12.6.0
npm install
echo y | sdkmanager "cmake;3.6.4111459"
if find "${HOME}/android-ndk-r18b" -mindepth 1 | read; then
Expand All @@ -64,11 +98,22 @@ install:
export ANDROID_NDK_HOME=$HOME/android-ndk-r18b
export PATH=$PATH:$ANDROID_NDK_HOME
echo "ndk.dir=$ANDROID_NDK_HOME" > android/local.properties
;;
"jsfm" | "danger" | "ios" )
elif [[ ("$TEST_SUITE" = "jsfm") || ("$TEST_SUITE" = "danger") || ("${OCLINT}" = "true") ]]; then
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
nvm install 12.6.0
npm install
;;
esac
elif [[ ("$TEST_SUITE" = "ios") ]]; then
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
nvm install 12.6.0
git submodule update --init --remote
cd weex-playground/ios && bash update_podfile_for_travisci.sh
cd ../../ && npm install
cd weex-playground/ios && pod install --repo-update
cd ../../
fi
script:
- |
case $TEST_SUITE in
Expand All @@ -87,29 +132,65 @@ script:
GRADLE_ABI=""
;;
esac
hasAndroidFile=$(npm run danger -- run --dangerfile ./dangerfile-android.js)
echo "The value of hasAndroidFile is ${hasAndroidFile}"
if [[ "$hasAndroidFile" =~ "hasAndroidFile" ]]; then
if npm run danger -- ci --dangerfile ./dangerfile-android.js | grep -q "hasAndroidFile" ; then
cd android
./gradlew clean install -PbuildRuntimeApi=true ${GRADLE_ABI} --info
./gradlew install -PbuildRuntimeApi=false ${GRADLE_ABI} --info
fi
;;
"jsfm" )
npm run danger -- run --dangerfile ./dangerfile-jsfm.js
npm run danger -- ci -i jsfm --dangerfile ./dangerfile-jsfm.js
;;
"danger" )
npm run danger -- run --dangerfile ./dangerfile.js
npm run danger -- ci -i danger --dangerfile ./dangerfile.js
;;
"ios" )
hasIosFile=$(npm run danger -- run --dangerfile ./dangerfile-ios.js)
echo "The value of hasIosFile is ${hasIosFile}"
if [[ "$hasIosFile" =~ "hasIosFile" ]]; then
xcodebuild -project ios/sdk/WeexSDK.xcodeproj test -scheme WeexSDKTests CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -destination "platform=iOS Simulator,name=iPhone 6"
if npm run danger -- ci --dangerfile ./dangerfile-ios.js | grep -q "hasIosFile" ; then
# build WeexSDK and run WeexSDKTests
xcodebuild -quiet -project ios/sdk/WeexSDK.xcodeproj test -scheme WeexSDKTests CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -destination "platform=iOS Simulator,name=iPhone 6" || exit 1
# build WeexDemo and run WeexDemo test
cd weex-playground/ios && mkdir tmp && mv * tmp;cd tmp
xcodebuild -quiet -workspace WeexDemo.xcworkspace test -scheme WeexDemo CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -destination "platform=iOS Simulator,name=iPhone 6" || exit 1
fi
;;
esac
if [[ ("$TEST_SUITE" = "static_code_analysis") && ("${OCLINT}" = "true") ]]; then
if npm run danger -- ci --dangerfile ./dangerfile-static-check.js | grep -q "hasCFile" ; then
echo "hasCFile"
cd ios/sdk && xcodebuild | xcpretty -r json-compilation-database -o compile_commands.json
oclint-json-compilation-database oclint_args -- \
-disable-rule=ShortVariableName \
-disable-rule=LongLine \
-disable-rule=LongMethod \
-disable-rule=HighNcssMethod \
-disable-rule=LongVariableName \
-disable-rule=HighCyclomaticComplexity \
-disable-rule=HighNPathComplexity \
-disable-rule=UnusedLocalVariable \
-disable-rule=DoubleNegative \
-disable-rule=MultipleUnaryOperator \
-disable-rule=DeepNestedBlock \
-disable-rule=AssignIvarOutsideAccessors \
-disable-rule=BitwiseOperatorInConditional \
-max-priority-1=15000 \
-max-priority-2=15000 \
-max-priority-3=15000 > oclint.log
export TITLE="OCLint Result"
cd ../../ && npm run danger -- ci -i oclint --dangerfile ./dangerfile-output.js
fi
fi
if [[ ("$TEST_SUITE" = "static_code_analysis") && ("${ANDROID_LINT}" = "true") ]]; then
if npm run danger -- ci --dangerfile ./dangerfile-static-check.js | grep -q "hasAndroidFile" ; then
echo "hasAndroidFile"
cd android
./gradlew :weex_sdk:lint --quiet
export TITLE="AndroidLint Result"
cd ../ && npm run danger -- ci -i androidlint --dangerfile ./dangerfile-output.js
fi
fi
notifications:
webhooks:
on_pull_requests: false
Expand Down
Empty file added Dangerfile
Empty file.
21 changes: 2 additions & 19 deletions dangerfile-ios.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,22 +90,5 @@ if (!hasIosFile && danger.git.deleted_files) {
}

if(hasIosFile){
console.log('hasIosFile');
}
// console.log('-----------------------------hasIosFile-----------------------------:'+hasIosFile);
// if(hasIosFile){
// var runTestCmd='source ~/.bash_profile; '
// +'xcodebuild -project ios/sdk/WeexSDK.xcodeproj test '
// +'-scheme WeexSDKTests CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO '
// +'-destination "platform=iOS Simulator,name=iPhone 6"'
// runSuccess = shell.exec(runTestCmd,{ async: false, timeout: 8 * 60 * 1000, maxBuffer: 200 * 1024 * 1024 }).code == 0;
// if(!runSuccess){
// fail("ios platform run unit test failed!");
// }
// }else{
// console.log('has no ios file changed.');
// message('has no ios file changed.');
// }
// message('ios test finished.')


console.log('hasIosFile!!!');
}
71 changes: 71 additions & 0 deletions dangerfile-output.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

import { fail, warn } from 'danger'
const shell = require('shelljs')
const title = process.env.TITLE
const fs = require('fs')

// code come from: https://stackoverflow.com/a/12745196
// get the index of nth char in string
function nth_occurrence (string, char, nth) {
var first_index = string.indexOf(char)
var length_up_to_first_index = first_index + 1
if (nth === 1) {
return first_index;
} else {
var string_after_first_occurrence = string.slice(length_up_to_first_index);
var next_occurrence = nth_occurrence(string_after_first_occurrence, char, nth - 1);
if (next_occurrence === -1) {
return -1;
} else {
return length_up_to_first_index + next_occurrence;
}
}
}

if (title === 'OCLint Result') {
const command = 'cat ios/sdk/oclint.log | grep -i "P[1|2]"'
const child = shell.exec(command)
if (child.stdout !== '') {
fail(child.stdout)
fail(title)
}
if (child.stderr !== '') {
fail(child.stderr)
fail(title)
}
}
else if (title === 'AndroidLint Result') {
var content = fs.readFileSync('android/sdk/build/reports/lint-results.html', 'utf8')
// in xml report,Overview Section,Disabled Checks Section and Suppressing Warnings and Errors Section is not reported.
// in html report, those Section are included,
// but Overview Section can't work in markdown,
// on the other hand,Disabled Checks Section and Suppressing Warnings and Errors Section are not needed.
// the first section is Overview section,
// the last two section are Disabled Checks Section and Suppressing Warnings and Errors Section.
// so we should grep the str from the second <section to the third </section> from last"
const occurance = content.split('</section>').length - 1
if (occurance > 3) {
content = content.substr(nth_occurrence(content, '<section ', 2))
content = content.substr(0, nth_occurrence(content, '</section>', occurance - 3))
fail(content)
fail(title)
}
}
89 changes: 89 additions & 0 deletions dangerfile-static-check.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

import { danger } from "danger";
import fs from "fs";
import path from 'path';
import GitHubApi from 'github';
import parseDiff from 'parse-diff';
import shell from "shelljs";

const type_unknown = 0;
const type_c = 1;
const type_android = 2;

const getFileType = file => {
if (file.match(/.+\.(m|h|mm|cpp|cc)/)) {
return type_c;
} else if (file.match(/android/)) {
return type_android;
} else {
return type_unknown;
}
}

var hasCFile = false;
var hasAndroidFile = false;

function check(file_type) {
var has_file_type = false;
if (!has_file_type && danger.git.created_files) {
danger.git.created_files.some(file => {
var f = (getFileType(file) == file_type)
if (f) {
has_file_type = f;
}
return f;
});
}

if (!has_file_type && danger.git.modified_files) {
danger.git.modified_files.some(file => {
var f = (getFileType(file) == file_type)
if (f) {
has_file_type = f;
}
return f;
});
}

if (!has_file_type && danger.git.deleted_files) {
danger.git.deleted_files.some(file => {
var f = (getFileType(file) == file_type)
if (f) {
has_file_type = f;
}
return f;
});
}

return has_file_type
}

hasCFile = check(type_c)
hasAndroidFile = check(type_android)

var output_str = ""
if (hasCFile) {
output_str += 'hasCFile\n'
}
if (hasAndroidFile) {
output_str += 'hasAndroidFile\n'
}
console.log(output_str)
1 change: 1 addition & 0 deletions ios/sdk/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*compile_commands.json
4 changes: 2 additions & 2 deletions ios/sdk/WeexSDK/Sources/Utility/WXVersion.m
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
#import "WXVersion.h"
#import "WXDefine.h"

static const char* WeexSDKBuildTime = "2019-07-16 07:08:34 UTC";
static const unsigned long WeexSDKBuildTimestamp = 1563260914;
static const char* WeexSDKBuildTime = "2019-07-21 09:08:41 UTC";
static const unsigned long WeexSDKBuildTimestamp = 1563700121;

NSString* GetWeexSDKVersion(void)
{
Expand Down
Loading

0 comments on commit 3bfb619

Please sign in to comment.