Skip to content

Commit

Permalink
Fix env output when changing task workdir
Browse files Browse the repository at this point in the history
Signed-off-by: Paolo Di Tommaso <[email protected]>
  • Loading branch information
pditommaso committed Aug 13, 2023
1 parent b238d7e commit 8e4d7fe
Show file tree
Hide file tree
Showing 7 changed files with 32 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ class ShifterBuilder extends ContainerBuilder<ShifterBuilder> {
else if( env instanceof String && env.contains('=') ) {
result << env
}
else if( env instanceof String ) {
result << "\${$env:+\"$env=\$$env\"}"
}
else if( env ) {
throw new IllegalArgumentException("Not a valid environment value: $env [${env.class.name}]")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ class BashWrapperBuilder {
result.append('\n')
result.append('# capture process environment\n')
result.append('set +u\n')
result.append('cd "$NXF_TASK_WORKDIR"\n')
for( int i=0; i<names.size(); i++) {
final key = names[i]
result.append "echo $key=\${$key[@]} "
Expand Down Expand Up @@ -582,6 +583,8 @@ class BashWrapperBuilder {
if( this.containerCpuset )
builder.addRunOptions(containerCpuset)

// export task work directory
builder.addEnv('NXF_TASK_WORKDIR')
// export the nextflow script debug variable
if( isTraceRequired() )
builder.addEnv( 'NXF_DEBUG=${NXF_DEBUG:=0}')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ nxf_main() {
{{task_env}}
{{secrets_env}}
[[ $NXF_SCRATCH ]] && cd $NXF_SCRATCH
export NXF_TASK_WORKDIR="$PWD"
{{stage_cmd}}

set +e
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ class BashWrapperBuilderTest extends Specification {
def builder = bash.createContainerBuilder(null)
then:
builder instanceof SingularityBuilder
builder.env == ['FOO','BAR']
builder.env == ['NXF_TASK_WORKDIR', 'FOO','BAR']
builder.workDir == Paths.get('/my/work/dir')
builder.mounts == [ Paths.get('/my/bin') ]

Expand Down Expand Up @@ -720,7 +720,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'docker', temp: 'auto', enabled: true] ).makeBinding()

then:
binding.launch_cmd == 'docker run -i -v $(nxf_mktemp):/tmp -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.launch_cmd == 'docker run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v $(nxf_mktemp):/tmp -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.cleanup_cmd == 'docker rm $NXF_BOXID &>/dev/null || true\n'
binding.kill_cmd == 'docker stop $NXF_BOXID'
}
Expand All @@ -734,7 +734,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'docker', temp: 'auto', enabled: true] ).makeBinding()

then:
binding.launch_cmd == 'docker run -i -v $(nxf_mktemp):/tmp -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -c "eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"'
binding.launch_cmd == 'docker run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v $(nxf_mktemp):/tmp -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -c "eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"'
binding.cleanup_cmd == 'docker rm $NXF_BOXID &>/dev/null || true\n'
binding.kill_cmd == 'docker stop $NXF_BOXID'
and:
Expand All @@ -755,7 +755,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'docker', temp: 'auto', enabled: true, entrypointOverride: false] ).makeBinding()

then:
binding.launch_cmd == 'docker run -i -v $(nxf_mktemp):/tmp -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.launch_cmd == 'docker run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v $(nxf_mktemp):/tmp -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.cleanup_cmd == 'docker rm $NXF_BOXID &>/dev/null || true\n'
binding.kill_cmd == 'docker stop $NXF_BOXID'
}
Expand All @@ -769,7 +769,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'docker', temp: 'auto', enabled: true, entrypointOverride: false] ).makeBinding()

then:
binding.launch_cmd == 'docker run -i -v $(nxf_mktemp):/tmp -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -c "eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"'
binding.launch_cmd == 'docker run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v $(nxf_mktemp):/tmp -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -c "eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"'
binding.cleanup_cmd == 'docker rm $NXF_BOXID &>/dev/null || true\n'
binding.kill_cmd == 'docker stop $NXF_BOXID'
and:
Expand All @@ -790,7 +790,7 @@ class BashWrapperBuilderTest extends Specification {
containerEnabled: true ).makeBinding()

