Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
25dd45c
tests: add sbuild-schroot install for debian sid to fix nightly sbuil…
maykathm Apr 8, 2026
0b89960
tests: avoid installing prompting-client camera dependencies (#16877)
olivercalder Apr 8, 2026
72e402e
core-initrd: fix mount with uboot env in partition (#16765)
kubiko Apr 9, 2026
094e7ec
cmd/snap: show component details in snap info output
zyga Mar 31, 2026
71e64cb
boot,overlord/fdestate: move FDE auto-repair and provide state
valentindavid Jan 27, 2026
a50affe
o/snapstate: do not forget components in doLinkSnap
zyga Apr 3, 2026
1c437db
tests: check that disable/enable retains components
zyga Apr 8, 2026
0502974
packaging: refactor and cleanup for snapd.mk (#16506)
zyga Apr 10, 2026
82e3264
tests: add /debug endpoint to fakestore to allow interrupting downloa…
ZeyadYasser Apr 13, 2026
38fd84d
github: fix spread-tests.yaml to allow for a large number of artifact…
maykathm Apr 13, 2026
1c1cc8e
tests: give nested/manual/seeding-failure more attempts when waiting …
maykathm Apr 13, 2026
1952090
tests: use cloud-init track for core26 nested tests when cloud-init
alfonsosanchezbeato Apr 9, 2026
e9df9b5
github: bump actions/github-script in the actions-deps group (#16911)
dependabot[bot] Apr 13, 2026
fee5d7c
github: fail go channels job if no go channels were found (#16897)
maykathm Apr 13, 2026
2f8c0d9
tests/nested/manual/minimal-smoke: add more memory with secure boot
valentindavid Apr 9, 2026
0ac9a53
secboot: update to rev 3f8b98c for TPM/FDE bug fixes (#16886)
ernestl Apr 14, 2026
4f65705
release-tools/is-lp-fips-build: attempt to workaround LP FIPS build d…
bboozzoo Apr 14, 2026
69bcf4f
overlord: simplify cert-db updates on model-base refresh/installs (#1…
Meulengracht Apr 14, 2026
b860983
overlord/snapstate: improve handling of failed downloads and cleanup …
bboozzoo Apr 14, 2026
7407b7d
daemon, snap, o/snapstate: extend snap.AlreadyInstalledError to multi…
natibek Apr 14, 2026
8134fde
o/i/apparmorprompting: improve unit test reliability on slow systems …
olivercalder Apr 14, 2026
eb3e254
tests: new tests to validated resealing on real hardware (#16821)
sergiocazzolato Apr 14, 2026
ad10573
tests: add spread tests for snap remove impacted by mounts (#16887)
Mohit-Chachada Apr 14, 2026
147bc3c
o/devicemgmtstate: implement dispatch-mgmt-messages task (#16547)
st3v3nmw Apr 15, 2026
2b31631
ci: Execute rest_api_test tests in codeconv (#16653)
sergio-costas Apr 15, 2026
a9979b1
tests: add checks in os.query if a version is latest LTS, interim, or…
maykathm Apr 14, 2026
7c92eff
tests: add manual distro-upgrade test
maykathm Apr 14, 2026
8d1d62d
spread: add ability to skip suite restore steps on tests/upgrade
maykathm Apr 14, 2026
eb76bd2
tests: exclude ubuntu core from distro upgrade test
maykathm Apr 14, 2026
49bdae2
tests: use not instead of !
maykathm Apr 14, 2026
6439358
github: add workflow for distro upgrade/downgrade
maykathm Apr 15, 2026
05bcfee
spread, github, tests: move distro-upgrade test to new test suite
maykathm Apr 15, 2026
ba7f600
tests: update os.query
maykathm Apr 16, 2026
a5b2fe7
tests: add snapd version check
maykathm Apr 22, 2026
05afad6
github: remove deb pre-build
maykathm Apr 22, 2026
aec1ace
tests, github: add artifact collection to verify snapd versions durin…
maykathm Apr 22, 2026
8c81709
tests: fix static checks
maykathm Apr 22, 2026
a67a430
spread, tests: update comments; add longer kill timeout
maykathm Apr 23, 2026
1abc028
tests: remove support for ubuntu-1; slower warn-timeout
maykathm Apr 23, 2026
94fdc19
github: echo snapd versions at end of workflow
maykathm Apr 23, 2026
6513b60
debug
maykathm Apr 23, 2026
f3cf71c
debug
maykathm Apr 23, 2026
ca43fb9
Merge branch 'release/2.76' into tmp-distro
maykathm Apr 23, 2026
29ddbe2
correction
maykathm Apr 23, 2026
fc44a2b
use-download
maykathm Apr 24, 2026
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
2 changes: 1 addition & 1 deletion .github/actions/download-install-debian-deps/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,6 @@ runs:
sudo apt update
ln -s packaging/ubuntu-16.04 debian
sudo apt build-dep -y "${{ inputs.snapd-src-dir }}"
sudo apt install -y clang
sudo apt install -y clang dbus-x11
sudo apt install -y gcovr lcov
rm -rf ./debian-deps
92 changes: 92 additions & 0 deletions .github/workflows/ci-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: Release Testing
on:
pull_request:
branches: [ "release/**" ]

jobs:
run-gate:
if: ${{ !contains(github.event.pull_request.labels.*.name, 'Skip spread') }}
runs-on: ubuntu-latest
steps:
- run: echo "Running release testing."

snap-builds:
uses: ./.github/workflows/snap-builds.yaml
needs: run-gate
with:
runs-on: '["ubuntu-latest"]'
toolchain: default
variant: test

find-lowest-supported:
runs-on: ubuntu-latest
needs: run-gate
outputs:
system: ${{ steps.find-lowest-supported.outputs.system }}
steps:
- name: Find lowest supported Ubuntu version
id: find-lowest-supported
run: |
sudo apt update
version=$(ubuntu-distro-info --supported --release | head -1 | awk '{print $1}')
echo "Setting lowest supported system to ubuntu-$version-64"
echo "system=ubuntu-$version-64" >> $GITHUB_OUTPUT

test-snapd-deb:
needs: [snap-builds, find-lowest-supported]
uses: ./.github/workflows/spread-tests.yaml
with:
runs-on: '["ubuntu-latest"]'
group: deb-test
backend: garden
systems: ${{ needs.find-lowest-supported.outputs.system }}
tasks: 'tests/release/distro-upgrade'
rules: ''
spread-env: "SPREAD_SNAPD_DEB_FROM_REPO=false SPREAD_SNAP_REEXEC=0"
upload-artifacts: true

test-snapd-snap:
needs: [snap-builds, find-lowest-supported]
uses: ./.github/workflows/spread-tests.yaml
with:
runs-on: '["ubuntu-latest"]'
group: snap-test
backend: garden
systems: ${{ needs.find-lowest-supported.outputs.system }}
tasks: 'tests/release/distro-upgrade'
rules: ''
upload-artifacts: true

report-results:
needs: [test-snapd-deb, test-snapd-snap]
runs-on: ubuntu-latest
steps:
- name: Download
uses: actions/download-artifact@v8
with:
pattern: spread-artifacts-*
merge-multiple: true

- name: Untar artifacts
run: |
find . -name "*.tar.gz" | while read filename; do
dir="${filename%.tar.gz}"
mkdir -p "$dir"
tar -xzf "$filename" -C "$dir"
rm "$filename"
done
find . -name "*.txt" -type f -delete
echo "All files after delete"
find . -type f

- name: Report results
run: |
echo "--------------------------------------------"
echo "----------------Snap results----------------"
echo "--------------------------------------------"
find spread-artifacts-snap-test* -type f -exec sh -c 'echo $1; cat $1' _ {} \;
echo "-------------------------------------------"
echo "----------------Deb results----------------"
echo "-------------------------------------------"
find spread-artifacts-deb-test* -type f -exec sh -c 'echo $1; cat $1' _ {} \;

8 changes: 8 additions & 0 deletions .github/workflows/ci-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ jobs:
include-snapd-build-fips-go-channel: true
include-latest-go-channel: false

- name: Check go channels
run: |
echo "Resolved Go channels: ${{ steps.resolve-go-channels.outputs.go-channels }}"
if [ -z "${{ steps.resolve-go-channels.outputs.go-channels }}" ]; then
echo "Error: No Go channels resolved" >&2
exit 1
fi

snap-builds:
uses: ./.github/workflows/snap-builds.yaml
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/rerun.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
uses: actions/checkout@v6

- name: Get PR number
uses: actions/github-script@v8
uses: actions/github-script@v9
with:
script: |
let page = 1;
Expand All @@ -55,7 +55,7 @@ jobs:
});
allArtifacts = allArtifacts.concat(response.data.artifacts);
page++;
} while (response.data.artifacts.length === per_page);
} while (allArtifacts.length < response.data.total_count);
let matchArtifact = allArtifacts.filter((artifact) => {
return artifact.name == "pr_number"
})[0];
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/spread-results-reporter.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
uses: actions/checkout@v6

- name: Get PR number
uses: actions/github-script@v8
uses: actions/github-script@v9
with:
script: |
let page = 1;
Expand All @@ -36,7 +36,7 @@ jobs:
});
allArtifacts = allArtifacts.concat(response.data.artifacts);
page++;
} while (response.data.artifacts.length === per_page);
} while (allArtifacts.length < response.data.total_count);
let matchArtifact = allArtifacts.filter((artifact) => {
return artifact.name == "pr_number"
})[0];
Expand All @@ -53,7 +53,7 @@ jobs:
run: unzip pr_number.zip

- name: Get generated data
uses: actions/github-script@v8
uses: actions/github-script@v9
with:
script: |
let page = 1;
Expand All @@ -70,7 +70,7 @@ jobs:
});
allArtifacts = allArtifacts.concat(response.data.artifacts);
page++;
} while (response.data.artifacts.length === per_page);
} while (allArtifacts.length < response.data.total_count);

