2021-10-18 10:30:27 -07:00
# update-flake-lock
2025-04-18 15:23:17 -03:00
This is a GitHub Action that updates the [`flake.lock` ][lockfile] file for your [Nix flake][flakes] whenever it is run.
2021-10-18 10:30:27 -07:00
2025-04-18 15:23:17 -03:00
> [!NOTE]
> As of v3, this action no longer automatically installs [Determinate Nix][det-nix] to the action runner.
> You **must** set up Nix with flakes support enabled prior to running this action or your workflow will not function as expected.
2021-10-18 10:30:27 -07:00
## Example
2025-04-18 15:23:17 -03:00
Here's an example GitHub Action workflow using this Action:
2021-10-18 10:30:27 -07:00
```yaml
name: update-flake-lock
2025-04-18 15:23:17 -03:00
2021-10-18 10:30:27 -07:00
on:
2021-10-19 09:45:38 -07:00
workflow_dispatch: # allows manual triggering
schedule:
2021-10-27 10:59:58 -07:00
- cron: '0 0 * * 0' # runs weekly on Sunday at 00:00
2021-10-18 10:30:27 -07:00
jobs:
lockfile:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
2024-04-08 09:16:49 -07:00
uses: actions/checkout@v4
2025-04-18 15:23:17 -03:00
- name: Install Determinate Nix
2023-09-15 21:58:32 -04:00
uses: DeterminateSystems/nix-installer-action@main
2025-04-18 15:23:17 -03:00
with:
determinate: true
2021-10-18 10:30:27 -07:00
- name: Update flake.lock
2023-09-15 21:58:32 -04:00
uses: DeterminateSystems/update-flake-lock@main
2022-02-01 09:57:47 +05:30
with:
pr-title: "Update flake.lock" # Title of PR to be created
pr-labels: | # Labels to be set on the PR
dependencies
automated
2021-10-18 10:30:27 -07:00
```
2021-11-29 11:25:09 -08:00
## Example updating specific input(s)
2025-04-18 15:23:17 -03:00
> [!NOTE]
> If any inputs have a stale reference (e.g. the lockfile thinks a git input wants its "ref" to be "nixos-unstable", but the flake.nix specifies "nixos-unstable-small"), they are also updated. At this time, there is no known workaround.
2021-11-29 11:25:09 -08:00
2025-04-18 15:23:17 -03:00
It's also possible to update specific [flake inputs][inputs] by specifying them in a space-separated list:
2021-11-29 11:25:09 -08:00
```yaml
name: update-flake-lock
2025-04-18 15:23:17 -03:00
2021-11-29 11:25:09 -08:00
on:
workflow_dispatch: # allows manual triggering
schedule:
- cron: '0 0 * * 0' # runs weekly on Sunday at 00:00
jobs:
lockfile:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
2024-04-08 09:16:49 -07:00
uses: actions/checkout@v4
2025-04-18 15:23:17 -03:00
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
2021-11-29 11:25:09 -08:00
- name: Update flake.lock
2025-04-18 15:23:17 -03:00
uses: DeterminateSystems/update-flake-lock@main
2021-11-29 11:25:09 -08:00
with:
inputs: input1 input2 input3
```
2023-03-28 16:58:48 -04:00
## Example adding options to nix command
2025-04-18 15:23:17 -03:00
It's also possible to use specific options to the `nix` command in a space-separated list:
2023-03-28 16:58:48 -04:00
```yaml
name: update-flake-lock
on:
workflow_dispatch: # allows manual triggering
schedule:
- cron: '0 0 * * 0' # runs weekly on Sunday at 00:00
jobs:
lockfile:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
2024-04-08 09:16:49 -07:00
uses: actions/checkout@v4
2025-04-18 15:23:17 -03:00
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
2023-03-28 16:58:48 -04:00
- name: Update flake.lock
2025-04-18 15:23:17 -03:00
uses: DeterminateSystems/update-flake-lock@main
2023-03-28 16:58:48 -04:00
with:
2023-03-28 17:16:50 -04:00
nix-options: --debug --log-format raw
2023-03-28 16:58:48 -04:00
```
2022-04-21 12:03:25 -07:00
## Example that prints the number of the created PR
```yaml
name: update-flake-lock
on:
workflow_dispatch: # allows manual triggering
schedule:
- cron: '0 0 * * 0' # runs weekly on Sunday at 00:00
jobs:
lockfile:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
2024-04-08 09:16:49 -07:00
uses: actions/checkout@v4
2025-04-18 15:23:17 -03:00
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
2022-04-21 12:03:25 -07:00
- name: Update flake.lock
id: update
2025-04-18 15:23:17 -03:00
uses: DeterminateSystems/update-flake-lock@main
2022-04-21 12:03:25 -07:00
with:
inputs: input1 input2 input3
- name: Print PR number
run: echo Pull request number is ${{ steps.update.outputs.pull-request-number }}.
```
2022-05-03 11:58:24 -07:00
## Example that doesn't run on PRs
If you were to run this action as a part of your CI workflow, you may want to prevent it from running against Pull Requests.
```yaml
name: update-flake-lock
on:
workflow_dispatch: # allows manual triggering
pull_request: # triggers on every Pull Request
schedule:
- cron: '0 0 * * 0' # runs weekly on Sunday at 00:00
jobs:
lockfile:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
2024-04-08 09:16:49 -07:00
uses: actions/checkout@v4
2025-04-18 15:23:17 -03:00
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
2022-05-03 11:58:24 -07:00
- name: Update flake.lock
if: ${{ github.event_name != 'pull_request' }}
2025-04-18 15:23:17 -03:00
uses: DeterminateSystems/update-flake-lock@main
2022-05-03 11:58:24 -07:00
with:
inputs: input1 input2 input3
2022-09-07 22:11:56 -04:00
path-to-flake-dir: 'nix/' # in this example our flake doesn't sit at the root of the repository, it sits under 'nix/flake.nix'
2022-05-03 11:58:24 -07:00
```
2022-11-28 07:53:41 -08:00
## Example using a different Git user
If you want to change the author and / or committer of the flake.lock update commit, you can tweak the `git-{author,committer}-{name,email}` options:
```yaml
name: update-flake-lock
on:
workflow_dispatch: # allows manual triggering
schedule:
- cron: '0 0 * * 0' # runs weekly on Sunday at 00:00
jobs:
lockfile:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
2024-04-08 09:16:49 -07:00
uses: actions/checkout@v4
2025-04-18 15:23:17 -03:00
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
2022-11-28 07:53:41 -08:00
- name: Update flake.lock
2025-04-18 15:23:17 -03:00
uses: DeterminateSystems/update-flake-lock@main
2022-11-28 07:53:41 -08:00
with:
2025-04-18 15:23:17 -03:00
git-author-name: Jane Author
git-author-email: github-actions[bot]@users .noreply.github.com
git-committer-name: John Committer
git-committer-email: github-actions[bot]@users .noreply.github.com
2022-11-28 07:53:41 -08:00
```
2022-01-26 08:35:46 -08:00
## Running GitHub Actions CI
2025-04-18 15:23:17 -03:00
GitHub Actions doesn't run workflows when a branch is pushed by or a PR is opened by a GitHub Action.
There are two ways to have GitHub Actions CI run on a PR submitted by this action.
2022-01-26 08:35:46 -08:00
### Without a Personal Authentication Token
2025-03-19 12:13:08 -04:00
Without using a Personal Authentication Token, close and reopen the pull request manually to kick off CI.
2022-01-13 08:46:19 +01:00
2022-01-26 08:35:46 -08:00
### With a Personal Authentication Token
2025-04-18 15:23:17 -03:00
By providing a Personal Authentication Token, the PR is submitted in a way that bypasses this limitation (GitHub essentially thinks it's the owner of the PAT submitting the PR, and not an Action).
2023-12-25 20:46:37 -08:00
You can create a token by visiting https://github.com/settings/tokens and select at least the `repo` scope. For the new fine-grained tokens, you need to enable read and write access for "Contents" and "Pull Requests" permissions. Then, store this token in your repository secrets (i.e. `https://github.com/<USER>/<REPO>/settings/secrets/actions` ) as `GH_TOKEN_FOR_UPDATES` and set up your workflow file like the following:
2022-01-13 08:46:19 +01:00
```yaml
name: update-flake-lock
on:
workflow_dispatch: # allows manual triggering
schedule:
- cron: '0 0 * * 1,4' # Run twice a week
jobs:
lockfile:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
2024-04-08 09:16:49 -07:00
uses: actions/checkout@v4
2025-04-18 15:23:17 -03:00
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
2022-01-13 08:46:19 +01:00
- name: Update flake.lock
2025-04-18 15:23:17 -03:00
uses: DeterminateSystems/update-flake-lock@main
2022-01-13 08:46:19 +01:00
with:
token: ${{ secrets.GH_TOKEN_FOR_UPDATES }}
```
2022-07-15 07:07:38 +02:00
## With GPG commit signing
2025-04-18 15:23:17 -03:00
It's possible for the bot to produce GPG-signed commits.
Associating a GPG public key to a GitHub user account isn't required but it *is* necessary if you want the signed commits to appear as verified in Github.
This can be a compliance requirement in some cases.
2022-07-15 07:07:38 +02:00
2025-04-18 15:23:17 -03:00
You can follow [GitHub's guide to creating and/or adding a new GPG key to an user account ](https://docs.github.com/en/authentication/managing-commit-signature-verification/adding-a-new-gpg-key-to-your-github-account ).
Using a specific GitHub user account for the bot can be a good security measure to dissociate this bot's actions and commits from your personal GitHub account.
2022-07-15 07:07:38 +02:00
2025-04-18 15:23:17 -03:00
For the bot to produce signed commits, you need to provide the GPG private keys to this action's input parameters. You can safely do that with [Github secrets as explained here ](https://github.com/crazy-max/ghaction-import-gpg#prerequisites ).
2022-07-15 07:07:38 +02:00
2023-03-05 06:20:56 +02:00
When using commit signing, the commit author name and email for the commits produced by this bot would correspond to the ones associated to the GPG Public Key.
2022-07-15 07:07:38 +02:00
2022-08-17 11:41:30 +09:00
If you want to sign using a subkey, you must specify the subkey fingerprint using the `gpg-fingerprint` input parameter.
2025-04-18 15:23:17 -03:00
Here's an example of how to using this action with commit signing:
2022-07-15 07:07:38 +02:00
```yaml
name: update-flake-lock
2025-04-18 15:23:17 -03:00
2022-07-15 07:07:38 +02:00
on:
workflow_dispatch: # allows manual triggering
schedule:
- cron: '0 0 * * 1,4' # Run twice a week
jobs:
lockfile:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
2024-04-08 09:16:49 -07:00
uses: actions/checkout@v4
2025-04-18 15:23:17 -03:00
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
2022-07-15 07:07:38 +02:00
- name: Update flake.lock
2025-04-18 15:23:17 -03:00
uses: DeterminateSystems/update-flake-lock@main
2022-07-15 07:07:38 +02:00
with:
sign-commits: true
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
2022-08-17 11:41:30 +09:00
gpg-fingerprint: ${{ secrets.GPG_FINGERPRINT }} # specify subkey fingerprint (optional)
2022-07-15 07:07:38 +02:00
gpg-passphrase: ${{ secrets.GPG_PASSPHRASE }}
```
## Custom PR Body
2025-04-18 15:23:17 -03:00
By default, the generated PR body uses this template:
2022-07-15 07:07:38 +02:00
````handlebars
Automated changes by the [update-flake-lock ](https://github.com/DeterminateSystems/update-flake-lock ) GitHub Action.
2025-04-18 15:23:17 -03:00
````
2022-07-15 07:07:38 +02:00
{{ env.GIT_COMMIT_MESSAGE }}
2025-04-18 15:23:17 -03:00
````
2022-07-15 07:07:38 +02:00
```
### Running GitHub Actions on this PR
2025-04-18 15:23:17 -03:00
GitHub Actions doesn't run workflows on pull requests that are opened by a GitHub Action.
2022-07-15 07:07:38 +02:00
To run GitHub Actions workflows on this PR, run:
```sh
git branch -D update_flake_lock_action
git fetch origin
git checkout update_flake_lock_action
git commit --amend --no-edit
git push origin update_flake_lock_action --force
```
````
2025-04-18 15:23:17 -03:00
You can customize it, however, using variable interpolation performed with [Handlebars].
This enables you to customize the template with these variables:
- `env.GIT_AUTHOR_NAME`
- `env.GIT_AUTHOR_EMAIL`
- `env.GIT_COMMITTER_NAME`
- `env.GIT_COMMITTER_EMAIL`
- `env.GIT_COMMIT_MESSAGE`
2022-07-15 07:07:38 +02:00
2022-12-26 15:24:16 -06:00
## Add assignees or reviewers
You can assign the PR to or request a review from one or more GitHub users with `pr-assignees` and `pr-reviewers` , respectively.
These properties expect a comma or newline separated list of GitHub usernames:
```yaml
name: update-flake-lock
on:
workflow_dispatch: # allows manual triggering
schedule:
- cron: '0 0 * * 1,4' # Run twice a week
jobs:
lockfile:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
2024-04-08 09:16:49 -07:00
uses: actions/checkout@v4
2025-04-18 15:23:17 -03:00
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
2022-12-26 15:24:16 -06:00
- name: Update flake.lock
2025-04-18 15:23:17 -03:00
uses: DeterminateSystems/update-flake-lock@main
2022-12-26 15:24:16 -06:00
with:
pr-assignees: SomeGitHubUsername
pr-reviewers: SomeOtherGitHubUsername,SomeThirdGitHubUsername
```
2021-11-05 08:45:47 -07:00
## Contributing
2025-04-18 15:23:17 -03:00
Feel free to send a PR or open an issue if you find that something functions unexpectedly!
Please make sure to test your changes and update any related documentation before submitting your PR.
2021-11-05 08:45:47 -07:00
### How to test changes
2025-04-18 15:23:17 -03:00
In order to more easily test your changes to this action, we have created a template repository that should point you in the right direction: https://github.com/DeterminateSystems/update-flake-lock-test-template.
Please see the README in that repository for instructions on testing your changes.
[det-nix]: https://docs.determinate.systems/determinate-nix
[flakes]: https://zero-to-nix.com/concepts/flakes
[handlebars]: https://handlebarsjs.com
[inputs]: https://zero-to-nix.com/concepts/flakes/#inputs
[lockfile]: https://zero-to-nix.com/concepts/flakes/#lockfile