> ## Documentation Index
> Fetch the complete documentation index at: https://developer.upsun.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Automate your code updates

> Learn how to automate your dependency updates through a source operation.

export const SettingsIcon = () => <svg width="24px" height="24px" style={{
  display: 'inline',
  verticalAlign: 'middle'
}}>
    <title id="settings-icon">Settings</title>
    <path d="M10.5289 21.9416C9.86066 21.8582 9.3595 21.3576 9.19245 20.6903L9.02539 19.6892C8.85834 19.6058 8.77482 19.6058 8.60776 19.5224L7.93955 20.0229C7.43839 20.44 6.68665 20.44 6.10196 20.0229C6.10196 20.0229 4.09732 18.1042 4.01379 17.9374C3.51263 17.3535 3.51263 16.6027 3.93027 16.0187L4.51495 15.3514C4.43143 15.1845 4.43143 15.1011 4.3479 14.9343L3.42911 14.7674C2.76089 14.684 2.25973 14.1835 2.09268 13.4327C2.00915 13.1824 2.09268 10.4296 2.09268 10.4296C2.17621 9.76222 2.67737 9.2617 3.34558 9.09486L4.3479 8.92802C4.43143 8.8446 4.43143 8.76118 4.51495 8.59434L4.01379 7.92697C3.59616 7.42645 3.59616 6.67567 4.01379 6.09173C4.01379 6.09173 5.93491 4.08964 6.10196 4.00622C6.68665 3.5057 7.43839 3.5057 8.02307 3.9228L8.69129 4.50675C8.85834 4.42333 8.94187 4.42333 9.10892 4.33991L9.27597 3.42228C9.3595 2.75492 9.86066 2.2544 10.6124 2.08756C10.863 2.00414 13.2853 2.00414 13.5358 2.08756H13.6194C14.2876 2.17098 14.7887 2.6715 14.9558 3.33886L15.1228 4.33991C15.2064 4.42333 15.2899 4.50675 15.457 4.50675L16.1252 4.00622C16.6263 3.58912 17.3781 3.58912 17.9628 4.00622C17.9628 4.00622 19.9674 5.92489 20.0509 6.09173C20.5521 6.67567 20.5521 7.42645 20.1344 8.0104L19.6333 8.67776C19.7168 8.8446 19.7168 9.01144 19.8003 9.09486L20.7191 9.2617C21.3873 9.34512 21.972 9.92906 22.0556 10.5964V13.5996C21.972 14.2669 21.4709 14.7674 20.8027 14.9343L19.8003 15.1011C19.7168 15.268 19.7168 15.3514 19.6333 15.5182L20.218 16.269C20.6356 16.7695 20.6356 17.5203 20.218 18.1042L18.0463 20.2732C17.4616 20.6903 16.7099 20.6903 16.2087 20.2732L15.3734 19.6058C15.2064 19.6892 15.1228 19.6892 14.9558 19.7726L14.7887 20.6903C14.7052 21.3576 14.1205 21.9416 13.4523 22.025H10.5289V21.9416ZM11.5312 20.3566C11.8653 20.3566 12.1994 20.3566 12.45 20.3566C12.8676 20.3566 13.2017 20.0229 13.2853 19.6058L13.3688 18.9384C13.3688 18.6882 13.6194 18.4379 13.8699 18.2711L15.1228 17.7706C15.3734 17.6871 15.7075 17.6871 15.9581 17.854L16.5428 18.2711C16.8769 18.5213 17.3781 18.5213 17.6286 18.1877C17.7957 18.0208 18.0463 17.7706 18.2969 17.5203C18.5474 17.1866 18.631 16.7695 18.3804 16.4358L17.8792 16.0187C17.7122 15.7685 17.6286 15.4348 17.7957 15.1845L18.2969 14.0167C18.3804 13.7664 18.631 13.5996 18.9651 13.5161L19.6333 13.4327C20.0509 13.3493 20.385 13.0156 20.385 12.5985C20.385 12.2648 20.385 11.9311 20.385 11.6809C20.385 11.2638 20.0509 10.9301 19.6333 10.8467L18.9651 10.7633C18.7145 10.7633 18.4639 10.513 18.2969 10.2627L17.7957 9.01144C17.7122 8.76118 17.7122 8.4275 17.8792 8.17724L18.2969 7.59329C18.5474 7.25961 18.5474 6.84251 18.2133 6.50883C18.0463 6.34199 17.7957 6.09173 17.5451 5.84147C17.211 5.50779 16.7934 5.50779 16.4593 5.75805L16.0416 6.17515C15.7911 6.34199 15.457 6.42541 15.2064 6.25857L14.037 5.75805C13.7864 5.67463 13.6194 5.42437 13.5358 5.09069L13.3688 4.50675C13.2853 4.08964 12.9511 3.75596 12.5335 3.75596C12.1994 3.75596 11.8653 3.75596 11.6147 3.75596C11.1971 3.75596 10.863 4.08964 10.7795 4.50675L10.6959 5.17411C10.6959 5.42437 10.4453 5.67463 10.1948 5.84147L9.02539 6.25857C8.69129 6.42541 8.44071 6.34199 8.19013 6.17515L7.60544 5.75805C7.27133 5.50779 6.77017 5.50779 6.51959 5.84147C6.26901 6.00831 6.10196 6.25857 5.85138 6.42541C5.6008 6.75909 5.51727 7.17619 5.85138 7.50987L6.18549 8.09382C6.35254 8.34408 6.43607 8.67776 6.26901 8.92802L5.76785 10.0959C5.68433 10.3462 5.43375 10.513 5.09964 10.5964L4.43143 10.6798C4.01379 10.7633 3.67969 11.0969 3.67969 11.514C3.67969 11.8477 3.67969 12.1814 3.67969 12.4317C3.67969 12.8488 4.01379 13.1825 4.43143 13.2659L5.09964 13.3493C5.35022 13.3493 5.6008 13.5996 5.76785 13.8498L6.26901 15.1011C6.35254 15.3514 6.35254 15.6851 6.18549 15.9353L5.76785 16.5193C5.51727 16.8529 5.51727 17.3535 5.85138 17.6037C6.01843 17.7706 6.26901 18.0208 6.51959 18.2711C6.8537 18.5213 7.27133 18.6048 7.60544 18.3545L8.02307 17.854C8.27365 17.6871 8.60776 17.6037 8.85834 17.7706L10.0277 18.2711C10.2783 18.3545 10.4453 18.6048 10.5289 18.9384L10.6124 19.6058C10.7795 20.0229 11.1136 20.3566 11.5312 20.3566ZM18.798 6.92593C18.798 6.92593 18.798 7.00935 18.798 6.92593V6.92593Z"></path>
    <path d="M12.0324 17.0198C9.27597 17.0198 7.02075 14.7675 7.02075 12.0146C7.02075 9.26172 9.27597 7.00937 12.0324 7.00937C14.7887 7.00937 17.044 9.26172 17.044 12.0146C17.044 14.7675 14.7887 17.0198 12.0324 17.0198ZM12.0324 8.67777C10.1948 8.67777 8.69129 10.1793 8.69129 12.0146C8.69129 13.8498 10.1948 15.3514 12.0324 15.3514C13.8699 15.3514 15.3734 13.8498 15.3734 12.0146C15.3734 10.1793 13.8699 8.67777 12.0324 8.67777Z"></path>
  </svg>;

