Skip to content

Commit 6467c76

Browse files
committed
Packagize docker executor and make it work with SDK
1 parent 1e9e43e commit 6467c76

7 files changed

Lines changed: 141 additions & 3 deletions

File tree

‎Dockerfile‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
# Bring in from Mono docker image
22
FROM mcr.microsoft.com/dotnet/core/sdk:2.2
33

4+
RUN apt update && apt install -y mono-devel
5+
46
# Copy over our .NET C# solution skeleton
57
COPY ./src /opt/executor
8+
WORKDIR /opt/executor
9+
10+
# SDK is not public yet
11+
# RUN if [ ! -d "sdk-csharp" ]; then wget -O sdk.tar.gz https://github.com/ProcessMaker/package-csharp/tarball/master; fi
612

7-
# Set working directory to our /opt/executor location
13+
RUN mv sdk-csharp ../
14+
WORKDIR /opt/sdk-csharp
15+
RUN chmod 755 build.sh && ./build.sh
816
WORKDIR /opt/executor
17+
RUN mv ../sdk-csharp/bin . && rm -rf ../sdk-csharp
918

1019
# Install required
1120
#RUN nuget install Newtonsoft.Json -Version 12.0.1

‎composer.json‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "processmaker/docker-executor-csharp",
3+
"friendly_name": "CSharp Docker Executor",
4+
"description": "CSharp script executor for processmaker 4",
5+
"version": "0.0.1",
6+
"minimum-stability": "dev",
7+
"autoload": {
8+
"psr-4": {
9+
"ProcessMaker\\Package\\DockerExecutorCSharp\\": "src",
10+
"ProcessMaker\\ScriptRunners\\": "src/ScriptRunners"
11+
}
12+
},
13+
"extra": {
14+
"laravel": {
15+
"providers": [
16+
"ProcessMaker\\Package\\DockerExecutorCSharp\\DockerExecutorCSharpServiceProvider"
17+
]
18+
}
19+
}
20+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
namespace ProcessMaker\Package\DockerExecutorCSharp;
3+
4+
use Illuminate\Support\Facades\Route;
5+
use Illuminate\Support\ServiceProvider;
6+
use ProcessMaker\Traits\PluginServiceProviderTrait;
7+
use ProcessMaker\Package\Packages\Events\PackageEvent;
8+
use ProcessMaker\Package\WebEntry\Listeners\PackageListener;
9+
10+
class DockerExecutorCSharpServiceProvider extends ServiceProvider
11+
{
12+
use PluginServiceProviderTrait;
13+
14+
const version = '0.0.1'; // Required for PluginServiceProviderTrait
15+
16+
public function register()
17+
{
18+
}
19+
20+
/**
21+
* After all service provider's register methods have been called, your boot method
22+
* will be called. You can perform any initialization code that is dependent on
23+
* other service providers at this time. We've included some example behavior
24+
* to get you started.
25+
*
26+
* See: https://laravel.com/docs/5.6/providers#the-boot-method
27+
*/
28+
public function boot()
29+
{
30+
\Artisan::command('docker-executor-csharp:install', function () {
31+
// nothing to do here
32+
});
33+
34+
$config = [
35+
'name' => 'C#',
36+
'runner' => 'CSharpRunner',
37+
'mime_type' => 'text/plain',
38+
'image' => env('SCRIPTS_CSHARP_IMAGE', 'processmaker4/executor-csharp'),
39+
'options' => [
40+
'packageName' => "ProcessMakerSDK",
41+
]
42+
];
43+
config(['script-runners.csharp' => $config]);
44+
45+
$this->app['events']->listen(PackageEvent::class, PackageListener::class);
46+
47+
// Complete the plugin booting
48+
$this->completePluginBoot();
49+
}
50+
}

‎src/Listeners/PackageListener.php‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace ProcessMaker\Package\DockerExecutorCSharp\Listeners;
4+
5+
use Carbon\Carbon;
6+
use DateTime;
7+
use ProcessMaker\Package\Packages\Events\PackageEvent;
8+
9+
class PackageListener
10+
{
11+
/**
12+
* Gets the attributes from this package and add to event list
13+
* The attributes are read them from composer.json file for this package,
14+
* The especial attribute "expire_in" is getting from ioncube loader function with timezone of the ProcessMaker server
15+
* @param PackageEvent $event
16+
* @return mixed
17+
*/
18+
public function handle(PackageEvent $event){
19+
$composer = json_decode(file_get_contents(__DIR__ . '/../../composer.json'), true);
20+
$expires_on = null;
21+
if(in_array('ionCube Loader', get_loaded_extensions()) && ioncube_file_info())
22+
$expires_on = Carbon::createFromTimestamp(ioncube_file_info()['FILE_EXPIRY'], config('app.timezone'))->format(DateTime::ISO8601);
23+
24+
$infoPackage = [
25+
'name' => $composer['name'],
26+
'friendly_name' => isset($composer['friendly_name']) ? $composer['friendly_name'] : '',
27+
'description' => $composer['description'],
28+
'version' => $composer['version'],
29+
'expires_on' => $expires_on
30+
];
31+
$event->packages->push($infoPackage);
32+
return $event->packages->last();
33+
}
34+
}

‎src/ScriptRunner.cs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public class ScriptRunner
1212
{
1313
static public void Main ()
1414
{
15-
dynamic data = JObject.Parse(File.ReadAllText(@"data.json"));
16-
dynamic config = JObject.Parse(File.ReadAllText(@"config.json"));
15+
dynamic data = JToken.Parse(File.ReadAllText(@"data.json"));
16+
dynamic config = JToken.Parse(File.ReadAllText(@"config.json"));
1717
dynamic output = new JObject();
1818
Script script = new Script();
1919
script.Execute(data, config, output);

‎src/ScriptRunner.csproj‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
<ItemGroup>
99
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
10+
<Reference Include="ProcessMakerSDK">
11+
<HintPath>bin/ProcessMakerSDK.dll</HintPath>
12+
</Reference>
1013
</ItemGroup>
1114

1215
</Project>

‎src/ScriptRunners/CSharpRunner.php‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace ProcessMaker\ScriptRunners;
4+
5+
class CSharpRunner extends Base
6+
{
7+
/**
8+
* Configure docker with C# executor
9+
*
10+
* @param string $code
11+
* @param array $dockerConfig
12+
*
13+
* @return array
14+
*/
15+
public function config($code, array $dockerConfig)
16+
{
17+
$dockerConfig['image'] = config('script-runners.csharp.image');
18+
$dockerConfig['command'] = 'dotnet run';
19+
$dockerConfig['inputs']['/opt/executor/Script.cs'] = $code;
20+
return $dockerConfig;
21+
}
22+
}

0 commit comments

Comments
 (0)