let matchingArtifacts = allArtifacts.filter((artifact) => {
return artifact.name.startsWith(`spread-results-${context.payload.workflow_run.id}-${context.payload.workflow_run.run_attempt}`);
Expand Down
24 changes: 17 additions & 7 deletions .github/workflows/spread-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ jobs:
if: ${{ env.SKIP_SPREAD_LABEL != 'true' && env.RUN_TESTS == 'true' }}
env:
SYSTEMS: ${{ inputs.systems }}
uses: actions/github-script@v8
uses: actions/github-script@v9
with:
script: |
let fs = require('fs');
Expand All @@ -381,11 +381,21 @@ jobs:
let child_process = require('child_process');
let systems = process.env.SYSTEMS.split(' ');

let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.runId,
});
let page = 1;
let per_page = 100;
let allArtifacts = [];
let response;
do {
response = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.runId,
per_page: per_page,
page: page
});
allArtifacts = allArtifacts.concat(response.data.artifacts);
page++;
} while (allArtifacts.length < response.data.total_count);

for (let system of systems) {
let artifactName = `package-${system}`;
Expand All @@ -395,7 +405,7 @@ jobs:
const arch = match[2] || '';
artifactName = `package-ubuntu-${version}.04${arch}-64`;
}
let artifact = allArtifacts.data.artifacts.find(a => a.name === artifactName);
let artifact = allArtifacts.find(a => a.name === artifactName);
if (!artifact) {
console.log(`Artifact not found for system: ${system}`);
continue;
Expand Down
1 change: 1 addition & 0 deletions .woke.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,4 @@ ignore_files:
- packaging/ubuntu-16.04/changelog
- tests/lib/snaps/store/test-snapd-ovmf/snapcraft.yaml
- tests/lib/tools/tests.session
- tests/main/remove-impacted-by-mounts/task.yaml
5 changes: 2 additions & 3 deletions boot/boot.go
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ func GetCurrentBoot(t snap.Type, dev snap.Device) (snap.PlaceInfo, error) {
// bootStateUpdate carries the state for an on-going boot state update.
// At the end it can be used to commit it.
type bootStateUpdate interface {
commit(markedSuccesful bool) error
commit() error
}

// MarkBootSuccessful marks the current boot as successful. This means
Expand Down Expand Up @@ -403,8 +403,7 @@ func MarkBootSuccessful(dev snap.Device) error {
}

if u != nil {
const markedSuccessful = true
if err := u.commit(markedSuccessful); err != nil {
if err := u.commit(); err != nil {
return fmt.Errorf(errPrefix, err)
}
}
Expand Down
47 changes: 0 additions & 47 deletions boot/boot_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
package boot_test

import (
"encoding/json"
"errors"
"fmt"
"os"
Expand Down Expand Up @@ -5268,49 +5267,3 @@ func (s *bootenv20Suite) TestMarkBootSuccessfulClassModes(c *C) {
c.Check(m2.Base, Equals, "")
c.Check(m2.TryBase, Equals, "")
}

func (s *bootenv20Suite) TestMarkBootSuccessfulAutoRepair(c *C) {
m := &boot.Modeenv{
Mode: "run",
CurrentKernels: []string{s.kern1.Filename()},
}
defer setupUC20Bootenv(
c,
s.bootloader,
&bootenv20Setup{
modeenv: m,
kern: s.kern1,
kernStatus: boot.DefaultStatus,
},
)()

data := map[string]any{
"ubuntu-data": map[string]any{
"unlock-key": "recovery",
},
"ubuntu-save": map[string]any{
"unlock-key": "run",
},
}
jsonData, err := json.Marshal(data)
c.Assert(err, IsNil)

err = os.MkdirAll(filepath.Join(s.rootdir, "run/snapd/snap-bootstrap"), 0755)
c.Assert(err, IsNil)
err = os.WriteFile(filepath.Join(s.rootdir, "run/snapd/snap-bootstrap/unlocked.json"), jsonData, 0644)
c.Assert(err, IsNil)

resealCalls := 0
defer boot.MockResealKeyToModeenv(func(rootdir string, modeenv *boot.Modeenv, opts boot.ResealKeyToModeenvOptions, unlocker boot.Unlocker) error {
resealCalls++
c.Check(opts.Force, Equals, true)
c.Check(opts.EnsureProvisioned, Equals, true)
return nil
})()

dev := boottest.MockClassicWithModesDevice("", nil)

err = boot.MarkBootSuccessful(dev)
c.Assert(err, IsNil)
c.Check(resealCalls, Equals, 1)
}
2 changes: 1 addition & 1 deletion boot/bootstate16.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ func newBootStateUpdate16(u bootStateUpdate, names ...string) (*bootStateUpdate1
return &bootStateUpdate16{bl: bl, env: m, toCommit: make(map[string]string)}, nil
}

func (u16 *bootStateUpdate16) commit(markedSuccessful bool) error {
func (u16 *bootStateUpdate16) commit() error {
if len(u16.toCommit) == 0 {
// nothing to do
return nil
Expand Down
15 changes: 1 addition & 14 deletions boot/bootstate20.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ package boot

import (
"fmt"
"os"
"path/filepath"
"sync"
"sync/atomic"
Expand Down Expand Up @@ -189,7 +188,7 @@ func newBootStateUpdate20(m *Modeenv) (*bootStateUpdate20, error) {
}

// commit will write out boot state persistently to disk.
func (u20 *bootStateUpdate20) commit(markedSuccessful bool) error {
func (u20 *bootStateUpdate20) commit() error {
if !isModeenvLocked() {
return fmt.Errorf("internal error: cannot commit modeenv without the lock")
}
Expand Down Expand Up @@ -225,18 +224,6 @@ func (u20 *bootStateUpdate20) commit(markedSuccessful bool) error {
resealOpts.ExpectReseal = resealExpectedByModeenvChange(u20.writeModeenv, u20.modeenv)
}

if markedSuccessful {
autoRepair, err := isUnlockedWithRecoveryKey()
if err != nil {
if !os.IsNotExist(err) {
return err
}
} else if autoRepair {
resealOpts.Force = true
resealOpts.EnsureProvisioned = true
}
}

// next reseal using the modeenv values, we do this before any
// post-modeenv tasks so if we are rebooted at any point after
// the reseal even before the post tasks are completed, we
Expand Down
3 changes: 1 addition & 2 deletions boot/kernel_os.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,7 @@ func (bp *coreBootParticipant) SetNextBoot(bootCtx NextBootContext) (rebootInfo
}

if u != nil {
const markedSuccessful = false
if err := u.commit(markedSuccessful); err != nil {
if err := u.commit(); err != nil {
return RebootInfo{RebootRequired: false}, fmt.Errorf(errPrefix, err)
}
}
Expand Down
17 changes: 0 additions & 17 deletions boot/unlocked_state.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,20 +95,3 @@ func LoadDiskUnlockState(name string) (*DiskUnlockState, error) {

return ret, nil
}

// isUnlockedWithRecoveryKey tells whether a recovery key has been
// typed to unlock a disk during boot.
func isUnlockedWithRecoveryKey() (bool, error) {
state, err := LoadDiskUnlockState(UnlockedStateFileName)
if err != nil {
return false, err
}

if state.State != nil {
return state.State.NumActivatedContainersWithRecoveryKey() != 0, nil
} else {
// This is a case of an old snap-boostrap that does not provide the activate state API result.
// We still can guess based on the old status.
return state.UbuntuData.UnlockKey == "recovery" || state.UbuntuSave.UnlockKey == "recovery", nil
}
}
2 changes: 1 addition & 1 deletion cmd/snap-bootstrap/blkid/blkid_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func (s *blkidSuite) SetUpTest(c *C) {
tmp := c.MkDir()
image := filepath.Join(tmp, "image")

cmd := exec.Command(systemdRepart, "--offline=yes", "--size=64M", "--empty=create", "--definitions=test-data/repart.d", image)
cmd := exec.Command(systemdRepart, "--offline=yes", "--size=64M", "--empty=create", "--definitions=testdata/repart.d", image)
err = cmd.Run()
if err != nil {
c.Skip("systemd-repart is not working")
Expand Down
Loading
Loading