Upsun allows you to update your dependencies through [source operations](/docs/configure-apps/source-operations).

## Before you start

You need:

* The [Upsun CLI](/cli)
* An [API token](/cli/api-tokens#2-create-an-api-token)

## 1. Define a source operation to update your dependencies

To facilitate updating your dependencies in your project,
define a source operation in your `.upsun/config.yaml` file
depending on your dependency manager:

<Tabs>
  <Tab title="Composer">
    ```yaml .upsun/config.yaml theme={null}
    applications:
      # The name of the app container. Must be unique within a project.
      myapp:
        # The location of the application's code.
        source:
          operations:
            update:
              command: |
                set -e
                composer update
                git add composer.lock
                git add -A
                git diff-index --quiet HEAD || git commit --allow-empty -m "Update Composer dependencies"
    ```
  </Tab>

  <Tab title="npm">
    ```yaml .upsun/config.yaml theme={null}
    applications:
      # The name of the app container. Must be unique within a project.
      myapp:
        # The location of the application's code.
        source:
          operations:
            update:
              command: |
                set -e
                npm update
                git add package.json package-lock.json
                git add -A
                git diff-index --quiet HEAD || git commit --allow-empty -m "Update npm dependencies"
    ```
  </Tab>

  <Tab title="Yarn">
    ```yaml .upsun/config.yaml theme={null}
    applications:
      # The name of the app container. Must be unique within a project.
      myapp:
        # The location of the application's code.
        source:
          operations:
            update:
              command: |
                set -e
                yarn upgrade
                git add yarn.lock
                git add -A
                git diff-index --quiet HEAD || git commit --allow-empty -m "Update yarn dependencies"
    ```
  </Tab>

  <Tab title="Go">
    ```yaml .upsun/config.yaml theme={null}
    applications:
      # The name of the app container. Must be unique within a project.
      myapp:
        # The location of the application's code.
        source:
          operations:
            update:
              command: |
                set -e
                go get -u
                go mod tidy
                git add go.mod go.sum
                git add -A
                git diff-index --quiet HEAD || git commit --allow-empty -m "Update Go dependencies"
    ```
  </Tab>

  <Tab title="Pipenv">
    ```yaml .upsun/config.yaml theme={null}
    applications:
      # The name of the app container. Must be unique within a project.
      myapp:
        # The location of the application's code.
        source:
          operations:
            update:
              command: |
                set -e
                pipenv update
                git add Pipfile Pipfile.lock
                git add -A
                git diff-index --quiet HEAD || git commit --allow-empty -m "Update Python dependencies"
    ```
  </Tab>

  <Tab title="Bundler">
    ```yaml .upsun/config.yaml theme={null}
    applications:
      # The name of the app container. Must be unique within a project.
      myapp:
        # The location of the application's code.
        source:
          operations:
            update:
              command: |
                set -e
                bundle update --all
                git add Gemfile Gemfile.lock
                git add -A
                git diff-index --quiet HEAD || git commit --allow-empty -m "Update Ruby dependencies"
    ```
  </Tab>
</Tabs>

## 2. Automate your dependency updates with a cron job

After you've defined a source operation to [update your dependencies on your project](#1-define-a-source-operation-to-update-your-dependencies),
you can automate it using a cron job.

Note that it’s best not to run source operations on your production environment,
but rather on a dedicated environment where you can test changes.

Make sure you have the [Upsun CLI](/cli) installed
and [an API token](/cli/api-tokens#2-create-an-api-token)
so you can run a cron job in your app container.

1. Set your API token as a top-level environment variable:

<Tabs>
  <Tab title="From the CLI">
    Run the following command:

    ```bash theme={null}
    upsun variable:create --environment main --level environment --prefix 'env' --name UPSUN_CLI_TOKEN --sensitive true --value 'YOUR_UPSUN_CLI_TOKEN' --inheritable false --visible-build true --json false --enabled true --visible-runtime true
    ```
  </Tab>

  <Tab title="From the Console">
    1. Open the environment where you want to add the variable.
    2. Click <SettingsIcon /> **Settings**.
    3. Click **Variables**.
    4. Click **+ Add variable**.
    5. In the **Variable name** field, enter `env:UPSUN_CLI_TOKEN`.
    6. In the **Value** field, enter your API token.
    7. Make sure the **Available at runtime** and **Sensitive variable** options are selected.
    8. Click **Add variable**.
  </Tab>
</Tabs>

<Warning>
  Once you add the API token as an environment variable,
  anyone with [SSH access](/docs/development/ssh) can read its value.
  Make sure you carefully check your [user access on this project](/docs/administration/users#manage-project-users).
</Warning>

2. Add a build hook to your app configuration to install the CLI as part of the build process:

```yaml .upsun/config.yaml theme={null}
applications:
  myapp:
    hooks:
      build: |
        set -e
        echo "Installing Upsun CLI"
        curl -fsSL https://raw.githubusercontent.com/upsun/cli/main/installer.sh | bash

        echo "Testing Upsun CLI"
        upsun
```

3. Then, to configure a cron job to automatically update your dependencies once a day,
   use a configuration similar to the following:

```yaml .upsun/config.yaml theme={null}
applications:
  myapp:
    # ...
    crons:
      update:
        # Run the code below every day at midnight.
        spec: '0 0 * * *'
        commands:
          start: |
            set -e
            upsun sync -e development code data --no-wait --yes
            upsun source-operation:run update --no-wait --yes
```

The example above synchronizes the `development` environment with its parent
and then runs the `update` source operation defined [previously](#1-define-a-source-operation-to-update-your-dependencies).

<Warning>
  If you have enabled a [source integration](/docs/integrations/source), and have enabled `--fetch-branches` on that
  integration, merging on Upsun is not possible. Therefore, the `sync` command in the example above would
  fail.
</Warning>

## 3. Configure notifications about dependency updates

To get notified every time a source operation is triggered and therefore every time a dependency is updated,
you can configure activity scripts or webhooks.

### Notifications through an activity script

After you've defined a source operation to [update your dependencies on your project](#1-define-a-source-operation-to-update-your-dependencies),
you can configure an activity script
to receive notifications every time a dependency update is triggered.

<Note>
  <h4>Example</h4>
  You want to get notified of every dependency update
  through a message posted on a Slack channel.
  To do so, follow these steps:

  1. In your Slack administrative interface, [create a new Slack webhook](https://api.slack.com/messaging/webhooks).
     You get a URL starting with `https://hooks.slack.com/`.

  2. Replace `SLACK_URL` in the following `.js` script with your webhook URL.

  3. Add the following code to a `.js` file:

     ```javascript theme={null}
     /**
      * Sends a color-coded formatted message to Slack.
      *
      * To control what events trigger it, use the --events switch in
      * the Upsun CLI.
      *
      * Replace SLACK_URL in the following script with your Slack webhook URL.
      * Get one here: https://api.slack.com/messaging/webhooks
      * You should get something like: const url = 'https://hooks.slack.com/...';
      *
      * activity.text: a brief, one-line statement of what happened.
      * activity.log: the complete build and deploy log output, as it would be seen in the Console log screen.
      */
     function sendSlackMessage(title, message) {
       const url = 'SLACK_URL';
       const messageTitle = title;
       const color = activity.result === "success" ? "#66c000" : "#ff0000";
       const body = {
         attachments: [
           {
             title: messageTitle,
             text: message,
             color: color,
           },
         ],
       };
       const resp = fetch(url, {
         method: "POST",
         headers: {
           "Content-Type": "application/json",
         },
         body: JSON.stringify(body),
       });
       if (!resp.ok) {
         console.log("Sending slack message failed: " + resp.body.text());
       }
     }
     sendSlackMessage(activity.text, activity.log);
     ```

  4. Run the following [Upsun CLI](/cli) command:

     ```bash theme={null}
     upsun integration:add --type script --file ./my_script.js --events=environment.source-operation
     ```

     Optional: to only get notifications about specific environments,
     add the following flag to the command: `--environments=your_environment_name`.

  Anytime a dependency is updated via a source operation,
  the activity script now reports it to Slack.
</Note>

### Notifications through a webhook

After you've defined a source operation to [update your dependencies on your project](#1-define-a-source-operation-to-update-your-dependencies),
you can configure a webhook to receive notifications every time a dependency update is triggered.

[Webhooks](/docs/integrations/activity/webhooks) allow you to host a script yourself externally.
This script receives the same payload as an activity script and responds to the same events,
but can be hosted on your own server and in your own language.

To configure the integration between your webhook and your source operation,
run the following [Upsun CLI](/cli) command:

```bash theme={null}
upsun integration:add --type=webhook --url=URL_TO_RECEIVE_JSON --events=environment.source-operation
```

Optional: to only get notifications about specific environments,
add the following flag to the command: `--environments=your_environment_name`.

To test the integration and the JSON response,
you can generate a URL from a service such as [webhook.site](https://webhook.site)
and use the generated URL as `URL_TO_RECEIVE_JSON`.
This URL then receives the JSON response when a source operation is triggered.

Anytime a dependency is updated via a source operation,
the webhook now receives a POST message.
This POST message contains complete information about the entire state of the project at that time.
