Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Test package update#47

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Draft
giulio93 wants to merge5 commits intomain
base:main
Choose a base branch
Loading
fromtest_package_update
Draft
Show file tree
Hide file tree
Changes fromall commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions.github/workflows/test-update.yml
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
name: Build & Update with Arduino CLI

on:
push:
branches:
- main
- test_package_update
workflow_dispatch:

permissions:
contents: read


jobs:
build-and-update:
runs-on: ubuntu-22.04

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod

- name: Run dep package update test
env:
GH_TOKEN: ${{ secrets.ARDUINOBOT_TOKEN }}
run: |
go test -v ./internal/testtools/deb_test.go --arch amd64
44 changes: 43 additions & 1 deletionTaskfile.yml
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,6 +12,9 @@ vars:
RUNNER_VERSION: "0.5.0"
VERSION: # if version is not passed we hack the semver by encoding the commit as pre-release
sh: echo "${VERSION:-0.0.0-$(git rev-parse --short HEAD)}"
NEW_PACKAGE:
sh: ls -1 ./build/arduino-app-cli_*.deb 2>/dev/null | head -n 1
GITHUB_TOKEN_FILE: ./github_token.txt

tasks:
init:
Expand DownExpand Up@@ -102,9 +105,10 @@ tasks:
deps:
- build-deb:clone-examples
cmds:
- docker build --build-arg BINARY_NAME=arduino-app-cli --build-arg DEB_NAME=arduino-app-cli --build-arg VERSION={{ .VERSION }} --build-arg ARCH={{ .ARCH }} --build-arg RELEASE={{ .RELEASE }} --output=./build -f debian/Dockerfile .
- docker build --build-arg BINARY_NAME=arduino-app-cli --build-arg DEB_NAME=arduino-app-cli --build-arg VERSION={{ .VERSION }} --build-arg ARCH={{ .ARCH }} --build-arg RELEASE={{ .RELEASE }} --output={{ .OUTPUT }} -f debian/Dockerfile .
vars:
ARCH: '{{.ARCH | default "arm64"}}'
OUTéPUT: '{{.OUTPUT | default "./build"}}'

build-deb:clone-examples:
desc: "Clones the examples repo directly into the debian structure"
Expand All@@ -123,6 +127,44 @@ tasks:
echo "Examples successfully cloned."
silent: false

build-image:
desc: "Builds the mock-repo Docker image (requires GITHUB_TOKEN_FILE)"
deps: [build-deb]
vars:
PKG_PATH: "{{.NEW_PACKAGE}}"
cmds:
# --- MODIFIED ---
# Check for both the package and the token file
- |
if [ ! -f "{{.GITHUB_TOKEN_FILE}}" ]; then
echo "Error: GitHub token file not found at {{.GITHUB_TOKEN_FILE}}"
echo "Please create this file and add your GitHub PAT to it."
exit 1
fi
- |
echo "Using package: {{.PKG_PATH}}"
echo "Using GitHub token from: {{.GITHUB_TOKEN_FILE}}"

# Enable BuildKit and pass the secret
DOCKER_BUILDKIT=1 docker build \
--secret id=github_token,src={{.GITHUB_TOKEN_FILE}} \
--build-arg NEW_PACKAGE_PATH={{.PKG_PATH}} \
-t newdeb \
-f test.Dockerfile .
status:
- '[[ -f "{{.PKG_PATH}}" ]]'
- '[[ -f "{{.DOCKERFILE_NAME}}" ]]'
# Re-build if token file changes
- '[[ -f "{{.GITHUB_TOKEN_FILE}}" ]]'

test-deb:
desc: Test the debian package locally
deps:
- build-deb
cmds:
- docker build --no-cache -t mock-apt-repo -f test.Dockerfile .
- docker run --rm -it --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name apt-test-update mock-apt-repo

arduino-app-cli:build:local:
desc: "Build the arduino-app-cli locally"
cmds:
Expand Down
264 changes: 264 additions & 0 deletionsinternal/testtools/deb_test.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
package testtools

