# Pre/Post Deployment Script

<table><thead><tr><th width="229">Attribute</th><th>Type</th><th>Description</th><th>Package Types Applicable</th></tr></thead><tbody><tr><td>preDeploymentScript</td><td>string</td><td>Run an executable script before deploying an artifact. Users need to provide a path to the script file</td><td><ul><li>unlocked</li><li>org-dependent unlocked</li><li>source</li><li>diff</li></ul></td></tr><tr><td>postDeploymentScript</td><td>string</td><td>Run an executable script after deploying an package. Users need to provide a path to the script file</td><td><ul><li>unlocked</li><li>org-dependent unlocked</li><li>source</li><li>diff</li></ul></td></tr></tbody></table>

\
\
In some situations, you might need to execute a pre/post deployment script to do manipulate the data before or after being deployed to the org. **sfp** allow you to provide a path to a shell script (Mac/Unix) / batch script (on Windows).

The scripts are called with the following parameters. In your script you can refer to the parameters using [positional parameters.](https://linuxcommand.org/lc3_wss0120.php)

Please note scripts are copied into the [artifacts](https://github.com/flxbl-io/docs-sfp/blob/main/building-artifacts/configuring-installation-behaviour-of-a-package/broken-reference/README.md) and are not executed from version control. sfpowerscripts only copies the script mentioned by this parameter and do not copy any additional files or dependencies. Please ensure pre/post deployment scripts are independent or should be able to download its dependencies

| Position | Value                                                                                                                               |
| -------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| 1        | Name of the Package                                                                                                                 |
| 2        | Username of the target org where the package is being deployed                                                                      |
| 3        | Alias of the target org where the package is being deployed                                                                         |
| 4        | Path to the working directory that has the contents of the package                                                                  |
| 5        | Path to the package directory. One would need to combine parameter 4 and 5 to find the absolute path to the contents of the package |

<pre><code>// Sample package 

{
  "packageDirectories": [
      {    
      "path": "src/data-package-cl",
      "package": "data-package-cloudlending",
      "type": "data",
      "versionNumber": "2.0.10.NEXT",
      "<a data-footnote-ref href="#user-content-fn-1">preDeploymentScript</a>": "scripts/enableEmailDeliverability.sh"
<strong>      "<a data-footnote-ref href="#user-content-fn-2">postDeploymentScript</a>": "scripts/pushData.sh"
</strong>    }

</code></pre>

{% hint style="warning" %}
Please note the script has to be completely independent and should not have dependency on a file in the version control, as scripts are executed within the context of an artifact.
{% endhint %}

```
// A script to enable email deliverablity to All

#!/bin/bash

export SF_DISABLE_DNS_CHECK=true

# Create a temporary file
temp_file="$(mktemp)"

# Write the anonymous Apex code to the temp file
cat << EOT >> "$temp_file"
{
  "$schema": "https://raw.githubusercontent.com/amtrack/sfdx-browserforce-plugin/master/src/plugins/schema.json",
  "settings": {
    "emailDeliverability": {
      "accessLevel": "All email"
    }
  }
}
EOT


if [ "$3" = 'ci' ]; then
# Execute the browserforce configuration to this org
  sf browserforce:apply  -f "$temp_file" --target-org $3
fi

# Clean up by removing the temporary file
rm "$temp_file"
```

[^1]: Use this attribute to trigger a pre deployment script

[^2]: Attribute to enable postDeploymentScript


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.flxbl.io/flxbl/sfp/building-artifacts/configuring-installation-behaviour-of-a-package/pre-post-deployment-script.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
