-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcreating_bia_workflow_and_adding_to_biaflows_instance.html
501 lines (479 loc) · 33.1 KB
/
creating_bia_workflow_and_adding_to_biaflows_instance.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
<!DOCTYPE html>
<html lang="en">
<head>
<title>Creating a BIA workflow and adding it to a BIAFLOWS instance</title>
<!-- Meta -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<link rel="shortcut icon" href="favicon.ico">
<link href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800'
rel='stylesheet' type='text/css'>
<!-- FontAwesome JS -->
<script defer src="https://use.fontawesome.com/releases/v5.8.2/js/all.js"
integrity="sha384-DJ25uNYET2XCl5ZF++U8eNxPWqcKohUUBUpKGlNLMchM7q4Wjg2CUpjHLaL8yYPH"
crossorigin="anonymous"></script>
<!-- Global CSS -->
<link rel="stylesheet" href="assets/plugins/bootstrap/css/bootstrap.min.css">
<!-- Plugins CSS -->
<link rel="stylesheet" href="assets/plugins/prism/prism.css">
<link rel="stylesheet" href="assets/plugins/elegant_font/css/style.css">
<!-- Theme CSS -->
<link id="theme-style" rel="stylesheet" href="assets/css/styles.css">
</head>
<body class="body-pink">
<div class="page-wrapper">
<!-- ******Header****** -->
<header id="header" class="header">
<div class="container">
<div class="branding">
<h1 class="logo">
<a href="index.html">
<span aria-hidden="true" class="icon_documents_alt icon"></span>
<span class="text-highlight">BIA</span><span class="text-bold">FLOWS</span>
</a>
</h1>
</div>
</div><!--//container-->
</header><!--//header-->
<div class="doc-wrapper">
<div class="container">
<div id="doc-header" class="doc-header text-center">
<h1 class="doc-title">Creating a BIA workflow and adding it to a BIAFLOWS instance</h1>
<div class="meta"><i class="far fa-clock"></i> Last updated: March 18st, 2020</div>
</div>
<!--//doc-header-->
<div class="doc-body row">
<div class="doc-content col-md-9 col-12 order-1">
<div class="content-inner">
<section id="introduction-section" class="doc-section">
<h2 class="section-title">Introduction</h2>
<span style="color:#fe7f7f;">BIA</span>FLOWS workflows are Docker images encapsulating a complete
execution environment together with a workflow addressing a BIA Problem.
These Docker images can be compiled automatically online. <span style="color:#fe7f7f;">BIA</span>FLOWS
instances automatically fetch new workflows and make them available from the user interface.
Sample workflows running in ImageJ (macros and scripts),
ICY, CellProfiler, ilastik, Vaa3D, Python, Octave and Jupyter notebooks can be found in this
GitHub repository:
<a href="https://github.com/neubias-wg5" target="_blank">https://github.com/neubias-wg5</a>.
The procedure to package a workflow and add it to a <span style="color:#fe7f7f;">BIA</span>FLOWS
instance is described in this section. Users wishing to get help can write to
<a href="https://forum.image.sc">https://forum.image.sc</a> forum or contact
<a href="mailto:biaflows@neubias.org">biaflows@neubias.org</a>.
</section><!--//doc-section-->
<section id="requirement-section" class="doc-section">
<h2 class="section-title">BIA workflow requirements</h2>
<br/>
<h3>Accounts requirement:</h3>
<span>In order to create a new workflow, you will need to have:</span>
<ul>
<li>A <a href="https://github.com/" target="_blank">Github account</a>, to store the code of the workflow and build it as a Docker image</li>
<li>A <a href="https://hub.docker.com/" target="_blank">DockerHub account</a>, to store the Docker image and make it available online</li>
</ul>
<h3>BIAFLOWS workflows must:</h3>
<ul>
<li>Run headless from command line</li>
<li>Take an input folder of 8 bit/16 bit TIFF (2D) or single file OME-TIFF (C,Z,T) images</li>
<li>Expose functional parameters and parse them from command line call</li>
<li>Export results to an output folder in a format specified for the Problem Class
(see <a href="/problem_class_ground_truth.html">Problem Class, ground truth annotations and reported metrics</a>).</li>
</ul>
<p>
N.B.: have a look at the worflow <a href="https://github.com/Neubias-WG5/W_NucleiSegmentation-ImageJ/blob/master/.github/workflows/docker-image.yml" target="_blank">W_NucleiSegmentation-ImageJ</a> to see an example of workflow
</p>
The workflow and its software execution environment are fully defined from a set of 5 files:
<ul>
<li>A <a href="https://github.com/Neubias-WG5/W_NucleiSegmentation-ImageJ/blob/master/Dockerfile" target="_blank">Dockerfile</a> configuring software execution environment (OS, libraries, software...)</li>
<li>The workflow executable or, more commonly, a <a href="https://github.com/Neubias-WG5/W_NucleiSegmentation-ImageJ/blob/master/macro.ijm" target="_blank">script</a> running on a BIA platform</li>
<li>A Python script (<a href="https://github.com/Neubias-WG5/W_NucleiSegmentation-ImageJ/blob/master/wrapper.py" target="_blank">wrapper.py</a>), sequencing operations (Docker image entry point)</li>
<li>A descriptor (<a href="https://github.com/Neubias-WG5/W_NucleiSegmentation-ImageJ/blob/master/descriptor.json" target="_blank">descriptor.json</a>) specifying workflow parameters and default values.</li>
<li>A <a href="https://github.com/Neubias-WG5/W_NucleiSegmentation-ImageJ/blob/master/.github/workflows" target="_blank">.github/workflows</a> directory containing a <a href="https://github.com/Neubias-WG5/W_NucleiSegmentation-ImageJ/blob/master/.github/workflows/docker-image.yml" target="_blank">docker-image.yml</a> script identical for all the workflows</li>
</ul>
<div class="callout-block callout-info">
<div class="icon-holder">
<svg class="svg-inline--fa fa-info-circle fa-w-16" aria-hidden="true"
focusable="false" data-prefix="fas" data-icon="info-circle" role="img"
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" data-fa-i2svg="">
<path fill="currentColor"
d="M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z"></path>
</svg><!-- <i class="fas fa-info-circle"></i> -->
</div><!--//icon-holder-->
<div class="content">
<p>
A wizard is available to add new workflows. This tool is useful if you plan
to add a new workflow for an existing BIA problem class and target BIA platform
(e.g. Object segmentation 2D + ImageJ).
</p>
<p>
Please refer to:
<a href="https://github.com/Neubias-WG5/biaflows-workflow-utilities" target="_blank">https://github.com/Neubias-WG5/biaflows-workflow-utilities</a> for details.</p>
<p><b>When using an existing workflow as template, check that this workflow
uses the latest versions of biaflows libraries. For this, refer to this
<a href="https://docs.google.com/document/d/1NltQauJAbO4RGDHBR-NRgd_fs2FCDlmtda9m_XlFryI/edit" target="_blank">guide</a>.
</b>
</p>
</div><!--//content-->
</div>
</section>
<section id="workflow-section" class="doc-section">
<h2 class="section-title">Workflow creation</h2>
<div id="workflow_step1" class="section-block">
<h4>1. Create a workflow GitHub repository and add trusted source</h4>
<p>
Create a workflow repository in a GitHub source trusted by the BIAFLOWS
instance you plan to add the workflow to. The names of workflow repositories
should start by a fixed prefix (<b>W_</b> recommended since it is the convention used by
BIAFLOWS online instance) and contain no space.
</p>
<p>
Connect to your local BIAFLOWS server (or sandbox server), click on <b>Workflows</b> tab and make
sure that your GitHub and DockerHub accounts are added as trusted sources at the bottom of the page.
For this, use the <b>New trusted source</b> button and fill in the information of your GitHub and DockerHub user accounts. Also set a <b>Prefix</b> matching the one you plan to use for your GitHub workflow repositories (e.g. <b>W_</b>).
</p>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_biaflow_user_guide_benchmark_layout_trustedsource.png" alt="screenshot">
</div>
</div>
<div id="workflow_step2" class="section-block">
<h4>2. Add the required files to the workflow repository</h4>
<p>
It is recommended to reuse existing files from similar workflow repositories.
The following workflow types have already been tested: ImageJ / FIJI macro, ImageJ Python script, ICY protocol, CellProfiler pipeline,
Octave script, ilastik pipeline, Vaa3D plugin, Python 2.X or 3.X script based on
Scikit-learn, Keras, Pytorch and MXNet.
</p>
<p>
They are all available from:
<a href="https://github.com/Neubias-WG5">https://github.com/Neubias-WG5</a>
</p>
<p>
The necessary files are:
</p>
<ul>
<li>A descriptor from the <a href="/problem_class_ground_truth.html">Problem Class</a>
you target (e.g. Object Segmentation)</li>
<li>A DockerFile configuring the BIA platform you target (e.g ImageJ)</li>
<li>A wrapper script from the <a href="/problem_class_ground_truth.html">Problem Class</a> and the workflow type you target.</li>
<li>A file holding the workflow code (e.g. an ImageJ macro), unless some code is directly called from the wrapper script.</li>
<li>A .github/workflows directory containing a docker-image.yml script identical for all the workflows</li>
</ul>
<div class="callout-block callout-info">
<div class="icon-holder">
<svg class="svg-inline--fa fa-info-circle fa-w-16" aria-hidden="true"
focusable="false" data-prefix="fas" data-icon="info-circle" role="img"
xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" data-fa-i2svg="">
<path fill="currentColor"
d="M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z"></path>
</svg><!-- <i class="fas fa-info-circle"></i> -->
</div><!--//icon-holder-->
<div class="content">
<p>
The flag <code>is_2d</code> specifies if the images from the Problem hold
two spatial dimensions (three spatial dimensions if set to <em>false</em>).
</p>
</div><!--//content-->
</div>
<div id="workflow_step3" class="section-block">
<h4>3. Update sections of the Descriptor</h4>
<h6>Workflow and associated Docker image names</h6>
<pre class="language-json"><code class="language-json">
{
"name": "NucleiTracking-ImageJ",
"container-image": {
"image": "neubiaswg5/w_nucleitracking-imagej",
"type": "singularity"
}
</code></pre>
<ul>
<li>Update <em>name</em> to match GitHub workflow repository name (without prefix)</li>
<li>Update <em>image</em> to match the name of your workflow GitHub repository (lower case only)</li>
</ul>
<h6>Command line call of the Docker image</h6>
<pre class="language-json"><code class="language-json">
"description": "Track nuclei in a time series by doing 3D segmentation.",
"command-line": "python wrapper.py CYTOMINE_HOST CYTOMINE_PUBLIC_KEY CYTOMINE_PRIVATE_KEY CYTOMINE_ID_PROJECT CYTOMINE_ID_SOFTWARE IJ_RADIUS IJ_THRESHOLD IJ_ERODE_RADIUS ",
</code></pre>
<ul>
<li><em>Description</em>: Update workflow description</li>
<li><em>Command-line</em>: Update parameter list (here last 3 arguments)</li>
</ul>
<h6>Workflow parameter sections</h6>
<pre class="language-json"><code class="language-json">
{
"id": "ij_radius",
"value-key": "@ID",
"command-line-flag": "--@id",
"name": "Radius",
"description": "Radius of the Gaussian filter",
"type": "Number",
"default-value": 3,
"optional": true
},
</code></pre>
<p>
Update / add as many parameter sections as required to match the parameter list from command line call.
</p>
<ul>
<li><em>id</em>: should match parameter name in command line call (lower case)</li>
<li><em>name</em>: name that will appear in BIAFLOWS user interface (parameter dialog box)</li>
<li><em>description</em>: context help in BIAFLOWS user interface (parameter dialog box)</li>
<li><em>type</em>: <em>"String"</em> or <em>"Number"</em></li>
<li><em>default-value</em>: the default value in BIAFLOWS user interface (parameter dialog box).</li>
</ul>
</div>
<div id="workflow_step4" class="section-block">
<h4>4. Update DockerFile</h4>
<p>
If applicable, update the line copying the workflow from the <a href="https://github.com/Neubias-WG5/W_NucleiTracking-ImageJ/blob/master/Dockerfile" target="_blank">GitHub repository</a> to the workflow Docker image, for instance:
</p>
<pre class="language-json"><code class="language-json">
ADD NucleiTracking.ijm /fiji/macros/macro.ijm
</code></pre>
<p>
If necessary, append commands to install additional required libraries/plugins to the execution environment.
</p>
</div>
<div id="workflow_step5" class="section-block">
<h4>5. Update wrapper script</h4>
<p>
Update workflow command line call in <a href="https://github.com/Neubias-WG5/W_NucleiTracking-ImageJ/blob/master/wrapper.py">wrapper.py</a>.
</p>
<pre class="language-python"><code class="language-python">
command = "/usr/bin/xvfb-run ./ImageJ-linux64 -macro macro.ijm " \
"\"input={}, output={}, ij_radius={}, ij_threshold={}, ij_erode_radius={}\" -batch".format(
in_path, out_path, nj.parameters.ij_radius, nj.parameters.ij_threshold, nj.parameters.ij_erode_radius)
</code></pre>
<p>
Update/add parameters to match parameters defined in JSON descriptor (<a class="scrollto" href="#workflow_step2">Step 2</a>).
</p>
</div>
<div id="workflow_step6" class="section-block">
<h4>6. Adapt your workflow script</h4>
<p>
If applicable, adapt your workflow script to fulfil workflow requirements and parse parameters
from command line. For instance for an ImageJ macro:
</p>
<pre class="language-java">
<code class="language-java">
for(i=0; i < parts.length; i++) {
nameAndValue = split(parts[i], "=");
if (indexOf(nameAndValue[0], "input") > -1) inputDir=nameAndValue[1];
if (indexOf(nameAndValue[0], "output") > -1) outputDir=nameAndValue[1];
if (indexOf(nameAndValue[0], "ij_radius") > -1) GaussRad=nameAndValue[1];
if (indexOf(nameAndValue[0], "ij_threshold") > -1) Thr=nameAndValue[1];
if (indexOf(nameAndValue[0], "ij_erode_radius") > -1) ErodeRad=nameAndValue[1];
}
images = getFileList(inputDir);
for(i=0; i < images.length; i++) {
//DO SOMETHING
}
</code>
</pre>
</div>
<div id="workflow_step7" class="section-block">
<h4>7. Reuse the .github/workflows/docker-image.yml file as it is</h4>
<p>
This file is identical for all workflows
</p>
<pre class="language-java">
<code class="language-java">
name: Docker Image CI
on:
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- run: echo "REPOSITORY_NAME=$(echo '${{ github.repository }}' | awk '{print tolower($0)}' | tr -d -)" >> $GITHUB_ENV
shell: bash
- name: Get the version
id: vars
run: echo ::set-output name=tag::$(echo ${GITHUB_REF:10})
- name: Build the tagged Docker image
run: docker build . --file Dockerfile --tag ${{ env.REPOSITORY_NAME }}:${{ steps.vars.outputs.tag }}
- name: Push the tagged Docker image
run: docker push ${{ env.REPOSITORY_NAME }}:${{ steps.vars.outputs.tag }}
</code>
</pre>
</div>
<div id="workflow_step8" class="section-block">
<h4>8. Connect DockerHub and the workflow on Github</h4>
<p>
<b><u>On DockerHub</u></b>
</p>
<p>
1- Sign in
</p>
<p>
2- Create an <b>Acces Token</b> to manage the access to the dockerhub account using the GitHub action mechanism
</p>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_C.png" alt="screenshot">
</div>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_D.png" alt="screenshot">
</div>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_E.png" alt="screenshot">
</div>
</p>
<p>3- Set the token to Read & Write access and name it for instance <b>BIAFLOWS_Token</B></p>
<p>4- Copy the token (value copied will be copied in Actions secret on Github)</p>
<p>
<b><u>On GitHub</u>:</b>
<p>
<p>5- Back to the <b>GitHub repository</b> of the workflow, create 2 secrets <b>DOCKERHUB_USERNAME</b> and <b>DOCKERHUB_TOKEN</b> for the workflow repository</p>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_F.png" alt="screenshot">
</div>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_G.png" alt="screenshot">
</div>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_H.png" alt="screenshot">
</div>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_I.png" alt="screenshot">
</div>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_J.png" alt="screenshot">
</div>
<p>You should see the following Action Secret now:</p>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_M.png" alt="screenshot">
</div>
<p>
With this configuration, the docker-images will be built and pushed to DockerHub for each new release created from the repository and BIA</span>FLOWS will fetch the new releases if the related Github and DockerHub repositories were correctly added as trusted sources of the server.
</p>
</div>
<!--
<div id="workflow_step9" class="section-block">
<h4>9. Create Docker image in DockerHub</h4>
<p>
On DockerHub, create a new public repository. The repository name must match the container-image name used in
<a class="scrollto" href="#workflow_step3">Step 3</a>. Once configured, click <b>Create</b>.
</p>
</div>
<div id="workflow_step10" class="section-block">
<h4>10. Link repository to workflow GitHub repository & configure workflow Docker image automated build</h4>
<p>Click on the <b>Builds</b> tab and then the <b>Configure Automated Builds</b> blue button.</p>
<p>Configure the build according to the following example:</p>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_01.png" alt="screenshot">
</div>
<p>Especially, note that <b>Source Type</b> must be set to <b>Tag</b>, <b>Source</b> is <b>/.*/</b> and <b>Docker Tag</b> is <b>{sourceref}</b>.
</div>
-->
<div id="workflow_step9" class="section-block">
<h4>9. Trigger a workflow release</h4>
<p>
Trigger a release from GitHub workflow repository with version tag such as
<em>v0.1</em>, <em>v0.2</em>, <em>v1.0</em>...
</p>
</div>
<div id="workflow_step10" class="section-block">
<h4>10. Workflow Docker image build</h4>
<p>
Check from DockerHub that the workflow <em>Docker image</em> has built successfully.
If not, parse the log and fix issues by modifying DockerFile and re-triggering a
new release.
</p>
</div>
<div id="workflow_step11" class="section-block">
<h4>11. Add workflow to BIAFLOWS problem</h4>
<p>
Once the <em>Docker</em> image is built, a BIAFLOWS instance fetches the image
from the trusted source and make it available (possibly after up to 5/10 minutes).
Sign in as administrator to BIAFLOWS (or regular sandbox user) and browse to the <em>Problem</em> you want to
add the workflow to. Then, click on the
<a data-v-1b79a3b0="" href="#/project/3347506/configuration">
<i data-v-1b79a3b0="" class="fas fa-cogs"></i>
Configuration</a> icon (bottom left of the side bar).
</p>
<p>
Search for the workflow (recently added workflows are on top of the list) and
enable it. Older workflow versions can be disabled if this is an update
to an existing workflow.
</p>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_02.png" alt="screenshot">
</div>
</div>
<div id="workflow_step12" class="section-block">
<h4>12. Run the workflow</h4>
<p>Test the workflow by running it from BIAFLOWS / Workflow runs
(requires execution rights).</p>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_03.png" alt="screenshot">
</div>
<p>
If execution fails, read the execution log, update the code and trigger a new release.
</p>
<div class="screenshot-holder">
<img class="img-fluid" src="assets/images/doc_workflow_guide_04.png" alt="screenshot">
</div>
</div>
</section>
</div><!--//content-inner-->
</div><!--//doc-content-->
<div class="doc-sidebar col-md-3 col-12 order-0 d-none d-md-flex">
<div id="doc-nav" class="doc-nav">
<nav id="doc-menu" class="nav doc-menu flex-column sticky">
<a class="nav-link scrollto" href="#introduction-section">Introduction</a>
<a class="nav-link scrollto" href="#requirement-section">BIA workflow requirements</a>
<a class="nav-link scrollto" href="#workflow-section">Workflow creation</a>
<nav class="doc-sub-menu nav flex-column">
<a class="nav-link scrollto" href="#workflow_step1">1. Create a workflow GitHub repository</a>
<a class="nav-link scrollto" href="#workflow_step2">2. Add the 4 required files to the workflow repository</a>
<a class="nav-link scrollto" href="#workflow_step3">3. Update sections of the Descriptor</a>
<a class="nav-link scrollto" href="#workflow_step4">4. Update DockerFile</a>
<a class="nav-link scrollto" href="#workflow_step5">5. Update wrapper script</a>
<a class="nav-link scrollto" href="#workflow_step6">6. Adapt your workflow script</a>
<a class="nav-link scrollto" href="#workflow_step7">7. Create the .github/workflows/docker-image.yml file</a>
<a class="nav-link scrollto" href="#workflow_step8">8. Connect DockerHub and the workflow on Github</a>
<a class="nav-link scrollto" href="#workflow_step9">9. Trigger a workflow release</a>
<a class="nav-link scrollto" href="#workflow_step10">10. Workflow Docker image build</a>
<a class="nav-link scrollto" href="#workflow_step11">11. Add workflow to BIAFLOWS problem</a>
<a class="nav-link scrollto" href="#workflow_step12">12. Run the workflow</a>
</nav><!--//nav-->
</nav><!--//doc-menu-->
</div>
</div><!--//doc-sidebar-->
</div><!--//doc-body-->
</div><!--//container-->
</div><!--//doc-wrapper-->
</div><!--//page-wrapper-->
<footer id="footer" class="footer text-center">
<div class="container">
<!--/* This template is released under the Creative Commons Attribution 3.0 License. Please keep the attribution link below when using for your own project. Thank you for your support. :) If you'd like to use the template without the attribution, you can buy the commercial license via our website: themes.3rdwavemedia.com */-->
<small class="copyright">Designed with <i class="fas fa-heart"></i> by <a
href="https://themes.3rdwavemedia.com/" target="_blank">Xiaoying Riley</a> for developers</small>
<p>
<br><br>
<a href="http://neubias.org/" target="_blank"><img src="assets/images/logo-neubias.png" height="50"></a>
<a href="https://cost.eu/COST_Actions/ca/CA15124" target="_blank"><img src="assets/images/logo-cost.png"
height="50"></a>
<a href="https://cytomine.org"><img src="assets/images/logo-cytomine-org.png" height="50"></a>
<a href="http://europe.wallonie.be/" target="_blank"><img src="assets/images/logo-feder.jpg"
height="50"></a>
</p>
</div><!--//container-->
</footer><!--//footer-->
<!-- Main Javascript -->
<script type="text/javascript" src="assets/plugins/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="assets/plugins/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="assets/plugins/prism/prism.js"></script>
<script type="text/javascript" src="assets/plugins/jquery-scrollTo/jquery.scrollTo.min.js"></script>
<script type="text/javascript" src="assets/plugins/stickyfill/dist/stickyfill.min.js"></script>
<script type="text/javascript" src="assets/js/main.js"></script>
</body>
</html>