import (
"bytes"
"flag"
"fmt"
"io"
"log"
"os"
"os/exec"
"path/filepath"
"strconv"
"strings"
"testing"

"github.com/stretchr/testify/require"
)

var arch = flag.String("arch", "amd64", "target architecture")

func TestStableToUnstable(t *testing.T) {
tagAppCli := FetchDebPackage(t, "arduino-app-cli", "latest", *arch)
FetchDebPackage(t, "arduino-router", "latest", *arch)
majorTag := majorTag(t, tagAppCli)
_ = minorTag(t, tagAppCli)

fmt.Printf("Updating from stable version %s to unstable version %s \n", tagAppCli, majorTag)
fmt.Printf("Building local deb version %s \n", majorTag)
buildDebVersion(t, majorTag, *arch)

fmt.Println("**** BUILD docker image *****")
buildDockerImage(t, "test.Dockerfile", "test-apt-update")
fmt.Println("**** RUN docker image *****")
runDockerCommand(t, "test-apt-update")
preUpdateVersion := runDockerSystemVersion(t, "apt-test-update")
runDockerSystemUpdate(t, "apt-test-update")
postUpdateVersion := runDockerSystemVersion(t, "apt-test-update")
runDockerCleanUp(t, "apt-test-update")
require.Equal(t, preUpdateVersion, "Arduino App CLI "+tagAppCli)
require.Equal(t, postUpdateVersion, "Arduino App CLI "+majorTag)

}

func TestUnstableToStable(t *testing.T) {
tagAppCli := FetchDebPackage(t, "arduino-app-cli", "latest", *arch)
FetchDebPackage(t, "arduino-router", "latest", *arch)
minorTag := minorTag(t, tagAppCli)
moveDeb(t, "build/stable", "build/", "arduino-app-cli", tagAppCli, *arch)

fmt.Printf("Updating from unstable version %s to stable version %s \n", minorTag, tagAppCli)
fmt.Printf("Building local deb version %s \n", minorTag)
buildDebVersion(t, minorTag, *arch)
moveDeb(t, "build/", "build/stable", "arduino-app-cli", tagAppCli, *arch)

fmt.Println("**** BUILD docker image *****")
buildDockerImage(t, "test.Dockerfile", "test-apt-update")
fmt.Println("**** RUN docker image *****")
runDockerCommand(t, "test-apt-update")
preUpdateVersion := runDockerSystemVersion(t, "apt-test-update")
runDockerSystemUpdate(t, "apt-test-update")
postUpdateVersion := runDockerSystemVersion(t, "apt-test-update")
runDockerCleanUp(t, "apt-test-update")
require.Equal(t, preUpdateVersion, "Arduino App CLI "+tagAppCli)
require.Equal(t, postUpdateVersion, "Arduino App CLI "+minorTag)

}

func FetchDebPackage(t *testing.T, repo, version, arch string) string {
t.Helper()

cmd := exec.Command(
"gh", "release", "list",
"--repo", "github.com/arduino/"+repo,
"--exclude-pre-releases",
"--limit", "1",
)

output, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("command failed: %v\nOutput: %s", err, output)
}

fmt.Println(string(output))

fields := strings.Fields(string(output))
if len(fields) == 0 {
log.Fatal("could not parse tag from gh release list output")
}
tag := fields[0]
tagPath := strings.TrimPrefix(tag, "v")

debFile := fmt.Sprintf("build/stable/%s_%s-1_%s.deb", repo, tagPath, arch)
fmt.Println(debFile)
if _, err := os.Stat(debFile); err == nil {
fmt.Printf("✅ %s already exists, skipping download.\n", debFile)
return tag
}
fmt.Println("Detected tag:", tag)
cmd2 := exec.Command(
"gh", "release", "download",
tag,
"--repo", "github.com/arduino/"+repo,
"--pattern", "*",
"--dir", "./build/stable",
)

out, err := cmd2.CombinedOutput()
if err != nil {
log.Fatalf("download failed: %v\nOutput: %s", err, out)
}

return tag

}

