Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 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
140c59e
spread, github, tests: move distro-upgrade test to new test suite
maykathm Apr 15, 2026
d838851
tmp
maykathm Apr 15, 2026
13a5ed1
update
maykathm Apr 15, 2026
bb4bb03
Merge branch 'release/2.76' into tmp
maykathm Apr 15, 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
97 changes: 97 additions & 0 deletions .github/workflows/ci-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
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:
version: ${{ steps.find-lowest-supported.outputs.version }}
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 version to $version and system to ubuntu-$version-64"
echo "system=ubuntu-$version-64" >> $GITHUB_OUTPUT
echo "version=$version" >> $GITHUB_OUTPUT

create-vendor-dir:
runs-on: ubuntu-latest
needs: run-gate
name: Create go vendor
steps:
- name: Checkout code
uses: actions/checkout@v6

- name: vendor
run: |
sudo snap install --classic --channel 1.18/stable go
/snap/bin/go mod vendor
(
cd c-vendor
./vendor.sh
)
mkdir /tmp/pkg
base_version="$(head -1 packaging/ubuntu-16.04/changelog | awk -F '[()]' '{print $2}')"
version="1337.$base_version"
./packaging/pack-source -v "$version" -o /tmp/pkg
./packaging/pack-source -v "$version" -o /tmp/pkg -s
echo "$version" > /tmp/pkg/version

- name: Upload vendors
uses: actions/upload-artifact@v7
with:
name: vendor-pkgs
path: /tmp/pkg

package-snapd-deb:
needs: [find-lowest-supported, create-vendor-dir]
uses: ./.github/workflows/deb-builds.yaml
name: Package ${{ matrix.build-config.system }}
with:
runs-on: '["ubuntu-latest"]'
system: ${{ needs.find-lowest-supported.outputs.system }}
os: ubuntu
os-version: ${{ needs.find-lowest-supported.outputs.version }}

test-snapd-deb:
needs: [package-snapd-deb, 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"

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: ''
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