Commit Graph
11414 Commits
Author SHA1 Message Date
Will Greenberg 4e535bb7e1 repin dependencies 2026-07-06 14:26:56 -07:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
0265abfa62 Bump msgpack from 1.1.2 to 1.2.1 in /tools (#10727)
Bumps [msgpack](https://github.com/msgpack/msgpack-python) from 1.1.2 to
1.2.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/msgpack/msgpack-python/releases">msgpack's
releases</a>.</em></p>
<blockquote>
<h2>v1.2.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Bump pypa/cibuildwheel from 4.0.0 to 4.1.0 in the all-dependencies
group by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/694">msgpack/msgpack-python#694</a></li>
<li>release v1.2.1 by <a
href="https://github.com/methane"><code>@​methane</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/698">msgpack/msgpack-python#698</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/msgpack/msgpack-python/compare/v1.2.0...v1.2.1">https://github.com/msgpack/msgpack-python/compare/v1.2.0...v1.2.1</a></p>
<h2>v1.2.0</h2>
<h2>What's Changed</h2>
<ul>
<li>relax setuptools version by <a
href="https://github.com/methane"><code>@​methane</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/652">msgpack/msgpack-python#652</a></li>
<li>update setuptools requirements to &gt;=78.1.1 by <a
href="https://github.com/methane"><code>@​methane</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/653">msgpack/msgpack-python#653</a></li>
<li>cython: freethreading_compatible by <a
href="https://github.com/methane"><code>@​methane</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/654">msgpack/msgpack-python#654</a></li>
<li>drop Python 3.9 by <a
href="https://github.com/methane"><code>@​methane</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/656">msgpack/msgpack-python#656</a></li>
<li>update cython and cibuildwheel by <a
href="https://github.com/methane"><code>@​methane</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/658">msgpack/msgpack-python#658</a></li>
<li>ci: add riscv64 manylinux/musllinux wheels by <a
href="https://github.com/justeph"><code>@​justeph</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/664">msgpack/msgpack-python#664</a></li>
<li>fix: check <code>unpack_callback_uint32</code> result by <a
href="https://github.com/KowalskiThomas"><code>@​KowalskiThomas</code></a>
in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/666">msgpack/msgpack-python#666</a></li>
<li>fix: re-raise existing exception when available by <a
href="https://github.com/KowalskiThomas"><code>@​KowalskiThomas</code></a>
in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/667">msgpack/msgpack-python#667</a></li>
<li>fix: check return code in <code>unpack_callback_int64</code> by <a
href="https://github.com/KowalskiThomas"><code>@​KowalskiThomas</code></a>
in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/665">msgpack/msgpack-python#665</a></li>
<li>Fixed README example by <a
href="https://github.com/vallsv"><code>@​vallsv</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/668">msgpack/msgpack-python#668</a></li>
<li>Bump the all-dependencies group with 6 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/669">msgpack/msgpack-python#669</a></li>
<li>ci: use ubuntu-slim for lint by <a
href="https://github.com/methane"><code>@​methane</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/670">msgpack/msgpack-python#670</a></li>
<li>fix: enforce <code>strict_map_key</code> with
<code>object_pairs_hook</code> by <a
href="https://github.com/KowalskiThomas"><code>@​KowalskiThomas</code></a>
in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/673">msgpack/msgpack-python#673</a></li>
<li>Raise DEFAULT_RECURSE_LIMIT from 511 to 1024 by <a
href="https://github.com/Copilot"><code>@​Copilot</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/676">msgpack/msgpack-python#676</a></li>
<li>fix: properly handle return codes in <code>pack_timestamp</code> by
<a
href="https://github.com/KowalskiThomas"><code>@​KowalskiThomas</code></a>
in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/672">msgpack/msgpack-python#672</a></li>
<li>fix: avoid memory leak when decoding invalid nested arrays by <a
href="https://github.com/KowalskiThomas"><code>@​KowalskiThomas</code></a>
in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/671">msgpack/msgpack-python#671</a></li>
<li>Add missing autoreset in Packer.pack_ext_type by <a
href="https://github.com/bysiber"><code>@​bysiber</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/663">msgpack/msgpack-python#663</a></li>
<li>Add no-GIL interpreter support by <a
href="https://github.com/clin1234"><code>@​clin1234</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/641">msgpack/msgpack-python#641</a></li>
<li>skip recursion limit test on free-threaded CPython builds by <a
href="https://github.com/methane"><code>@​methane</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/679">msgpack/msgpack-python#679</a></li>
<li>Fix Timestamp.from_datetime returning wrong value for pre-epoch
datetimes by <a
href="https://github.com/bysiber"><code>@​bysiber</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/662">msgpack/msgpack-python#662</a></li>
<li>Add 3.15 to CI by <a
href="https://github.com/clin1234"><code>@​clin1234</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/678">msgpack/msgpack-python#678</a></li>
<li>fix: use-after-free in <code>get_data_from_buffer</code> by <a
href="https://github.com/KowalskiThomas"><code>@​KowalskiThomas</code></a>
in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/677">msgpack/msgpack-python#677</a></li>
<li>change changelog format to markdown by <a
href="https://github.com/methane"><code>@​methane</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/680">msgpack/msgpack-python#680</a></li>
<li>Bump the all-dependencies group with 2 updates by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/684">msgpack/msgpack-python#684</a></li>
<li>Bump sys.setrecursionlimit within test_nest_limit_1024 by <a
href="https://github.com/clin1234"><code>@​clin1234</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/682">msgpack/msgpack-python#682</a></li>
<li>Guard <code>Packer</code> buffer protocol hooks with Cython critical
sections by <a
href="https://github.com/Copilot"><code>@​Copilot</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/686">msgpack/msgpack-python#686</a></li>
<li>Harden <code>Unpacker.__init__</code> re-entry cleanup to prevent
buffer/context leaks by <a
href="https://github.com/Copilot"><code>@​Copilot</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/687">msgpack/msgpack-python#687</a></li>
<li>release v1.2.0rc1 by <a
href="https://github.com/methane"><code>@​methane</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/681">msgpack/msgpack-python#681</a></li>
<li>Wheels CI hangs for MacOS Intel by <a
href="https://github.com/crusaderky"><code>@​crusaderky</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/689">msgpack/msgpack-python#689</a></li>
<li>Bump pypa/cibuildwheel from 3.4.1 to 4.0.0 in the all-dependencies
group by <a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/691">msgpack/msgpack-python#691</a></li>
<li>release v1.2.0 by <a
href="https://github.com/methane"><code>@​methane</code></a> in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/692">msgpack/msgpack-python#692</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/justeph"><code>@​justeph</code></a> made
their first contribution in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/664">msgpack/msgpack-python#664</a></li>
<li><a
href="https://github.com/KowalskiThomas"><code>@​KowalskiThomas</code></a>
made their first contribution in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/666">msgpack/msgpack-python#666</a></li>
<li><a href="https://github.com/vallsv"><code>@​vallsv</code></a> made
their first contribution in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/668">msgpack/msgpack-python#668</a></li>
<li><a
href="https://github.com/dependabot"><code>@​dependabot</code></a>[bot]
made their first contribution in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/669">msgpack/msgpack-python#669</a></li>
<li><a href="https://github.com/Copilot"><code>@​Copilot</code></a> made
their first contribution in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/676">msgpack/msgpack-python#676</a></li>
<li><a href="https://github.com/bysiber"><code>@​bysiber</code></a> made
their first contribution in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/663">msgpack/msgpack-python#663</a></li>
<li><a href="https://github.com/clin1234"><code>@​clin1234</code></a>
made their first contribution in <a
href="https://redirect.github.com/msgpack/msgpack-python/pull/641">msgpack/msgpack-python#641</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/msgpack/msgpack-python/blob/main/CHANGELOG.md">msgpack's
changelog</a>.</em></p>
<blockquote>
<h1>1.2.1</h1>
<p>Release Date: 2026-06-19</p>
<p>Fix a segfault when calling <code>Unpacker.unpack()</code> or
<code>Unpacker.skip()</code> after an unpacking failure.
But note that reusing the same <code>Unpacker</code> instance after an
unpacking failure is not supported.
Please create a new <code>Unpacker</code> instance instead.
GHSA-6v7p-g79w-8964</p>
<h1>1.2.0</h1>
<p>Release Date: 2026-06-11</p>
<ul>
<li>Support free threaded Python. <a
href="https://redirect.github.com/msgpack/msgpack-python/issues/654">#654</a>,
<a
href="https://redirect.github.com/msgpack/msgpack-python/issues/686">#686</a></li>
<li>Dropped support for Python 3.9. <a
href="https://redirect.github.com/msgpack/msgpack-python/issues/656">#656</a></li>
<li>Fix missing error checks in C code. <a
href="https://redirect.github.com/msgpack/msgpack-python/issues/665">#665</a>,
<a
href="https://redirect.github.com/msgpack/msgpack-python/issues/666">#666</a>,
<a
href="https://redirect.github.com/msgpack/msgpack-python/issues/667">#667</a>,
<a
href="https://redirect.github.com/msgpack/msgpack-python/issues/672">#672</a></li>
<li>Fix <code>strict_map_key</code> option didn't work for
<code>object_pairs_hook</code>. <a
href="https://redirect.github.com/msgpack/msgpack-python/issues/673">#673</a></li>
<li>Increase DEFAULT_RECURSE_LIMIT of Unpacker to 1024. <a
href="https://redirect.github.com/msgpack/msgpack-python/issues/676">#676</a></li>
<li>Fix memory leak when Unpacker returns error for invalid input. <a
href="https://redirect.github.com/msgpack/msgpack-python/issues/671">#671</a></li>
<li>Fix <code>Packer.pack_ext_type()</code> ignored
<code>autoreset</code> option. <a
href="https://redirect.github.com/msgpack/msgpack-python/issues/663">#663</a></li>
<li>Fix <code>Timestamp.from_datetime()</code> returning wrong value for
pre-epoch datetimes. <a
href="https://redirect.github.com/msgpack/msgpack-python/issues/662">#662</a></li>
<li>Fix use-after-free in <code>unpackb()</code> and
<code>Unpacker.unpack()</code> for non-contiguous input. <a
href="https://redirect.github.com/msgpack/msgpack-python/issues/677">#677</a></li>
<li>Fix possible memory leak when calling
<code>Unpacker.__init__()</code> several times. <a
href="https://redirect.github.com/msgpack/msgpack-python/issues/687">#687</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/msgpack/msgpack-python/commit/448d43f5dcca7b3a2b0810e161af0a6431d90071"><code>448d43f</code></a>
release v1.2.1 (<a
href="https://redirect.github.com/msgpack/msgpack-python/issues/698">#698</a>)</li>
<li><a
href="https://github.com/msgpack/msgpack-python/commit/2c56ddb5d0025ed481d962c0f5d62d19dec7476d"><code>2c56ddb</code></a>
Merge commit from fork</li>
<li><a
href="https://github.com/msgpack/msgpack-python/commit/0f4f350b6f3e80f24750422673424cce5d96e15d"><code>0f4f350</code></a>
Bump pypa/cibuildwheel from 4.0.0 to 4.1.0 in the all-dependencies group
(<a
href="https://redirect.github.com/msgpack/msgpack-python/issues/694">#694</a>)</li>
<li><a
href="https://github.com/msgpack/msgpack-python/commit/11ed0a5110c1920b85b7d24d9414f480983e0f16"><code>11ed0a5</code></a>
release v1.2.0 (<a
href="https://redirect.github.com/msgpack/msgpack-python/issues/692">#692</a>)</li>
<li><a
href="https://github.com/msgpack/msgpack-python/commit/c410a388c58d55091736e510cad064977a12cb8b"><code>c410a38</code></a>
Bump pypa/cibuildwheel from 3.4.1 to 4.0.0 (<a
href="https://redirect.github.com/msgpack/msgpack-python/issues/691">#691</a>)</li>
<li><a
href="https://github.com/msgpack/msgpack-python/commit/97ba6ca0d29c1e8a5b30112f13f37a4d6b3c4492"><code>97ba6ca</code></a>
skip ci: remove unneeded CIBW_SKIP option</li>
<li><a
href="https://github.com/msgpack/msgpack-python/commit/cdde1b0d6336caff4e82310c3c7d2b4c73f22d59"><code>cdde1b0</code></a>
Wheels CI hangs for MacOS Intel (<a
href="https://redirect.github.com/msgpack/msgpack-python/issues/689">#689</a>)</li>
<li><a
href="https://github.com/msgpack/msgpack-python/commit/5eb57e15455f5dd25001e97a7ef1170911dee104"><code>5eb57e1</code></a>
release v1.2.0rc1 (<a
href="https://redirect.github.com/msgpack/msgpack-python/issues/681">#681</a>)</li>
<li><a
href="https://github.com/msgpack/msgpack-python/commit/77395c19a50061238306df5ea10e67c5312ceff0"><code>77395c1</code></a>
Harden <code>Unpacker.__init__</code> re-entry cleanup to prevent
buffer/context leaks (...</li>
<li><a
href="https://github.com/msgpack/msgpack-python/commit/7df7136e20933fd3a498bd58bff7975a24790516"><code>7df7136</code></a>
Guard <code>Packer</code> buffer protocol hooks with Cython critical
sections (<a
href="https://redirect.github.com/msgpack/msgpack-python/issues/686">#686</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/msgpack/msgpack-python/compare/v1.1.2...v1.2.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=msgpack&package-manager=pip&previous-version=1.1.2&new-version=1.2.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/certbot/certbot/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-06 13:42:45 -07:00
dnscale-opsandGitHub f769e35e77 Add certbot-dns-dnscale to list of third-party plugins (#10621)
This PR adds `certbot-dns-dnscale` to the list of third-party plugins in
the documentation.

`certbot-dns-dnscale` enables DNS-01 challenge automation for domains
managed with the DNScale DNS service (https://dnscale.eu). The plugin is
Apache 2.0 licensed.

PyPI: https://pypi.org/project/certbot-dns-dnscale/
Source: https://github.com/dnscaleou/certbot-dns-dnscale

Verified with `pip install certbot-dns-dnscale`.
2026-06-24 12:52:45 -07:00
90f7404b19 Automate synchronizing github repo post-release (#10697)
This PR automates the release process steps to:
- update the candidate branch with the contents of the release branch on
the repo in the subfolder
- create a PR merging the candidate branch into main
- create a new branch without the version bump. usually `1.2.x`, unless
it's a point release.
- if it's a point release, create a PR merging the new branch without
version bumps into the existing `1.2.x` branch.

This draws from steps 10, 12, and 13. Step 10 should still have the code
to push to pypi, since that's a different though, though I think that
could move here in the future as well.

My general design philosophy was "error out instead of letting the
script put git into a bad state," with the exception of PR creation
which seemed safe to skip and continue.

I've also added some flags, mostly to make testing this easier, but
could be useful for re-running the script as well. Unlike
`promote_snaps` and `generate_community_forum_post`,
`synchronize_github_repo` is *not* idempotent. I do not think it should
be, because of how git works. I think if branches already exist and the
user really did want to synchronize branches again, the user would want
to know that it can't be done automatically, and should instead be told
what to do to make it possible, or how to skip the whole thing. I don't
think we should, for example, go ahead and create a PR based on an old
version of a branch and just skip the pulling step, or automatically
delete a branch.

In `_create_and_push_branch_without_version_bump`, if you have created
the branch then fail after, you'll rerun and then get a message saying
to delete the branch. I think that's nicer than automatically deleting
it, in case you want to inspect it.

successful test run:
```
$ git switch create-pr
Switched to branch 'create-pr'
$ RELEASE_GPG_KEY=[test key] tools/release.sh 4.35.0 4.36.0
[release output]
$ tools/finish_release.py --test-version 4.35.0 --skip-snaps
Creating PR to merge candidate-4.35.0 into main...
PR location: https://github.com/certbot/certbot/pull/10714
Creating branch without version bump commit named 4.35.x...
Created.
Generating announcement text for community forum post
release not found
Generating announcement text failed.
$ git switch 4.35.x
Switched to branch '4.35.x'
$ RELEASE_GPG_KEY=[test key] tools/release.sh 4.35.1 4.36.0
[release output]
$ tools/finish_release.py --test-version 4.35.1 --skip-snaps
Creating PR to merge candidate-4.35.1 into main...
PR location: https://github.com/certbot/certbot/pull/10715
Creating branch without version bump commit named point-candidate-4.35.1...
Created.
Creating PR to merge point-candidate-4.35.1 into 4.35.x...
PR location: https://github.com/certbot/certbot/pull/10716
Generating announcement text for community forum post
release not found
Generating announcement text failed.
```

then here's some errors and their outputs --

trying to run `finish_release.py` again:
```
$ tools/finish_release.py --test-version 4.34.1 --skip-snaps
Creating PR to merge candidate-4.35.1 into main...
PR to merge release changes into main already exists...skipping creation. To create a new PR, delete the old one on GitHub.
PR location: https://github.com/certbot/certbot/pull/10715
Creating branch without version bump commit named point-candidate-4.35.1...
Error running `git branch point-candidate-4.35.1`
Branch point-candidate-4.35.1 already exists. Delete it using `git branch -D point-candidate-4.35.1`.

fatal: a branch named 'point-candidate-4.35.1' already exists

To skip pushing updated branches to GitHub and creating PRs, run this script with the `--skip-github-sync` flag.
Traceback (most recent call last):
  File "/Users/erica/certbot/tools/finish_release.py", line 370, in <module>
    main(sys.argv[1:])
    ~~~~^^^^^^^^^^^^^^
  File "/Users/erica/certbot/tools/finish_release.py", line 366, in main
    synchronize_github_repo(version)
    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "/Users/erica/certbot/tools/finish_release.py", line 329, in synchronize_github_repo
    _create_and_push_branch_without_version_bump(version, branch_name)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/erica/certbot/tools/finish_release.py", line 280, in _create_and_push_branch_without_version_bump
    _run_silent_except_error(f'git branch {branch_name}'.split(), msg)
    ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/erica/certbot/tools/finish_release.py", line 209, in _run_silent_except_error
    raise e
  File "/Users/erica/certbot/tools/finish_release.py", line 201, in _run_silent_except_error
    process = subprocess.run(cmd, check=True, universal_newlines=True, capture_output=True)
  File "/Users/erica/.pyenv/versions/3.14.3/lib/python3.14/subprocess.py", line 577, in run
    raise CalledProcessError(retcode, process.args,
                             output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['git', 'branch', 'point-candidate-4.35.1']' returned non-zero exit status 128.
```

local changes to branch:
```
$ touch test_file.txt
$ git add -A 
$ tools/finish_release.py --test-version 4.35.1 --skip-snaps
Error running `git diff --quiet HEAD`
You have uncommitted changes that will be deleted. Stash your changes before rerunning this script.


To skip pushing updated branches to GitHub and creating PRs, run this script with the `--skip-github-sync` flag.
Traceback (most recent call last):
  File "/Users/erica/certbot/tools/finish_release.py", line 370, in <module>
    main(sys.argv[1:])
    ~~~~^^^^^^^^^^^^^^
  File "/Users/erica/certbot/tools/finish_release.py", line 366, in main
    synchronize_github_repo(version)
    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "/Users/erica/certbot/tools/finish_release.py", line 315, in synchronize_github_repo
    _run_silent_except_error('git diff --quiet HEAD'.split(), message)
    ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/erica/certbot/tools/finish_release.py", line 209, in _run_silent_except_error
    raise e
  File "/Users/erica/certbot/tools/finish_release.py", line 201, in _run_silent_except_error
    process = subprocess.run(cmd, check=True, universal_newlines=True, capture_output=True)
  File "/Users/erica/.pyenv/versions/3.14.3/lib/python3.14/subprocess.py", line 577, in run
    raise CalledProcessError(retcode, process.args,
                             output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['git', 'diff', '--quiet', 'HEAD']' returned non-zero exit status 1.
```

branch doesn't match the one on github (shows that stdout is now also
printed on error):
```
$ cd releases/le.4.35.1.89372/
$ git commit --amend # change the message
[candidate-4.35.1 8d34a67a4] Bump version to 4.36.0 new message
 Date: Tue Jun 23 10:47:56 2026 -0700
 20 files changed, 20 insertions(+), 20 deletions(-)
$ cd ../../
$ tools/finish_release.py --test-version 4.35.1 --skip-snaps
Error running `git push origin candidate-4.35.1`
To delete the branch on GitHub, run `git push origin --delete candidate-4.35.1`.

To https://github.com/certbot/certbot.git
 ! [rejected]            candidate-4.35.1 -> candidate-4.35.1 (non-fast-forward)
error: failed to push some refs to 'https://github.com/certbot/certbot.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. If you want to integrate the remote changes,
hint: use 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

To skip pushing updated branches to GitHub and creating PRs, run this script with the `--skip-github-sync` flag.
Traceback (most recent call last):
  File "/Users/erica/certbot/tools/finish_release.py", line 370, in <module>
    main(sys.argv[1:])
    ~~~~^^^^^^^^^^^^^^
  File "/Users/erica/certbot/tools/finish_release.py", line 366, in main
    synchronize_github_repo(version)
    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "/Users/erica/certbot/tools/finish_release.py", line 317, in synchronize_github_repo
    _sync_candidate_from_temp_to_origin(version)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  File "/Users/erica/certbot/tools/finish_release.py", line 247, in _sync_candidate_from_temp_to_origin
    _run_silent_except_error(command_str.split(), message)
    ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/erica/certbot/tools/finish_release.py", line 209, in _run_silent_except_error
    raise e
  File "/Users/erica/certbot/tools/finish_release.py", line 201, in _run_silent_except_error
    process = subprocess.run(cmd, check=True, universal_newlines=True, capture_output=True)
  File "/Users/erica/.pyenv/versions/3.14.3/lib/python3.14/subprocess.py", line 577, in run
    raise CalledProcessError(retcode, process.args,
                             output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['git', 'push', 'origin', 'candidate-4.35.1']' returned non-zero exit status 1.
```

I've hit basically all of the errors with text at some point during
testing, but can recreate them if you'd like.

Once this is merged, I'll update the release instructions and delete the
test branches and PRs.

---------

Co-authored-by: Will Greenberg <ifnspifn@gmail.com>
Co-authored-by: Will Greenberg <willg@eff.org>
2026-06-23 11:21:41 -07:00
AlexisandGitHub d2340ab54c [TOOLING] Delete notify_weekly.yaml file (#10705)
Removing this uneeded workflow. This was disabled in the job runs
already. The file still needs to be deleted.

Can be replaced with "saved views" queries if any one on the team would
like to use them:

`is:issue is:open sort:comments-desc updated:>@today-1w org:certbot` and
`is:pr is:open updated:>@today-1w org:certbot`
2026-06-22 12:05:24 -07:00
ohemorangeandGitHub 184091fa3e Add temp remote and fetch temp from release folder in release script (#10699)
I don't understand why this wasn't already in the release script, and
can see no reason to not add it. This doesn't do anything publicly or
permanently, it just fetches the branch from the release folder. If we
need to add the previous temp, it's right there in a `releases.*.bak`
folder.

This is step 8 of the release process, and should be deleted when this
is merged.

I did test this and it worked.
2026-06-17 11:58:45 -07:00
94f610ee3b Get log path from process output to once again print snapcraft logs (#10674)
Fixes https://github.com/certbot/certbot/issues/10662

Launchpad is failing, so this should make testing this code pretty easy.
There is only one log per target, no matter how many arches, so we can
skip the per-arch code.

---------

Co-authored-by: Will Greenberg <willg@eff.org>
2026-06-11 12:48:40 -07:00
ohemorangeandGitHub a966701c94 Remove Azure references from contributing.rst (#10673) 2026-06-10 17:22:33 -07:00
2a842d8dd5 docs: fix CONTRIBUTING.md formatting inconsistencies (#10672)
## Description
removed trailing whitespace on 2 line(s) in `CONTRIBUTING.md`

## Type of change
- [x] Documentation improvement

## Checklist
- [x] I have read the CONTRIBUTING guide
- [x] My changes follow the existing style

Co-authored-by: Mulky Malikul Adhr <mulkymalikuldhrs@users.noreply.github.com>
2026-06-10 23:08:00 +00:00
ohemorangeandGitHub dda67bfb9a Get version number from github instead of azure pipelines in finish_release.py (#10669) 2026-06-10 15:33:22 -07:00
9cacd51003 in release script, check that certbot's virtual environment isn't activated and deactivate it if it is (#10658)
Item 1 of https://github.com/certbot/certbot/issues/10600

Once this is merged, the [release
instructions](https://github.com/EFForg/certbot-misc/wiki/The-Mystical-Release-Process)
should be updated to no longer say "Make sure Certbot's virtual
environment isn't activated."

Why in `release.sh` instead of `_release.sh`? This seemed to be the
"check the environment status" file.

`venv/bin/activate` does several things.
1. create `deactivate` shell function
2. create `_OLD_VIRTUAL_PATH` and modify `PATH` to prepend `venv/bin`
location. `_OLD_VIRTUAL_PATH` isn't exported.
3. unset `PYTHONHOME` and store the old `PYTHONHOME` in
`_OLD_VIRTUAL_PYTHONHOME`, again not exported.
4. export `VIRTUAL_ENV_PROMPT`
5. call `hash -r 2> /dev/null` for some sort of edge case
6. set `VIRTUAL_ENV`
7. change the prompt appearance (PS1)

1, 4, and 7 don't need to be undone. 2, 4, and 6 are managed here
manually.

3 is the hard one, since we don't have access to
`_OLD_VIRTUAL_PYTHONHOME`, and there's not a great way of grabbing it
from the shell. One thought I had was to modify `venv/bin/activate` in
`venv.py` so that it is exported. That's possible, but at least for me,
`PYTHONHOME` isn't set in the first place and so it doesn't seem worth
doing that. Given that this script only needs to run on a few people's
machines, I would say we can hold off on doing that if and until it
becomes necessary.

Added some prints and an `exit 0` after the relevant code in the script
to test:

```bash
$ RELEASE_GPG_KEY=dontmatter tools/release.sh 1.2.3 4.5.6
$ source venv/bin/activate
(venv) $ RELEASE_GPG_KEY=dontmatter tools/release.sh 1.2.3 4.5.6
Deactivating venv...
previous path:
/Users/erica/certbot/venv/bin:/opt/homebrew/opt/coreutils/libexec/gnubin:[rest of path omitted]
new path:
/opt/homebrew/opt/coreutils/libexec/gnubin:[rest of path omitted]
(venv) $ printenv PATH
/Users/erica/certbot/venv/bin:/opt/homebrew/opt/coreutils/libexec/gnubin:[rest of path omitted]
```

---------

Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
2026-06-10 14:07:43 -07:00
ohemorangeandGitHub 00cdb6f22a Don't build epubs in readthedocs (#10671)
There's no way anyone is using these...

https://github.com/certbot/certbot/pull/9762 was just basing off of
readthedocs' defaults.https://github.com/certbot/certbot/pull/9762 was
just basing off of readthedocs' defaults.

Probably no one is using pdf either, but definitely no one is using
epubs. This is the more cautious version of
https://github.com/certbot/certbot/pull/10670

```
$ git grep epub
acme/docs/Makefile:.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
acme/docs/Makefile:     @echo "  epub       to make an epub"
acme/docs/Makefile:epub:
acme/docs/Makefile:     $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
acme/docs/Makefile:     @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
acme/docs/make.bat:     echo.  epub       to make an epub
acme/docs/make.bat:if "%1" == "epub" (
acme/docs/make.bat:     %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
acme/docs/make.bat:     echo.Build finished. The epub file is in %BUILDDIR%/epub.
certbot/docs/Makefile:.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
certbot/docs/Makefile:  @echo "  epub       to make an epub"
certbot/docs/Makefile:epub:
certbot/docs/Makefile:  $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
certbot/docs/Makefile:  @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
certbot/docs/make.bat:  echo.  epub       to make an epub
certbot/docs/make.bat:if "%1" == "epub" (
certbot/docs/make.bat:  %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
certbot/docs/make.bat:  echo.Build finished. The epub file is in %BUILDDIR%/epub.
```
2026-06-10 14:04:18 -07:00
ohemorangeandGitHub fbe3cbdb6e Switch readme.rst badge to GHA nightly workflow status (#10668) 2026-06-10 12:08:27 -07:00
cb02885928 Migrate release pipeline from azure to github actions (#10643)
Related to https://github.com/certbot/certbot/issues/10581

Following up on https://github.com/certbot/certbot/pull/10631,
https://github.com/certbot/certbot/pull/10622, and
https://github.com/certbot/certbot/pull/10634, this PR converts the
release
[pipeline](https://dev.azure.com/certbot/certbot/_build?definitionId=3)
from Azure to Github Actions.

While this is the last migration PR, I don't think we should close the
issue, as we're still using launchpad for armhf builds. I plan to
continue investigating that and at minimum write up my findings.

To test
[notifications](https://opensource.eff.org/eff-open-source/pl/nfgh6obi8tfqikn4ydp7dshakr)
and creating a [github
release](https://github.com/ohemorange/Things-that-are-gr9/releases/tag/v1.0.19),
I ran workflows that no-oped most the other jobs [in a test
repo](https://github.com/ohemorange/Things-that-are-gr9/actions/runs/25938082721)
(I've made minor changes to names and comments since then, but no code
changes). Everything else is basically the same as nightly, with
different tags. For the docker deployment, `${{ github.ref_name }}` is
the tag name, so `v1.2.3`.

Why not parametrize the tests a bit more, by putting an `env` at the top
with `dockerTag: ${{ github.ref_name }}` and `snapReleaseChannel: beta`?
Because the `env` context is [not
available](https://docs.github.com/en/actions/reference/workflows-and-actions/contexts#context-availability)
to `with`; only `github, needs, strategy, matrix, inputs, vars`. We
could use `vars`, by creating `docker_tag_release` or whatever in the
[variable
section](https://github.com/certbot/certbot/settings/variables/actions)
of the repo settings by using the web interface, but that seems worse to
me than having it in the file but twice.

You will note that the contents of `release.yml` are very similar to
`nightly.yml`. While it would be nice to factor that out and reuse the
code, github actions would then flatten everything in the grouped code
together, making the results much harder to check. You can see what that
flattening would look like
[here](https://github.com/ohemorange/Things-that-are-gr9/actions/runs/25941524972)
(if we put them all in one workflow). Currently, it will look something
like
[this](https://github.com/certbot/certbot/actions/runs/25688414262),
which is much more readable.

We could split it into "stages" like we had in azure pipelines (probably
1. standard and extended tests (and changelog?), 2. snap package and
deploy (depend on tests), 3. docker package and deploy (depend on
tests), 4. github release (depend on snap package and deploy), 5-6.
notify (depend on github release)), but in addition to a minor slowdown
(currently github release only depends on snap and docker package, not
deploy, just so we're trying to do all the deployments simultaneously
and not partially in case of build failures), it would still be only
like three fewer jobs, since we'd still want all the info passing and
dependency relationships.

While it would be nice from a UX perspective to group the two
notification jobs together, you can't do that cleanly using the built-in
`if` key, and I don't think it's worth switching to a messier github
api-based version just to group them.

For mattermost notifications, we currently get the person to tag by
running `AUTHOR_NAME="$(git log -1 --pretty=format:'%an')"` and mapping
that to mattermost username. We could instead use `github.actor` to get
the github handle, and map that instead. I didn't bother since we
already have working, tested code, but can if a reviewer thinks it's
worth it.

---------

Co-authored-by: Will Greenberg <willg@eff.org>
Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
2026-06-10 11:43:49 -07:00
ohemorangeandGitHub e9273a1269 Specify fuse3:armhf to fix failing armhf tests (#10667)
These tests were turned off in
https://github.com/certbot/certbot/pull/10665

See checks tab; full suite is passing with these changes.
2026-06-09 14:22:30 -07:00
ohemorangeandGitHub 724ee110d8 Automatically create a candidate-$VERSION-NUM branch in the release script (#10657)
Item 3 of https://github.com/certbot/certbot/issues/10600

If this is merged, the [release
instructions](https://github.com/EFForg/certbot-misc/wiki/The-Mystical-Release-Process)
should be updated to no longer manually create the branch.

I intentionally do not add error checking to `git switch -c` because I
think if the command fails, the script should fail, and we should
manually fix the error, which will probably be something like `fatal: a
branch named 'candidate-5.5.0' already exists` which is clear enough.

I do check if we're already on the intended branch, because we may want
to be able to rerun the release script without having to switch back to
main and delete the candidate branch each time.

I remove the check later on because I believe it is a holdover from a
previous version where it was possible for `RELEASE_BRANCH` to be not
equal to `candidate-$version`, but even in the existing code before the
other change, that should not be possible.
2026-06-09 13:02:51 -07:00
ohemorangeandGitHub 6652cffccb Generate and print post-release community forum post text in finish_release.py (#10659)
Item 5 of https://github.com/certbot/certbot/issues/10600

When this is merged, the setup section of the [release
process](https://github.com/EFForg/certbot-misc/wiki/The-Mystical-Release-Process)
should be modified.
- `gh` should be added to os packages for mac and debian
- A new step should be added: "Run `gh auth login` and log into a GitHub
account." Technically any account should work here.

The contents of the step saying to post to the community forum should be
shortened to say something like "copy the output from the terminal." We
could add the link to the client-dev tag here, but personally I think
it's easiest to just keep it in the release instructions.
2026-06-08 16:11:52 -07:00
ohemorangeandGitHub be90a1199d Temporarily turn off failing tests so we don't get failure notifications (#10665)
These tests are failing because the runner migrated ownership to github,
and that somehow broke it even though it wasn't supposed to. They're not
responding to issues [other
than](https://github.com/actions/runner-images/issues/14100) "a CVE or
vulnerability" during the transition period (ends june 12). Let's just
turn these off for now. We weren't even running this at all in azure,
it's fine.
2026-06-08 12:22:34 -07:00
Erik MorénandGitHub da65ffb227 Fix/10598 nginx comment in multiline directive (#10651)
Fixes #10598.

## Pull Request Checklist

- [x] The Certbot team has recently expressed interest in reviewing a PR
for this. If not, this PR may be closed due our limited resources and
need to prioritize how we spend them.
- [x] If you used AI to create this PR, you have done a self-review of
all AI-generated code and disclosed that your contribution was
AI-generated per [EFF's AI-generated contribution
policy](https://www.eff.org/about/opportunities/volunteer/coding-with-eff).
You assert you have thoroughly understood, reviewed, and tested your
entire submission.
- [x] If the change being made is to a [distributed
component](https://certbot.eff.org/docs/contributing.html#code-components-and-layout),
add a description of your change to the `newsfragments` directory. This
should be a file called `<title>.<type>`, where `<title>` is either a
GitHub issue number or some other unique name starting with `+`, and
`<type>` is either `changed`, `fixed`, or `added`.
* For example, if you fixed a bug for issue number 42, create a file
called `42.fixed` and put a description of your change in that file.
- [x] Add or update any documentation as needed to support the changes
in this PR.
- [x] Include your name in `AUTHORS.md` if you like.
2026-06-01 15:22:17 -07:00
ohemorangeandGitHub 750b9997de Upgrade action-mattermost-notify action to use node 24 (#10647)
Makes the warnings about the upcoming Node 20 deprecation go away.
2026-05-19 13:07:31 -07:00
ohemorangeandGitHub ab34e5dcf7 Check to see if launchpad snap build put html in the .snap file (#10646)
Fixes #10617

I restructured the conditionals to avoid too much nesting. This should
have the same effect, just with the additional check conditioned on all
the target snap files being available. Here is the logic I used for the
restructuring:

start

```python
dump_output = exit_code != 0 or failed_archs
if exit_code == 0 and not failed_archs:
    # We expect to have all target snaps available, or something bad happened.
    snaps_list = glob.glob(join(workspace, '*.snap'))
    if not len(snaps_list) == len(archs):
        print('Some of the expected snaps for a successful build are missing '
              f'(current list: {snaps_list}).')
        dump_output = True
    else:
        build_success = True
        break
```

note that `(exit_code == 0 and not failed_archs) == not (exit_code != 0
or failed_archs) == not dump_output`

```python
dump_output = exit_code != 0 or failed_archs
if not dump_output:
    # We expect to have all target snaps available, or something bad happened.
    snaps_list = glob.glob(join(workspace, '*.snap'))
    if not len(snaps_list) == len(archs):
        print('Some of the expected snaps for a successful build are missing '
              f'(current list: {snaps_list}).')
        dump_output = True
    else:
        build_success = True
        break
```

distribute the if

```python
dump_output = exit_code != 0 or failed_archs
snaps_list = glob.glob(join(workspace, '*.snap'))
if not dump_output and (not len(snaps_list) == len(archs)):
    # We expect to have all target snaps available, or something bad happened.
    print('Some of the expected snaps for a successful build are missing '
          f'(current list: {snaps_list}).')
    dump_output = True
    
if not dump_output and (len(snaps_list) == len(archs)): # redundant; if it were false, we would have changed dump_output right above this
    build_success = True
    break
```

remove redundant check

```python
dump_output = exit_code != 0 or failed_archs
snaps_list = glob.glob(join(workspace, '*.snap'))
if not dump_output and (not len(snaps_list) == len(archs)):
    # We expect to have all target snaps available, or something bad happened.
    print('Some of the expected snaps for a successful build are missing '
          f'(current list: {snaps_list}).')
    dump_output = True
    
if not dump_output:
    build_success = True
    break
```

As this shows, we can now add additional checks that only happen if we
think we're in danger of succeeding based on checks thus far, and simply
change `dump_output` to `True` if the additional check fails.

You can see the build step failing when the [file contains
html](https://github.com/certbot/certbot/compare/html-problem...refs/heads/test-html-problem-2)
at
https://github.com/certbot/certbot/actions/runs/26071811878/job/76654623490#step:5:42
2026-05-19 12:27:11 -07:00
Will GreenbergandGitHub 7440ff40dd repin dependencies (#10645)
This pulls in an updated urllib3, which addresses two security vulns
found by dependabot:
* https://github.com/certbot/certbot/security/dependabot/133
* https://github.com/certbot/certbot/security/dependabot/135
2026-05-18 12:49:59 -07:00
ohemorangeandGitHub 1efd73e064 Migrate nightly test pipeline from azure pipelines to github actions (#10634)
Related to https://github.com/certbot/certbot/issues/10581

Following up on #10631 and
https://github.com/certbot/certbot/pull/10622, this PR converts the
`nightly`
[pipeline](https://dev.azure.com/certbot/certbot/_build?definitionId=5)
from Azure to Github Actions.

`schedule` and `workflow_dispatch` triggers only work on merged
branches, not PRs. To see these tests running, I temporarily added a
`push` trigger in commit
[a2e9c43](https://github.com/certbot/certbot/pull/10634/commits/a2e9c4303e4a9549562aaa460f15787020f25d0d).
You can see the results of those tests
[here](https://github.com/certbot/certbot/actions/runs/25688414262).

I did not split each file into its own commit this time because I feel
like the general idea is clear. The relevant files in azure pipelines to
reference are:
- the deleted `.azure-pipelines/nightly.yml` -->
`.github/workflows/nightly.yml`
- `.azure-pipelines/templates/jobs/common-deploy-jobs.yml` -->
`.github/workflows/deploy_docker_images.yml` and
`.github/workflows/deploy_snaps.yml`
- `.azure-pipelines/templates/stages/changelog-stage.yml` -->
`.github/workflows/create_changelog.yml`

I chose to split `common-deploy-jobs` into `deploy_docker_images` and
`deploy_snaps`. This is because the docker arm32v6 build takes a long
time, but uploading to docker is quick, while the armhf snaps build
varies but is often quicker, but uploading the snaps can take some time.
By splitting them, we can specify the dependencies more precisely, and
hopefully shave some time off the total. Without the split, tests took
[53 minutes
total](https://github.com/certbot/certbot/actions/runs/25684264622).
After the split, tests took [33 minutes
total](https://github.com/certbot/certbot/actions/runs/25688414262)!

As before, the "nightly deploy stage" from azure has been omitted for
clarity.

`rerun.yml` did not exist before. There's not a great built-in way to
rerun individual jobs in github actions, which I wanted for the snap
builds specifically, since other timeouts can still happen. I could have
made an action or additional workflow and wrapped that in a script to
retry it, but I figured actually it's nicer to have the ability to rerun
anything. This is equivalent to clicking "rerun all failed jobs," which
I feel is usually what we want. Unfortunately, I am pretty sure that to
test it, the rerun script will need to be merged first, since it relies
on `workflow_dispatch`.

You can see that packages were successfully uploaded to
[dockerhub](https://hub.docker.com/r/certbot/certbot/tags) and the [snap
store](https://dashboard.snapcraft.io/stores/snaps/); looking at the
timestamps is probably the easiest way to confirm (about 11:45am
Monday).
2026-05-18 10:56:38 -07:00
Brad WarrenandGitHub 43f78f9c3c Merge pull request #10641 from certbot/candidate-5.6.0
update files from 5.6.0 release
2026-05-11 10:34:47 -07:00
Brad Warren b7024352cc Bump version to 5.7.0 2026-05-11 08:57:00 -07:00
Brad Warren d16404d898 Remove built packages from git 2026-05-11 08:57:00 -07:00
Brad Warren 03b5cf3cb0 Release 5.6.0 v5.6.0 2026-05-11 08:56:58 -07:00
Brad Warren cf0e0f6783 Update changelog for 5.6.0 release 2026-05-11 08:56:17 -07:00
9339d23aa1 Migrate extended/full/test-* tests from azure pipelines to github actions (#10631)
Related to https://github.com/certbot/certbot/issues/10581

Following up on #10622, this PR converts the `full-test-suite`
[pipeline](https://dev.azure.com/certbot/certbot/_build?definitionId=4)
from Azure to Github Actions.

Nightly test changes for context not included in this PR are available
[here](https://github.com/certbot/certbot/compare/test-convert-full-pipeline...convert-all-pipelines).

Since this branch is named `test-convert-full-pipeline`, these tests
will show up in the checks section of this PR.

The major changes I made here are splitting the docker and snaps tests
for a better github actions UX, and removing the intermediate "stage"
file, since stages are not a concept in GHA. This means that we get the
nice dropdowns for the different categories on the left bar of the [test
run
page](https://github.com/certbot/certbot/actions/runs/25139155528/job/73684692548)
so it's easier to see each type of test. The very slight drawback is
that the four jobs listed in `.github/workflows/full_test_suite.yml` do
need to be duplicated in `nightly.yml`, but that's a reasonable tradeoff
to me.

Also, we now test our certbot and dns plugin snaps on all architectures
for the first time (using `dpkg --add-architecture` to run armhf tests
on an arm64 machine), which is very nice and in my opinion worth the
very slightly extra time and code.

In this PR, we build arm64 and amd64 snaps directly on github's runners.
armhf snaps are built using launchpad as before. This makes the workflow
file a little long. There are perhaps some micro-optimizations for code
deduplication I could make, like creating an action to install
dependencies based on the architecture, but I don't think it's super
worth it, especially since the dependencies vary enough that we'd still
need some code (for example, even between installing deps for certbot
and dns runs, we'd still need to additionally install `nginx-light`).

A very slight potential time improvement we could make here would be to
optionally depend on the different architectures before running their
respective tests. I'm not sure if this can be done without writing
different jobs, and since once those jobs start they run in parallel, it
didn't really seem worth looking into for me. I am of course open to
alternate points of view here and in general.

Another potential change to bring the two build strategies more in line
would be to stop using the python script to send off all the launchpad
builds, and instead put each in a separate, matrixed job like the github
jobs. We could even continue retrying the builds within each job. This
would mean that if one dns plugin build happens to fail three times, all
the builds wouldn't have to be retried. While I think that's not the
worst idea, I personally think that belongs in a separate PR, as this PR
is already quite long.

Speaking of the PR length, I can undo the changes made here to build
arm64 and amd64 snaps on github actions, to have a simpler
conversion-only PR to review. Some of the choices I made here,
particularly around UX, were based on the fact that the jobs would look
like this, so it might not be as clear why I made those choices, but if
it's easier to review it's no problem to put it back. I could also
remove the code that tests the other snaps since it's new, but I figured
it'd be nice to show that they are in fact being built correctly, since
otherwise the built snaps wouldn't be consumed anywhere.

---------

Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
2026-05-08 18:03:26 -07:00
Brad WarrenandGitHub 208ff18405 remove readthedocs requirements files (#10639)
as those with access can see
[here](https://github.com/certbot/certbot/security/dependabot),
dependabot recently got confused by our readthedocs.org.requirements.txt
files

my read of the situation looking at output like
[this](https://github.com/certbot/certbot/actions/runs/25448194392/job/74658002711#step:3:72)
is dependabot expects paths to local packages to be relative to the
requirements file while readthedocs wants them to relative to the root
of the repo. (i tested changing the paths to be relative to the
requirements file and [readthedocs was not
happy](https://app.readthedocs.org/projects/eff-certbot/builds/32592654/))

to deal with this, we could create a .github/dependabot.yaml file and
set
[exclude-paths](https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference#exclude-paths-),
but it strikes me as even simpler and cleaner to just remove these files
if possible

our use of these readthedocs.org.requirements.txt files dates back to
https://github.com/certbot/certbot/pull/261, long before readthedocs
added its .readthedocs.yaml files which we much more recently adopted in
https://github.com/certbot/certbot/pull/9762. inspired by the
suggestions at
https://github.com/readthedocs/readthedocs.org/issues/7258 to workaround
the lack of support for constraints files, i took the approach of
[customizing the build
process](https://docs.readthedocs.com/platform/stable/build-customization.html)

we luckily don't have to override any of the existing readthedocs build
steps. for reference, the build process is described
[here](https://docs.readthedocs.com/platform/stable/builds.html),
however, if you compare the readthedocs build logs from
[main](https://app.readthedocs.org/projects/eff-certbot/builds/32568259/)
and [this
branch](https://app.readthedocs.org/projects/eff-certbot/builds/32597332/),
you'll see they are essentially identical

in addition to the certbot build, i also triggered
[acme](https://app.readthedocs.org/projects/acme-python/builds/32597344/)
and
[dns-cloudflare](https://app.readthedocs.org/projects/certbot-dns-cloudflare/builds/32597347/)
builds from this branch which passed as well

i personally think we can get away with just one review on this PR, but
if the reviewer disagrees, by all means request a second one
2026-05-08 13:59:22 -07:00
c8ebcb49bd Migrate certbot-dns-cloudflare to cloudflare 4.x SDK (#10587)
## Summary

- Migrate `certbot-dns-cloudflare` from the archived `python-cloudflare`
2.x library (`import CloudFlare`) to the actively maintained Cloudflare
Python SDK 4.x (`import cloudflare`)
- Update all API calls to the new SDK surface:
`dns.records.create/list/delete`, `zones.list`, typed response objects
instead of dicts
- Replace `CloudFlare.exceptions.CloudFlareAPIError` with
`cloudflare.APIStatusError` and extract CF error codes from
`response.json()`
- Bump dependency from `cloudflare>=2.19, <2.20` to `cloudflare>=4.0`
- Update oldest pinning from `cloudflare 2.19` to `4.0.0`
- Update all test mocks and assertions accordingly

Fixes #9938

## API Migration

| Operation | Old 2.x | New 4.x |
|---|---|---|
| Import | `import CloudFlare` | `import cloudflare` |
| Client (token) | `CloudFlare.CloudFlare(token=t)` |
`cloudflare.Cloudflare(api_token=t)` |
| Client (key) | `CloudFlare.CloudFlare(email, key)` |
`cloudflare.Cloudflare(api_email=e, api_key=k)` |
| List zones | `cf.zones.get(params={...})` → `list[dict]` |
`cf.zones.list(name=n)` → iterable of Zone objects |
| Create record | `cf.zones.dns_records.post(zone_id, data={...})` |
`cf.dns.records.create(zone_id=id, **data)` |
| List records | `cf.zones.dns_records.get(zone_id, params={...})` |
`cf.dns.records.list(zone_id=id, type=..., ...)` |
| Delete record | `cf.zones.dns_records.delete(zone_id, record_id)` |
`cf.dns.records.delete(dns_record_id=rid, zone_id=zid)` |
| Exceptions | `CloudFlare.exceptions.CloudFlareAPIError` |
`cloudflare.APIStatusError` |

## Test plan

- [x] All 20 existing tests pass with updated mocks
- [x] Credentials INI file format is unchanged — no user-facing config
changes
- [x] Live dry-run renewal tested successfully across 5 domains

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Ember <BeigeBox@users.noreply.github.com>
Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
2026-05-06 09:35:38 -07:00
9ec4105ff3 Migrate PR tests from azure pipelines to github actions (#10622)
Related to https://github.com/certbot/certbot/issues/10581

This is the first step of migrating to github actions.

Nightly and full tests have been converted on branch
`convert-all-pipelines`; you can see additional changes to do those for
context
[here](https://github.com/certbot/certbot/compare/convert-pr-tests...convert-all-pipelines).

Some notes: 
- All github workflows must be flat in the `.github/workflows/`
directory.
- Github actions doesn't have a concept of "stages." Instead, it
generates a dependency graph, which is kind of nice. You can see an
example of a more complicated one
[here](https://github.com/certbot/certbot/actions/runs/24580625688).
- I don't know why the actions in the left bar (under Actions tab -->
All workflows) are using the path instead of the listed name. I suspect
it has something to do with not being run on main. Once it's merged, if
the name doesn't change, we can delete previous runs and that will clear
the entry on the left.
- "permissions" is for the fine-grained github PAT. contents: read is
needed for the "checkout" action, which basically everything uses. it's
still best practice to define per-workflow. it can also be defined
per-job, but per-workflow seemed nicer to me.
[This](https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#permissions)
is the best permissions explanation I've found; [some
actions](https://github.com/actions/checkout) mention what permissions
they need.
- For definitions of the keywords to `on`, see
[here](https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows).
- Some of the potential inputs in tox steps are not used in this PR
because we're not running the AWS tests. It seemed messier to take them
out here and put them back later when the extended tests need them, but
I can do that on request.

We currently have a `main` [protection
rule](https://github.com/certbot/certbot/settings/branch_protection_rules/5466)
set that Azure pipelines PR test suite must pass before merging.
Obviously I don't want to turn that off before this PR is reviewed. In
github actions, it can only require a specific job to pass, though you
can have multiple. To address this, I've created a job that requires all
other jobs to pass, and that can be set at the required job. We probably
do not want to list every individual job, as that includes every job
generated by a matrix strategy. To find it in the protection rules page,
start typing "PR test suite success" and it will show up.

---------

Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
Co-authored-by: Will Greenberg <willg@eff.org>
2026-04-28 12:34:42 -07:00
ohemorangeandGitHub 6114144bd2 Merge pull request #10630 from certbot/lexicon-repin
Repin dependencies to pull in updated dns-lexicon, which contains the fix for OVH challenge deletion bug
2026-04-28 12:28:31 -07:00
Brad WarrenandGitHub 3a5c92c6be update base docker image (#10620)
fixes https://github.com/certbot/certbot/issues/10619

you can see docker builds and tests passing on this change at
https://dev.azure.com/certbot/certbot/_build/results?buildId=10360&view=results

i'm also creating a calendar event for us so we remember to keep this
updated in the future

i don't think this PR requires two reviews
2026-04-13 12:21:34 -07:00
Brad WarrenandGitHub 0cc0844f2c Release certbot 5.5.0 (#10616) 2026-04-07 14:29:50 -07:00
Erica Portnoy fc91823888 Bump version to 5.6.0 2026-04-07 09:38:18 -07:00
Erica Portnoy 6a7443f654 Remove built packages from git 2026-04-07 09:38:18 -07:00
Erica Portnoy 82dda45352 Release 5.5.0 v5.5.0 2026-04-07 09:38:17 -07:00
Erica Portnoy 171cb29183 Update changelog for 5.5.0 release 2026-04-07 09:37:45 -07:00
0eb8af20a5 Add @ing mattermost notifications to release build successes and failures (#10604)
Fixes https://github.com/certbot/certbot/issues/10599

This approach creates a new azure stage Notify and posts to the
mattermost webhook directly from within azure.

The python script uses the azure rest api to get the status of the
Deploy stage specifically. This will be failed if it failed, or skipped
if a previous stage failed, or abandoned if it timed out.

We may want to remove the existing azure build failure notification when
this is merged. It can be deleted from
[here](https://dev.azure.com/certbot/certbot/_settings/serviceHooks)
(it's the one that says "Build release, status Failed"), although
personally I think it's fine to keep it.

History of alternate general approaches I investigated:

1. give azure a custom file to say a message that depends on the
requestedBy field. impossible. no custom messages at all, much less
dependant ones.
2. hook azure build completed webhook trigger directly to github
respository_dispatch event. impossible. azure will send data in a
[specific
format](https://learn.microsoft.com/en-us/azure/devops/service-hooks/events?view=azure-devops#build.complete),
which is not the format [github
requires](https://docs.github.com/en/rest/repos/repos?apiVersion=2026-03-10#create-a-repository-dispatch-event).
3. option 2, but put a custom server somewhere to translate them. or to
grab azure and send directly to mattermost. this is a horrible idea; no
one wants to be managing a production server with secrets on it.
4. a mattermost bot is just a special user account. the sender still has
to format the data so mm can read it.
5. block on migrating from azure to github actions. drawback: this will
likely take a while, and also we're not definitely doing it. see
https://github.com/certbot/certbot/issues/10581
6. smaller than 5; wrap release in a github action that calls azure
inside of it. and then if we end up migrating more, it should be pretty
smooth to move things inside of actions. drawback: this will probably
not integrate as smoothly, given we use the azure integration. I did not
investigate further.
7. there doesn't seem to be any sort of github actions event about
builds passing on a certain branch that we can check
8. just message mattermost directly from within the pipeline as a final
stage --> where I landed.

There's further discussion in the comments about others ways we tried to
structure the pipeline and get information from azure that's not super
necessary to read to review this PR.

Relevant links:

https://learn.microsoft.com/en-us/azure/devops/service-hooks/events?view=azure-devops#build.complete

https://learn.microsoft.com/en-us/azure/devops/service-hooks/services/webhooks?view=azure-devops#resource-details-to-send

https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#agent-variables

https://learn.microsoft.com/en-us/azure/devops/pipelines/process/conditions?view=azure-devops&tabs=yaml#job-status-functions


https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows

https://docs.github.com/en/rest/repos/repos?apiVersion=2026-03-10#create-a-repository-dispatch-event

https://docs.github.com/en/webhooks/webhook-events-and-payloads#repository_dispatch

Results of tests with the latest code are here:

https://dev.azure.com/certbot/certbot/_build/results?buildId=10309&view=results

https://dev.azure.com/certbot/certbot/_build/results?buildId=10310&view=results

https://dev.azure.com/certbot/certbot/_build/results?buildId=10311&view=results

Plus the mattermost messages did get sent.

---------

Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
2026-04-02 14:14:27 -07:00
Brad WarrenandGitHub 08c2354f46 update poetry (#10615)
this is in response to
https://github.com/certbot/certbot/security/dependabot/126

as you can see by examining the github status checks on this PR, i ran
the full test suite and everything passed

i also don't think this PR requires two reviews
2026-04-02 14:11:07 -07:00
ohemorangeandGitHub 3d803821b7 Repin dependencies (#10611) 2026-03-27 09:03:31 -07:00
6f1c0b0abd merge certbot-apache and certbot-nginx into certbot (#10522)
based on the suggestion @bmw made in #10484, this moves nearly
everything from `certbot-apache` and `certbot-nginx` into subdirectories
in `certbot/src/certbot/_internal`, and corresponding "extra"
dependencies are made for the certbot distribution. in their place,
entrypoint shims are made in the old distributions.

this way, installing `certbot[nginx]` will pull in the extra
dependencies needed for the nginx code, and also pull in the shim in
`certbot-nginx`, letting our plugin discovery system work just as it did
before. ditto for apache.

note that this doesn't yet deprecate anything, which was one of the
primary goals of the original issue -- i spun out that work into #10521

fixes #10484

---------

Co-authored-by: Brad Warren <bmw@users.noreply.github.com>
Co-authored-by: ohemorange <erica@eff.org>
2026-03-23 18:09:04 -07:00
ohemorangeandGitHub 9599364837 Use python warning filters from pytest.ini during integration tests (#10602)
Fixes https://github.com/certbot/certbot/issues/10180.

So first of all, the core issue here is that [pyca deliberately
chose](https://github.com/pyca/cryptography/blob/ec80c1c2894320d30fd674ea2c6103d91b4e777e/src/cryptography/utils.py#L15-L18)
to override the default python functionality and make deprecation
warnings appear by default. This isn't common. If they'd actually used a
`DeprecationWarning`, it wouldn't have shown up to users, at least. That
being said, we should still try to catch it, as we do in fact want to
know about deprecation warnings for our own updates.

To do that, this PR searches upwards for a `pytest.ini` file from the
file's location. If found, it reads the warnings from the file, and
passes them using the `PYTHONWARNINGS` env variable. It also explicitly
sets warnings to `error` always in case we can't find the `pytest.ini`,
and ignores the subsequent unverified-https-on-localhost warning. It
also fixes a warning in our test nginx config that seemed reasonable to
address.

I tested this by adding a temporary warning, which I then removed, but
since it turned out there were two other warnings, that wasn't actually
necessary.

Options I considered and rejected:

- Switch from `atexit` to calling `main` directly. To do this, we'd have
to switch our `main` function to something like a try-finally. That's
complicated by the fact that we call `atexit` from other places in the
code. Also, `exc_info` isn't availabe in `finally` while it is in
`at_exit`, so it's not as versatile. But mostly if we wanted to do this,
we'd have to implement a custom atexit handler, basically, and that
seems worse than this option.
- Looking into pytest-forked. It's apparently buggy and not being
maintained. Not even sure this is what it's for anyway.
- Multiple
[-W](https://docs.python.org/3/using/cmdline.html#cmdoption-W) options
can be given instead of an env variable. The env version seemed cleaner.
- More closely mimicking [how pytest finds ini
files](https://docs.pytest.org/en/stable/reference/customize.html#finding-the-rootdir).
It seemed unnecessary to me.

Potential drawbacks:
- If we move or rename the `pytest.ini` file and for some reason don't
do a reasonable grep for `pytest.ini`, we will no longer catch any
additional `ignore`s in there. But imo we're likely to do that grep, and
also a missing ignore will then show up when we run the tests.
2026-03-20 14:40:31 -07:00
Brad WarrenandGitHub 9ed92009db deprecate certbot.ocsp (#10584)
this is part of https://github.com/certbot/certbot/issues/10517

to update this description in response to the discussion below, i'd
recommend reviewing this PR by commit. the first commit just moves
ocsp.py under _internal making no other changes while the second commit
fixes everything else up. the diff really isn't as big here as it looks
2026-03-19 15:14:10 -07:00
ohemorangeandGitHub b42b986fb7 List certbot-dns-eurodns as a third-party plugin (#10605)
Fixes https://github.com/certbot/certbot/issues/10603

The link to the github repo is 404'ing. I've asked for a current link,
but the pypi link seems fine to me also. It was released yesterday so it
does seem to still be in active development.

<img width="910" height="214" alt="Screenshot 2026-03-18 at 10 30 19 AM"
src="https://github.com/user-attachments/assets/25208402-ebd1-4d9e-8c46-f1a3f5b83ec0"
/>
2026-03-18 10:52:14 -07:00
James MossandGitHub 26a0b0295b Logo & Wording for DigitalOcean Open Source Sponsorship in Readme.rst (#10601)
In exchange for participating in Open Source Sponsorship, DigitalOcean
has assembled a guide. This commit should bring the readme in line with
the provided guide.

https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/index.html
2026-03-17 13:33:36 -07:00
Brad WarrenandGitHub e9f3c986a2 update manual docs for IP certs (#10596)
i noticed this when reviewing jsha's upcoming blog post

this probably should have been done as part of
https://github.com/certbot/certbot/pull/10544, but we forgot to do it
then

i don't think this PR requires two reviews
2026-03-11 12:51:40 -07:00
ohemorangeandGitHub fa0b0b1057 Merge pull request #10594 from certbot/candidate-5.4.0
Candidate 5.4.0
2026-03-10 12:15:27 -07:00
Will Greenberg 8ebbe24190 Bump version to 5.5.0 2026-03-10 10:47:29 -07:00