Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: CI

on:
pull_request:
push:
Expand All @@ -11,8 +12,14 @@ jobs:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Nix
- name: Check Nixpkgs
uses: DeterminateSystems/flake-checker-action@main
with:
fail-mode: true
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
- name: Enable FlakeHub Cache
uses: DeterminateSystems/flakehub-cache-action@main
- name: Install pnpm dependencies
Expand Down
7 changes: 4 additions & 3 deletions .github/workflows/update.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: update-flake-lock

on:
workflow_dispatch:
schedule:
Expand All @@ -10,10 +11,10 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Check flake
uses: DeterminateSystems/flake-checker-action@main
- name: Install Nix
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
- name: Enable FlakeHub Cache
uses: DeterminateSystems/flakehub-cache-action@main
- name: Update flake.lock
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/validate.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: CI

on:
pull_request:
push:
Expand Down
143 changes: 91 additions & 52 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
# update-flake-lock

This is a GitHub Action that will update your flake.lock file whenever it is run.
This is a GitHub Action that updates the [`flake.lock`][lockfile] file for your [Nix flake][flakes] whenever it is run.

> **NOTE:** As of v3, this action will no longer automatically install Nix to the action runner. You **MUST** set up a Nix with flakes support enabled prior to running this action, or your workflow will not function as expected.
> [!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.

## Example

An example GitHub Action workflow using this action would look like the following:
Here's an example GitHub Action workflow using this Action:

```yaml
name: update-flake-lock

on:
workflow_dispatch: # allows manual triggering
schedule:
Expand All @@ -21,8 +24,10 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Nix
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
- name: Update flake.lock
uses: DeterminateSystems/update-flake-lock@main
with:
Expand All @@ -34,12 +39,14 @@ jobs:

## Example updating specific input(s)

> **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 will also be updated. At this time, there is no known workaround.
> [!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.

It is also possible to update specific inputs by specifying them in a space-separated list:
It's also possible to update specific [flake inputs][inputs] by specifying them in a space-separated list:

```yaml
name: update-flake-lock

on:
workflow_dispatch: # allows manual triggering
schedule:
Expand All @@ -51,17 +58,19 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@v1
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
- name: Update flake.lock
uses: DeterminateSystems/update-flake-lock@vX
uses: DeterminateSystems/update-flake-lock@main
with:
inputs: input1 input2 input3
```

## Example adding options to nix command

It is also possible to use specific options to the nix command in a space separated list:
It's also possible to use specific options to the `nix` command in a space-separated list:

```yaml
name: update-flake-lock
Expand All @@ -76,10 +85,12 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@v1
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
- name: Update flake.lock
uses: DeterminateSystems/update-flake-lock@vX
uses: DeterminateSystems/update-flake-lock@main
with:
nix-options: --debug --log-format raw
```
Expand All @@ -99,11 +110,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@v1
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
- name: Update flake.lock
id: update
uses: DeterminateSystems/update-flake-lock@vX
uses: DeterminateSystems/update-flake-lock@main
with:
inputs: input1 input2 input3
- name: Print PR number
Expand All @@ -128,11 +141,13 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@v1
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
- name: Update flake.lock
if: ${{ github.event_name != 'pull_request' }}
uses: DeterminateSystems/update-flake-lock@vX
uses: DeterminateSystems/update-flake-lock@main
with:
inputs: input1 input2 input3
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'
Expand All @@ -155,28 +170,31 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@v1
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
- name: Update flake.lock
uses: DeterminateSystems/update-flake-lock@vX
uses: DeterminateSystems/update-flake-lock@main
with:
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'
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
```

## Running GitHub Actions CI

GitHub Actions will not 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.
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.

### Without a Personal Authentication Token

Without using a Personal Authentication Token, close and reopen the pull request manually to kick off CI.

### With a Personal Authentication Token

By providing a Personal Authentication Token, the PR will be submitted in a way that bypasses this limitation (GitHub will essentially think it is the owner of the PAT submitting the PR, and not an Action).
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).
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:

```yaml
Expand All @@ -192,30 +210,36 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@v1
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
- name: Update flake.lock
uses: DeterminateSystems/update-flake-lock@vX
uses: DeterminateSystems/update-flake-lock@main
with:
token: ${{ secrets.GH_TOKEN_FOR_UPDATES }}
```

## With GPG commit signing

It's possible for the bot to produce GPG signed commits. Associating a GPG public key to a github user account is not 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.
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.

You can follow [Github's guide on 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.
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.

For the bot to produce signed commits, you will have 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).
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).

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.

If you want to sign using a subkey, you must specify the subkey fingerprint using the `gpg-fingerprint` input parameter.

You can find an example of how to using this action with commit signing below:
Here's an example of how to using this action with commit signing:

```yaml
name: update-flake-lock

on:
workflow_dispatch: # allows manual triggering
schedule:
Expand All @@ -227,10 +251,12 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@v1
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
- name: Update flake.lock
uses: DeterminateSystems/update-flake-lock@vX
uses: DeterminateSystems/update-flake-lock@main
with:
sign-commits: true
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
Expand All @@ -240,18 +266,19 @@ jobs:

## Custom PR Body

By default the generated PR body is set to be the following template:
By default, the generated PR body uses this template:

````handlebars
Automated changes by the [update-flake-lock](https://github.com/DeterminateSystems/update-flake-lock) GitHub Action.

```
````
{{ env.GIT_COMMIT_MESSAGE }}
````
```

### Running GitHub Actions on this PR

GitHub Actions will not run workflows on pull requests which are opened by a GitHub Action.
GitHub Actions doesn't run workflows on pull requests that are opened by a GitHub Action.

To run GitHub Actions workflows on this PR, run:

Expand All @@ -264,12 +291,14 @@ git push origin update_flake_lock_action --force
```
````

However you can customize it, with variable interpolation performed with [Handlebars](https://handlebarsjs.com/). This allows you to customize the template with the following variables:
- env.GIT_AUTHOR_NAME
- env.GIT_AUTHOR_EMAIL
- env.GIT_COMMITTER_NAME
- env.GIT_COMMITTER_EMAIL
- env.GIT_COMMIT_MESSAGE
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`

## Add assignees or reviewers

Expand All @@ -289,19 +318,29 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install Nix
uses: DeterminateSystems/nix-installer-action@v1
- name: Install Determinate Nix
uses: DeterminateSystems/nix-installer-action@main
with:
determinate: true
- name: Update flake.lock
uses: DeterminateSystems/update-flake-lock@vX
uses: DeterminateSystems/update-flake-lock@main
with:
pr-assignees: SomeGitHubUsername
pr-reviewers: SomeOtherGitHubUsername,SomeThirdGitHubUsername
```

## Contributing

Feel free to send a PR or open an issue if you find something functions unexpectedly! Please make sure to test your changes and update any related documentation before submitting your PR.
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.

### How to test changes

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.
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
Loading