then:
binding.launch_cmd == 'sudo docker run -i -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.launch_cmd == 'sudo docker run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.cleanup_cmd == 'sudo docker rm $NXF_BOXID &>/dev/null || true\n'
binding.kill_cmd == 'sudo docker stop $NXF_BOXID'
}
Expand All @@ -803,7 +803,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'docker', temp: 'auto', enabled: true, remove:false, kill: false] ).makeBinding()

then:
binding.launch_cmd == 'docker run -i -v $(nxf_mktemp):/tmp -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID ubuntu /bin/bash -ue /work/dir/.command.sh'
binding.launch_cmd == 'docker run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v $(nxf_mktemp):/tmp -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID ubuntu /bin/bash -ue /work/dir/.command.sh'
binding.cleanup_cmd == ""
binding.kill_cmd == null
binding.containsKey('kill_cmd')
Expand All @@ -817,7 +817,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'docker', enabled: true, remove:false, kill: 'SIGXXX'] ).makeBinding()

then:
binding.launch_cmd == 'docker run -i -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID ubuntu /bin/bash -ue /work/dir/.command.sh'
binding.launch_cmd == 'docker run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID ubuntu /bin/bash -ue /work/dir/.command.sh'
binding.cleanup_cmd == ""
binding.kill_cmd == 'docker kill -s SIGXXX $NXF_BOXID'
binding.containsKey('kill_cmd')
Expand All @@ -832,7 +832,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'docker', enabled: true] ).makeBinding()

then:
binding.launch_cmd == 'docker run -i -v /folder\\ with\\ blanks:/folder\\ with\\ blanks -v /work/dir:/work/dir -w "\$PWD" --name \$NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.launch_cmd == 'docker run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v /folder\\ with\\ blanks:/folder\\ with\\ blanks -v /work/dir:/work/dir -w "\$PWD" --name \$NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.cleanup_cmd == 'docker rm $NXF_BOXID &>/dev/null || true\n'
binding.kill_cmd == 'docker stop $NXF_BOXID'
}
Expand All @@ -847,7 +847,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'docker', sudo: true, enabled: true] ).makeBinding()

then:
binding.launch_cmd == 'sudo docker run -i -v /work/dir:/work/dir -v "$PWD":"$PWD" -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.launch_cmd == 'sudo docker run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v /work/dir:/work/dir -v "$PWD":"$PWD" -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.kill_cmd == 'sudo docker stop $NXF_BOXID'
binding.cleanup_cmd == '''\
(sudo -n true && sudo rm -rf "$NXF_SCRATCH" || rm -rf "$NXF_SCRATCH")&>/dev/null || true
Expand All @@ -864,7 +864,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'docker', enabled: true] ).makeBinding()

then:
binding.launch_cmd == 'docker run -i -v /work/dir:/work/dir -w "$PWD" -v /foo:/bar --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.launch_cmd == 'docker run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v /work/dir:/work/dir -w "$PWD" -v /foo:/bar --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.kill_cmd == 'docker stop $NXF_BOXID'
binding.cleanup_cmd == 'docker rm $NXF_BOXID &>/dev/null || true\n'
}
Expand All @@ -879,7 +879,7 @@ class BashWrapperBuilderTest extends Specification {
then:
binding.launch_cmd == '''\
sarus pull busybox 1>&2
sarus run --mount=type=bind,source=/work/dir,destination=/work/dir -w "$PWD" busybox /bin/bash -ue /work/dir/.command.sh
sarus run ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} --mount=type=bind,source=/work/dir,destination=/work/dir -w "$PWD" busybox /bin/bash -ue /work/dir/.command.sh
'''.stripIndent().rightTrim()
binding.cleanup_cmd == ""
binding.kill_cmd == '[[ "$pid" ]] && nxf_kill $pid'
Expand All @@ -896,7 +896,7 @@ class BashWrapperBuilderTest extends Specification {
then:
binding.launch_cmd == '''\
sarus pull busybox 1>&2
sarus run --mount=type=bind,source=/work/dir,destination=/work/dir -w "$PWD" busybox /bin/bash -c "eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"
sarus run ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} --mount=type=bind,source=/work/dir,destination=/work/dir -w "$PWD" busybox /bin/bash -c "eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"
'''.stripIndent().rightTrim()
binding.cleanup_cmd == ""
binding.kill_cmd == '[[ "$pid" ]] && nxf_kill $pid'
Expand All @@ -921,7 +921,7 @@ class BashWrapperBuilderTest extends Specification {
then:
binding.launch_cmd == '''\
sarus pull busybox 1>&2
sarus run --mount=type=bind,source=/folder\\ with\\ blanks,destination=/folder\\ with\\ blanks --mount=type=bind,source=/work/dir,destination=/work/dir -w "$PWD" busybox /bin/bash -ue /work/dir/.command.sh
sarus run ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} --mount=type=bind,source=/folder\\ with\\ blanks,destination=/folder\\ with\\ blanks --mount=type=bind,source=/work/dir,destination=/work/dir -w "$PWD" busybox /bin/bash -ue /work/dir/.command.sh
'''.stripIndent().rightTrim()
binding.cleanup_cmd == ""
binding.kill_cmd == '[[ "$pid" ]] && nxf_kill $pid'
Expand All @@ -938,7 +938,7 @@ class BashWrapperBuilderTest extends Specification {
then:
binding.launch_cmd == '''\
sarus pull busybox 1>&2
sarus run --mount=type=bind,source=/work/dir,destination=/work/dir -w "$PWD" --mount=type=bind,source=/foo,destination=/bar busybox /bin/bash -ue /work/dir/.command.sh
sarus run ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} --mount=type=bind,source=/work/dir,destination=/work/dir -w "$PWD" --mount=type=bind,source=/foo,destination=/bar busybox /bin/bash -ue /work/dir/.command.sh
'''.stripIndent().rightTrim()
binding.cleanup_cmd == ""
binding.kill_cmd == '[[ "$pid" ]] && nxf_kill $pid'
Expand All @@ -961,7 +961,7 @@ class BashWrapperBuilderTest extends Specification {
STATUS=$(shifterimg -v pull docker://ubuntu:latest | tail -n2 | head -n1 | awk \'{print $6}\')
[[ $STATUS == "FAILURE" || -z $STATUS ]] && echo "Shifter failed to pull image \'docker://ubuntu:latest\'" >&2 && exit 1
done
shifter --image docker://ubuntu:latest /bin/bash -c "eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"
${NXF_TASK_WORKDIR:+"NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} shifter --image docker://ubuntu:latest /bin/bash -c "eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"
'''.stripIndent().rightTrim()
binding.cleanup_cmd == ""
binding.kill_cmd == '[[ "$pid" ]] && nxf_kill $pid'
Expand All @@ -977,7 +977,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [enabled: true, engine: 'singularity'] as ContainerConfig ).makeBinding()

then:
binding.launch_cmd == 'set +u; env - PATH="$PATH" ${TMP:+SINGULARITYENV_TMP="$TMP"} ${TMPDIR:+SINGULARITYENV_TMPDIR="$TMPDIR"} singularity exec --no-home --pid docker://ubuntu:latest /bin/bash -c "cd $PWD; eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"'
binding.launch_cmd == 'set +u; env - PATH="$PATH" ${TMP:+SINGULARITYENV_TMP="$TMP"} ${TMPDIR:+SINGULARITYENV_TMPDIR="$TMPDIR"} ${NXF_TASK_WORKDIR:+SINGULARITYENV_NXF_TASK_WORKDIR="$NXF_TASK_WORKDIR"} singularity exec --no-home --pid docker://ubuntu:latest /bin/bash -c "cd $PWD; eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"'
binding.cleanup_cmd == ""
binding.kill_cmd == '[[ "$pid" ]] && nxf_kill $pid'
}
Expand All @@ -991,7 +991,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [enabled: true, engine: 'singularity', entrypointOverride: true] as ContainerConfig ).makeBinding()

then:
binding.launch_cmd == 'set +u; env - PATH="$PATH" ${TMP:+SINGULARITYENV_TMP="$TMP"} ${TMPDIR:+SINGULARITYENV_TMPDIR="$TMPDIR"} singularity exec --no-home --pid docker://ubuntu:latest /bin/bash -c "cd $PWD; eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"'
binding.launch_cmd == 'set +u; env - PATH="$PATH" ${TMP:+SINGULARITYENV_TMP="$TMP"} ${TMPDIR:+SINGULARITYENV_TMPDIR="$TMPDIR"} ${NXF_TASK_WORKDIR:+SINGULARITYENV_NXF_TASK_WORKDIR="$NXF_TASK_WORKDIR"} singularity exec --no-home --pid docker://ubuntu:latest /bin/bash -c "cd $PWD; eval $(nxf_container_env); /bin/bash -ue /work/dir/.command.sh"'
binding.cleanup_cmd == ""
binding.kill_cmd == '[[ "$pid" ]] && nxf_kill $pid'
}
Expand Down Expand Up @@ -1086,6 +1086,7 @@ class BashWrapperBuilderTest extends Specification {
str == '''
# capture process environment
set +u
cd "$NXF_TASK_WORKDIR"
echo FOO=${FOO[@]} > .command.env
echo BAR=${BAR[@]} >> .command.env
'''
Expand Down Expand Up @@ -1130,7 +1131,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'podman', enabled: true] ).makeBinding()

then:
binding.launch_cmd == 'podman run -i -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.launch_cmd == 'podman run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v /work/dir:/work/dir -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.cleanup_cmd == 'podman rm $NXF_BOXID &>/dev/null || true\n'
binding.kill_cmd == 'podman stop $NXF_BOXID'
}
Expand All @@ -1143,7 +1144,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'podman', enabled: true, entrypointOverride: true] ).makeBinding()

then:
binding.launch_cmd == 'podman run -i -v /work/dir:/work/dir -w "$PWD" --entrypoint /bin/bash --name $NXF_BOXID busybox -c "/bin/bash -ue /work/dir/.command.sh"'
binding.launch_cmd == 'podman run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v /work/dir:/work/dir -w "$PWD" --entrypoint /bin/bash --name $NXF_BOXID busybox -c "/bin/bash -ue /work/dir/.command.sh"'
binding.cleanup_cmd == 'podman rm $NXF_BOXID &>/dev/null || true\n'
binding.kill_cmd == 'podman stop $NXF_BOXID'
}
Expand All @@ -1157,7 +1158,7 @@ class BashWrapperBuilderTest extends Specification {
containerConfig: [engine: 'podman', enabled: true] ).makeBinding()

then:
binding.launch_cmd == 'podman run -i -v /work/dir:/work/dir -v "$PWD":"$PWD" -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.launch_cmd == 'podman run -i ${NXF_TASK_WORKDIR:+-e "NXF_TASK_WORKDIR=$NXF_TASK_WORKDIR"} -v /work/dir:/work/dir -v "$PWD":"$PWD" -w "$PWD" --name $NXF_BOXID busybox /bin/bash -ue /work/dir/.command.sh'
binding.cleanup_cmd == 'rm -rf $NXF_SCRATCH || true\npodman rm $NXF_BOXID &>/dev/null || true\n'
binding.kill_cmd == 'podman stop $NXF_BOXID'
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ nxf_main() {
set +u
set -u
[[ $NXF_SCRATCH ]] && cd $NXF_SCRATCH
export NXF_TASK_WORKDIR="$PWD"
nxf_stage

set +e
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ nxf_main() {
spack env activate -d /spack/env/path
set -u
[[ $NXF_SCRATCH ]] && cd $NXF_SCRATCH
export NXF_TASK_WORKDIR="$PWD"
nxf_stage

set +e
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ nxf_main() {
set +u
set -u
[[ $NXF_SCRATCH ]] && cd $NXF_SCRATCH
export NXF_TASK_WORKDIR="$PWD"

set +e
(set -o pipefail; (nxf_launch | tee .command.out) 3>&1 1>&2 2>&3 | tee .command.err) &
Expand Down

0 comments on commit 8e4d7fe

Please sign in to comment.