func buildDebVersion(t *testing.T, tagVersion, arch string) {
t.Helper()
cwd, err := os.Getwd()
if err != nil {
panic(err)
}
outputDir := filepath.Join(cwd, "build")

cmd := exec.Command(
"go", "tool", "task", "build-deb",
fmt.Sprintf("VERSION=%s", tagVersion),
fmt.Sprintf("ARCH=%s", arch),
fmt.Sprintf("OUTPUT=%s", outputDir),
)

if err := cmd.Run(); err != nil {
log.Fatalf("failed to run build command: %v", err)
}
}

func majorTag(t *testing.T, tag string) string {
t.Helper()

parts := strings.Split(tag, ".")
last := parts[len(parts)-1]

// Remove potential prefix 'v' from the first part, but not from the patch
lastNum, _ := strconv.Atoi(strings.TrimPrefix(last, "v"))
lastNum++

parts[len(parts)-1] = strconv.Itoa(lastNum)
newTag := strings.Join(parts, ".")

return newTag
}

func minorTag(t *testing.T, tag string) string {
t.Helper()

parts := strings.Split(tag, ".")
last := parts[len(parts)-1]

lastNum, _ := strconv.Atoi(strings.TrimPrefix(last, "v"))
if lastNum > 0 {
lastNum--
}

parts[len(parts)-1] = strconv.Itoa(lastNum)
newTag := strings.Join(parts, ".")

if !strings.HasPrefix(newTag, "v") {
newTag = "v" + newTag
}
return newTag
}

func buildDockerImage(t *testing.T, dockerfile, name string) {
t.Helper()

cmd := exec.Command("docker", "build", "-t", name, "-f", dockerfile, ".")
out, err := cmd.CombinedOutput()
if err != nil {
t.Fatalf("docker build failed: %v\nOutput:\n%s", err, string(out))
}

}

func runDockerCommand(t *testing.T, containerImageName string) {
t.Helper()

cmd := exec.Command(
"docker", "run", "--rm", "-d",
"--privileged",
"--cgroupns=host",
"-v", "/sys/fs/cgroup:/sys/fs/cgroup:rw",
"-v", "/var/run/docker.sock:/var/run/docker.sock",
"-e", "DOCKER_HOST=unix:///var/run/docker.sock",
"--name", "apt-test-update",
containerImageName,
)

if err := cmd.Run(); err != nil {
t.Fatalf("failed to run container: %v", err)
}

}

func runDockerSystemVersion(t *testing.T, containerName string) string {
t.Helper()

cmd := exec.Command(
"docker", "exec",
"--user", "arduino",
containerName,
"arduino-app-cli", "version",
)

output, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("command failed: %v\nOutput: %s", err, output)
}

return string(output)

}

func runDockerSystemUpdate(t *testing.T, containerName string) {
t.Helper()
var buf bytes.Buffer

cmd := exec.Command(
"docker", "exec",
containerName,
"sh", "-lc",
`su - arduino -c "yes | arduino-app-cli system update"`,
)

cmd.Stdout = io.MultiWriter(os.Stdout, &buf)

if err := cmd.Run(); err != nil {
fmt.Fprintf(os.Stderr, "Error running system update: %v\n", err)
os.Exit(1)
}

}

func runDockerCleanUp(t *testing.T, containerName string) {

cleanupCmd := exec.Command("docker", "rm", "-f", containerName)

fmt.Println("🧹 Removing Docker container " + containerName)
if err := cleanupCmd.Run(); err != nil {
fmt.Printf("⚠️ Warning: could not remove container (might not exist): %v\n", err)
}

}

func moveDeb(t *testing.T, startDir, targetDir, repo string, tagVersion string, arch string) {
tagPath := strings.TrimPrefix(tagVersion, "v")

debFile := fmt.Sprintf("%s/%s_%s-1_%s.deb", startDir, repo, tagPath, arch)

moveCmd := exec.Command("mv", debFile, targetDir)

fmt.Printf("📦 Moving %s → %s\n", debFile, targetDir)
if err := moveCmd.Run(); err != nil {
panic(fmt.Errorf("failed to move deb file: %w", err))
}
}
Loading
Loading

[8]ページ先頭

©2009-2025 Movatter.jp