Skip to content

Commit

Permalink
Merge pull request #31 from navarasu/fix_18_ci_support
Browse files Browse the repository at this point in the history
#18 Handled docker inside docker scenario to support ci
  • Loading branch information
navarasu committed Dec 20, 2020
2 parents da56400 + d16e070 commit ad81695
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 52 deletions.
4 changes: 3 additions & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ jobs:
- image: cimg/ruby:2.5-node
steps:
- checkout
- setup_remote_docker:
version: 19.03.13
- node/install-packages
- run: sudo npm install -g serverless
- run: sudo chown -R circleci:circleci /home/circleci/project/
Expand Down Expand Up @@ -47,4 +49,4 @@ workflows:
tags:
only: /v[0-9]+(\.[0-9]+)*/
branches:
ignore: /.*/
ignore: /.*/
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
service: using-docker
service: use-docker

plugins:
- serverless-ruby-layer

custom:
rubyLayer:
use_docker: true
Expand Down
20 changes: 12 additions & 8 deletions lib/bundle.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,23 +81,27 @@ function bundleInstall(){
docker_name ='ruby-layer:docker'
docker(['build', '-t', docker_name, '-f', 'Dockerfile', '.'], options,this.cli)
}

let docker_id = Date.now().toString(36) + '-'+Math.random().toString(36).slice(2, 15)
ps=docker(['run','-it','--name',docker_id,'-d', docker_name,'/bin/bash'], options,this.cli)
container_id = ps.stdout.toString().trim()
console.log(container_id)
if (this.options.native_libs) {
this.cli.log("Packing the native libraries from the specified path")
ps=docker(['run', '-d', docker_name, 'false'], options,this.cli)
container_id = ps.stdout.toString().trim()
const lib_path = path.join(this.build_path,'lib')
fs.mkdirSync(lib_path)
this.options.native_libs.forEach(lib_to_copy => {
ps=docker(['cp','-L', container_id+':'+lib_to_copy, lib_path],options,this.cli)
})
}

this.cli.log("Installing gem using docker bundler")
args=['run','--rm', '-i','-v', `${this.ruby_layer}:/var/gem_build`, '-w', '/var/gem_build']
args.push(docker_name)

