Skip to content
Snippets Groups Projects
Commit 673f65be authored by murgatroid99's avatar murgatroid99
Browse files

Add working Node artifact builder for all platforms

parent ed00b036
No related branches found
No related tags found
No related merge requests found
...@@ -44,7 +44,10 @@ ...@@ -44,7 +44,10 @@
], ],
'conditions': [ 'conditions': [
['OS == "win"', { ['OS == "win"', {
"include_dirs": [ "third_party/boringssl/include" ], "include_dirs": [
"third_party/boringssl/include",
"third_party/zlib"
],
"defines": [ "defines": [
'_WIN32_WINNT=0x0600', '_WIN32_WINNT=0x0600',
'WIN32_LEAN_AND_MEAN', 'WIN32_LEAN_AND_MEAN',
...@@ -63,19 +66,20 @@ ...@@ -63,19 +66,20 @@
"ws2_32" "ws2_32"
] ]
}, { # OS != "win" }, { # OS != "win"
'variables': {
'config': '<!(echo $CONFIG)',
# The output of "node --version" is "v[version]". We use cut to
# remove the first character.
'target%': '<!(node --version | cut -c2-)'
},
# Empirically, Node only exports ALPN symbols if its major version is >0. # Empirically, Node only exports ALPN symbols if its major version is >0.
# io.js always reports versions >0 and always exports ALPN symbols. # io.js always reports versions >0 and always exports ALPN symbols.
# Therefore, Node's major version will be truthy if and only if it # Therefore, Node's major version will be truthy if and only if it
# supports ALPN. The output of "node -v" is v[major].[minor].[patch], # supports ALPN. The target is "[major].[minor].[patch]". We split by
# like "v4.1.1" in a recent version. We use cut to split by period and # periods and take the first field to get the major version.
# take the first field (resulting in "v[major]"), then use cut again
# to take all but the first character, removing the "v".
'defines': [ 'defines': [
'TSI_OPENSSL_ALPN_SUPPORT=<!(node --version | cut -d. -f1 | cut -c2-)' 'TSI_OPENSSL_ALPN_SUPPORT=<!(echo <(target) | cut -d. -f1)'
], ],
'variables': {
'config': '<!(echo $CONFIG)'
},
'include_dirs': [ 'include_dirs': [
'<(node_root_dir)/deps/openssl/openssl/include', '<(node_root_dir)/deps/openssl/openssl/include',
'<(node_root_dir)/deps/zlib' '<(node_root_dir)/deps/zlib'
...@@ -731,7 +735,8 @@ ...@@ -731,7 +735,8 @@
'xcode_settings': { 'xcode_settings': {
'MACOSX_DEPLOYMENT_TARGET': '10.9', 'MACOSX_DEPLOYMENT_TARGET': '10.9',
'OTHER_CFLAGS': [ 'OTHER_CFLAGS': [
'-stdlib=libc++' '-stdlib=libc++',
'-std=c++11'
] ]
} }
}], }],
......
...@@ -46,7 +46,10 @@ ...@@ -46,7 +46,10 @@
], ],
'conditions': [ 'conditions': [
['OS == "win"', { ['OS == "win"', {
"include_dirs": [ "third_party/boringssl/include" ], "include_dirs": [
"third_party/boringssl/include",
"third_party/zlib"
],
"defines": [ "defines": [
'_WIN32_WINNT=0x0600', '_WIN32_WINNT=0x0600',
'WIN32_LEAN_AND_MEAN', 'WIN32_LEAN_AND_MEAN',
...@@ -65,19 +68,20 @@ ...@@ -65,19 +68,20 @@
"ws2_32" "ws2_32"
] ]
}, { # OS != "win" }, { # OS != "win"
'variables': {
'config': '<!(echo $CONFIG)',
# The output of "node --version" is "v[version]". We use cut to
# remove the first character.
'target%': '<!(node --version | cut -c2-)'
},
# Empirically, Node only exports ALPN symbols if its major version is >0. # Empirically, Node only exports ALPN symbols if its major version is >0.
# io.js always reports versions >0 and always exports ALPN symbols. # io.js always reports versions >0 and always exports ALPN symbols.
# Therefore, Node's major version will be truthy if and only if it # Therefore, Node's major version will be truthy if and only if it
# supports ALPN. The output of "node -v" is v[major].[minor].[patch], # supports ALPN. The target is "[major].[minor].[patch]". We split by
# like "v4.1.1" in a recent version. We use cut to split by period and # periods and take the first field to get the major version.
# take the first field (resulting in "v[major]"), then use cut again
# to take all but the first character, removing the "v".
'defines': [ 'defines': [
'TSI_OPENSSL_ALPN_SUPPORT=<!(node --version | cut -d. -f1 | cut -c2-)' 'TSI_OPENSSL_ALPN_SUPPORT=<!(echo <(target) | cut -d. -f1)'
], ],
'variables': {
'config': '<!(echo $CONFIG)'
},
'include_dirs': [ 'include_dirs': [
'<(node_root_dir)/deps/openssl/openssl/include', '<(node_root_dir)/deps/openssl/openssl/include',
'<(node_root_dir)/deps/zlib' '<(node_root_dir)/deps/zlib'
...@@ -218,7 +222,8 @@ ...@@ -218,7 +222,8 @@
'xcode_settings': { 'xcode_settings': {
'MACOSX_DEPLOYMENT_TARGET': '10.9', 'MACOSX_DEPLOYMENT_TARGET': '10.9',
'OTHER_CFLAGS': [ 'OTHER_CFLAGS': [
'-stdlib=libc++' '-stdlib=libc++',
'-std=c++11'
] ]
} }
}], }],
......
...@@ -58,6 +58,11 @@ RUN apt-get update && apt-get install -y \ ...@@ -58,6 +58,11 @@ RUN apt-get update && apt-get install -y \
wget \ wget \
zip && apt-get clean zip && apt-get clean
# Install Node dependencies
RUN touch .profile
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
RUN /bin/bash -l -c "nvm install 4 && npm install -g node-pre-gyp"
RUN mkdir /var/local/jenkins RUN mkdir /var/local/jenkins
# Define the default command. # Define the default command.
......
...@@ -58,6 +58,11 @@ RUN apt-get update && apt-get install -y \ ...@@ -58,6 +58,11 @@ RUN apt-get update && apt-get install -y \
wget \ wget \
zip && apt-get clean zip && apt-get clean
# Install Node dependencies
RUN touch .profile
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
RUN /bin/bash -l -c "nvm install 4 && npm install -g node-pre-gyp"
RUN mkdir /var/local/jenkins RUN mkdir /var/local/jenkins
# Define the default command. # Define the default command.
......
...@@ -38,4 +38,6 @@ git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc ...@@ -38,4 +38,6 @@ git clone --recursive /var/local/jenkins/grpc /var/local/git/grpc
cd /var/local/git/grpc cd /var/local/git/grpc
nvm use 4
$RUN_COMMAND $RUN_COMMAND
...@@ -62,7 +62,7 @@ def create_jobspec(name, cmdline, environ=None, shell=False, ...@@ -62,7 +62,7 @@ def create_jobspec(name, cmdline, environ=None, shell=False,
cmdline=cmdline, cmdline=cmdline,
environ=environ, environ=environ,
shortname='build_artifact.%s' % (name), shortname='build_artifact.%s' % (name),
timeout_seconds=5*60, timeout_seconds=10*60,
flake_retries=flake_retries, flake_retries=flake_retries,
timeout_retries=timeout_retries, timeout_retries=timeout_retries,
shell=shell) shell=shell)
...@@ -126,12 +126,45 @@ class CSharpExtArtifact: ...@@ -126,12 +126,45 @@ class CSharpExtArtifact:
def __str__(self): def __str__(self):
return self.name return self.name
node_gyp_arch_map = {
'x86': 'ia32',
'x64': 'x64'
}
class NodeExtArtifact:
"""Builds Node native extension"""
def __init__(self, platform, arch):
self.name = 'node_ext_{0}_{1}'.format(platform, arch)
self.platform = platform
self.arch = arch
self.gyp_arch = node_gyp_arch_map[arch]
self.labels = ['artifact', 'node', platform, arch]
def pre_build_jobspecs(self):
return []
def build_jobspec(self):
if self.platform == 'windows':
return create_jobspec(self.name,
['tools\\run_tests\\build_artifact_node.bat',
self.gyp_arch],
shell=True)
else:
if self.platform == 'linux':
return create_docker_jobspec(
self.name,
'tools/dockerfile/grpc_artifact_linux_{}'.format(self.arch),
'tools/run_tests/build_artifact_node.sh {}'.format(self.gyp_arch))
else:
return create_jobspec(self.name,
['tools/run_tests/build_artifact_node.sh',
self.gyp_arch])
def targets(): def targets():
"""Gets list of supported targets""" """Gets list of supported targets"""
return [CSharpExtArtifact('linux', 'x86'), return [Cls(platform, arch)
CSharpExtArtifact('linux', 'x64'), for Cls in (CSharpExtArtifact, NodeExtArtifact)
CSharpExtArtifact('macos', 'x86'), for platform in ('linux', 'macos', 'windows')
CSharpExtArtifact('macos', 'x64'), for arch in ('x86', 'x64')]
CSharpExtArtifact('windows', 'x86'),
CSharpExtArtifact('windows', 'x64')]
@rem Copyright 2016, Google Inc.
@rem All rights reserved.
@rem
@rem Redistribution and use in source and binary forms, with or without
@rem modification, are permitted provided that the following conditions are
@rem met:
@rem
@rem * Redistributions of source code must retain the above copyright
@rem notice, this list of conditions and the following disclaimer.
@rem * Redistributions in binary form must reproduce the above
@rem copyright notice, this list of conditions and the following disclaimer
@rem in the documentation and/or other materials provided with the
@rem distribution.
@rem * Neither the name of Google Inc. nor the names of its
@rem contributors may be used to endorse or promote products derived from
@rem this software without specific prior written permission.
@rem
@rem THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
@rem "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@rem LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@rem A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
@rem OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
@rem SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
@rem LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
@rem DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
@rem THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
@rem (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
@rem OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
set node_versions=0.10.41 0.12.0 1.0.0 1.1.0 2.0.0 3.0.0 4.0.0 5.0.0
set PATH=%PATH%;C:\Program Files\nodejs\;%APPDATA%\npm
del /f /q BUILD || rmdir build /s /q
call npm update || goto :error
mkdir artifacts
for %%v in (%node_versions%) do (
call node-pre-gyp configure build --target=%%v --target_arch=%1
@rem Try again after removing openssl headers
rmdir "%HOMEDRIVE%%HOMEPATH%\.node-gyp\%%v\include\node\openssl" /S /Q
rmdir "%HOMEDRIVE%%HOMEPATH%\.node-gyp\iojs-%%v\include\node\openssl" /S /Q
call node-pre-gyp build package testpackage --target=%%v --target_arch=%1 || goto :error
xcopy /Y /I /S build\stage\* artifacts\ || goto :error
)
if %errorlevel% neq 0 exit /b %errorlevel%
goto :EOF
:error
exit /b 1
\ No newline at end of file
#!/bin/bash
# Copyright 2016, Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
set -ex
cd $(dirname $0)/../..
rm -rf build
mkdir -p artifacts
npm update
node_versions=( 0.10.41 0.12.0 1.0.0 1.1.0 2.0.0 3.0.0 4.0.0 5.0.0 )
for version in ${node_versions[@]}
do
node-pre-gyp configure rebuild package testpackage --target=$version --target_arch=$1
cp -r build/stage/* artifacts/
done
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment