Environment variables available during workflow execution on the ACTIVATE platform.
These are automatically set by the ACTIVATE platform:
| Variable | Description | Example |
|---|---|---|
PW_USER |
Current username | jsmith |
PW_JOB_ID |
Unique workflow run ID | abc123 |
PW_WORKFLOW_NAME |
Name of the workflow | my-training-job |
PW_PLATFORM_HOST |
Platform URL | https://activate.parallel.works |
JOB_DIR |
Working directory for the job | ~/pw/jobs/workflow/123/ |
OUTPUTS |
File path for writing outputs | /path/to/outputs |
User inputs defined in on.execute.inputs are accessible in two ways:
on:
execute:
inputs:
model_name:
type: string
label: "Model"
jobs:
train:
steps:
- name: Train
run: python train.py --model "${{ inputs.model_name }}"Inputs are also available as PW_INPUT_* environment variables in scripts:
#!/bin/bash
# Access input named "model_name"
echo "Training model: ${PW_INPUT_model_name}"For inputs inside a group:
on:
execute:
inputs:
config:
type: group
items:
- name: epochs
type: numberAccess as:
- YAML:
${{ inputs.config.epochs }} - Script:
${PW_INPUT_config_epochs}(dots become underscores)
To pass values between jobs, write to the $OUTPUTS file:
jobs:
producer:
steps:
- name: Generate Values
id: gen
run: |
PORT=$(find_available_port)
HOSTNAME=$(hostname)
echo "PORT=$PORT" >> $OUTPUTS
echo "HOSTNAME=$HOSTNAME" >> $OUTPUTS
consumer:
needs: [producer]
steps:
- name: Use Values
run: |
echo "Connecting to ${{ needs.producer.steps.gen.outputs.HOSTNAME }}:${{ needs.producer.steps.gen.outputs.PORT }}"Set variables at different scopes:
# Workflow-level (lowest priority)
env:
GLOBAL_VAR: "available everywhere"
jobs:
example:
# Job-level (overrides workflow)
env:
JOB_VAR: "available in this job"
steps:
- name: Step 1
# Step-level (highest priority)
env:
STEP_VAR: "only in this step"
run: echo "$GLOBAL_VAR $JOB_VAR $STEP_VAR"Priority order (highest to lowest):
- Step-level
env - Job-level
env - Workflow-level
env
steps:
- name: Setup Environment
run: |
# Write all inputs to an env file
cat > inputs.env << 'EOF'
MODEL_NAME="${{ inputs.model_name }}"
EPOCHS=${{ inputs.epochs }}
LEARNING_RATE=${{ inputs.learning_rate }}
EOF
- name: Run Training
run: |
source inputs.env
python train.pyon:
execute:
inputs:
environment:
type: dropdown
options:
- label: "Development"
value: "dev"
- label: "Production"
value: "prod"
jobs:
deploy:
env:
CONFIG_PATH: ${{ inputs.environment == 'prod' ? '/etc/prod.conf' : '/etc/dev.conf' }}
steps:
- run: ./deploy.sh --config $CONFIG_PATHFor sensitive values, use organization variables:
steps:
- name: Authenticate
env:
API_KEY: ${{ org.my_api_key }}
run: ./authenticate.shOrganization variables are configured in the ACTIVATE platform settings and referenced via ${{ org.variable_name }}.
When running on HPC schedulers, additional variables are available:
| Variable | Description |
|---|---|
SLURM_JOB_ID |
Job ID |
SLURM_NODELIST |
Allocated nodes |
SLURM_NNODES |
Number of nodes |
SLURM_NTASKS |
Number of tasks |
SLURM_CPUS_PER_TASK |
CPUs per task |
SLURM_GPUS |
GPUs allocated |
| Variable | Description |
|---|---|
PBS_JOBID |
Job ID |
PBS_NODEFILE |
File listing nodes |
PBS_O_WORKDIR |
Submission directory |
NCPUS |
CPUs allocated |
Default working directory structure:
~/pw/jobs/{workflow-name}/{job-id}/
├── inputs.env # User inputs as env vars
├── outputs/ # Job outputs
└── logs/ # Execution logs
Access via $JOB_DIR or ${{ jobs.<job>.working-directory }}.
-
Always quote variables in bash to handle spaces:
python train.py --name "${MODEL_NAME}" -
Use defaults for optional inputs:
EPOCHS="${PW_INPUT_epochs:-10}" -
Validate required variables:
: "${MODEL_NAME:?ERROR: MODEL_NAME is required}"
-
Debug by printing variables:
steps: - name: Debug run: | echo "JOB_DIR: $JOB_DIR" echo "PW_USER: $PW_USER" env | grep PW_