docker(args.concat(bundle_args), options,this.cli)
this.docker_gem_path = '/var/gem_build'
docker(['exec', docker_id, 'mkdir', this.docker_gem_path], options, this.cli)
docker(['cp', '-L', 'Gemfile', container_id+':'+this.docker_gem_path], options,this.cli)
this.cli.log('check')
docker(['exec','-w',this.docker_gem_path, docker_id].concat(bundle_args),options,this.cli)
docker(['cp', '-L', container_id+':'+this.docker_gem_path+'/build/ruby', this.build_path], options, this.cli)
docker(['stop', container_id], options, this.cli)
docker(['rm',docker_id], options, this.cli)
} else {
ps = runCommand("bundle",['-v'], options, this.cli)
if (ps.error && ps.error.code === 'ENOENT') {
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

85 changes: 45 additions & 40 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,18 @@ const path = require('path');
const fs = require('fs-extra');
const { runCommand,readZip } = require('./helper');

let test_data = [

{ folder: 'basic', gem_zip_dirs: ['/','/bin/','/build_info/','/doc/','/extensions/', '/gems/',
'/specifications/','/gems/httparty/', '/gems/mime-types-data/', '/gems/multi_xml/', '/gems/mime-types/'], },

{ folder: 'use-docker', gem_zip_dirs: [ '/', '/bin/', '/build_info/', '/doc/', '/extensions/', '/gems/',
'/specifications/', '/extensions/x86_64-linux/', '/gems/addressable/', '/gems/domain_name/', '/gems/ffi/',
'/gems/ffi-compiler/', '/gems/http/', '/gems/http-cookie/', '/gems/http-form_data/', '/gems/http-parser/',
'/gems/mini_portile2/', '/gems/nokogiri/', '/gems/public_suffix/', '/gems/rake/', '/gems/unf/', '/gems/unf_ext/' ], },

]

describe('serverless package', function () {
before(function () {
this.timeout(60000);
Expand All @@ -12,45 +24,38 @@ describe('serverless package', function () {
fs.removeSync(this.test_path)
fs.copySync('examples',this.test_path)
})
it('should bundle gem and configure layer ', function () {
this.timeout(60000);
let context_path = path.join(this.test_path,'basic')
options= {cwd: context_path, encoding : 'utf8'}
runCommand('npm',['link','serverless-ruby-layer'],options)
runCommand('slss',['package'],options)
let dot_serverless_path = path.join(context_path,'.serverless')
let layer_zip_path = path.join(dot_serverless_path,'ruby_layer','gemLayer.zip')
let function_zip_path = path.join(dot_serverless_path,'basic.zip')
value = readZip(function_zip_path)
.then(function(data){
assert.deepEqual(['handler.rb'],data)
})
run_time ='2.5'
value = readZip(layer_zip_path)
.then(function(data){
assert.deepEqual(['/','/bin/','/build_info/','/doc/','/extensions/',
'/gems/','/specifications/','/gems/httparty-0.18.1/',
'/gems/mime-types-3.3.1/','/gems/multi_xml-0.6.0/',
'/gems/mime-types-data-3.2020.0512/']
.map(data => 'ruby/'+run_time+'.0'+data).concat(['ruby/']).sort(),
data.sort())
})
let rawdata = fs.readFileSync(path.join(dot_serverless_path,'serverless-state.json'));
let serverless_config = JSON.parse(rawdata);
let layers = serverless_config['service']['layers']
const {package, ...other_layer_conf} = layers['gem']
assert.deepEqual(package['artifact'],path.resolve(layer_zip_path))
assert.deepEqual(other_layer_conf,{ name: 'basic-dev-ruby-bundle', description: 'Ruby gem generated by serverless-ruby-bundler',
compatibleRuntimes: [ 'ruby'+run_time ]})
assert.deepEqual(serverless_config['service']['artifact'],path.resolve(function_zip_path))
cloud_resource = serverless_config['service']['provider']['compiledCloudFormationTemplate']['Resources']
const {Content, ...others} = cloud_resource['GemLambdaLayer']['Properties']
assert.deepEqual(others,{CompatibleRuntimes: ['ruby2.5'],
Description: 'Ruby gem generated by serverless-ruby-bundler',
LayerName: 'basic-dev-ruby-bundle'
})
assert.deepEqual(cloud_resource['HelloLambdaFunction']['Properties']['Layers'],[ { Ref: 'GemLambdaLayer' } ])
assert.deepEqual(cloud_resource['HelloLambdaFunction']['Properties']['Environment'],
{Variables: { GEM_PATH: '/opt/ruby/'+run_time+'.0'}})

test_data.forEach(({folder, gem_zip_dirs}) => {
it (`should bundle gem and configure layer for ${folder} example`, function() {
this.timeout(240000);
let context_path = path.join(this.test_path, folder)
options= {cwd: context_path, encoding : 'utf8'}
runCommand('npm',['link','serverless-ruby-layer'],options)
runCommand('serverless',['package'],options)
let dot_serverless_path = path.join(context_path,'.serverless')
let layer_zip_path = path.join(dot_serverless_path,'ruby_layer','gemLayer.zip')
let function_zip_path = path.join(dot_serverless_path,`${folder}.zip`)
value = readZip(function_zip_path)
.then(function(data){
assert.deepEqual(['handler.rb'],data)
})
run_time ='2.5'
value = readZip(layer_zip_path)
.then(function(data){
assert.deepEqual(gem_zip_dirs.map(data => data.startsWith('lib')? data : 'ruby/'+run_time+'.0'+data).concat(['ruby/']).sort(),
data.map(data => data.replace(/-\d.*\d/g, '')).sort())
})
let serverless_config = JSON.parse(fs.readFileSync(path.join(dot_serverless_path,'serverless-state.json')));
assert.deepEqual(serverless_config['service']['layers']['gem']['package']['artifact'], path.resolve(layer_zip_path))
cloud_resource = serverless_config['service']['provider']['compiledCloudFormationTemplate']['Resources']
const {Content, ...others} = cloud_resource['GemLambdaLayer']['Properties']
assert.deepEqual(others,{CompatibleRuntimes: ['ruby2.5'],
Description: 'Ruby gem generated by serverless-ruby-bundler',
LayerName: `${folder}-dev-ruby-bundle`
})
assert.deepEqual(cloud_resource['HelloLambdaFunction']['Properties']['Layers'],[ { Ref: 'GemLambdaLayer' } ])
assert.deepEqual(cloud_resource['HelloLambdaFunction']['Properties']['Environment'],
{Variables: { GEM_PATH: '/opt/ruby/'+run_time+'.0'}})
})
});
});

0 comments on commit ad81695

Please sign in to comment.