From 8635fc1fede991263aa0f845d7e53239292ef2a7 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Thu, 19 Jul 2018 16:16:47 +0200 Subject: [PATCH] build, internal, swarm: enhance build/release process --- build/ci.go | 141 ++++++++++++------- build/{ => deb/ethereum-swarm}/deb.changelog | 0 build/deb/ethereum-swarm/deb.control | 19 +++ build/{ => deb/ethereum-swarm}/deb.copyright | 0 build/{ => deb/ethereum-swarm}/deb.docs | 0 build/{ => deb/ethereum-swarm}/deb.install | 0 build/{ => deb/ethereum-swarm}/deb.rules | 0 build/deb/ethereum/deb.changelog | 5 + build/{ => deb/ethereum}/deb.control | 0 build/deb/ethereum/deb.copyright | 14 ++ build/deb/ethereum/deb.docs | 1 + build/deb/ethereum/deb.install | 1 + build/deb/ethereum/deb.rules | 13 ++ internal/build/util.go | 6 +- swarm/VERSION | 1 + 15 files changed, 150 insertions(+), 51 deletions(-) rename build/{ => deb/ethereum-swarm}/deb.changelog (100%) create mode 100644 build/deb/ethereum-swarm/deb.control rename build/{ => deb/ethereum-swarm}/deb.copyright (100%) rename build/{ => deb/ethereum-swarm}/deb.docs (100%) rename build/{ => deb/ethereum-swarm}/deb.install (100%) rename build/{ => deb/ethereum-swarm}/deb.rules (100%) create mode 100644 build/deb/ethereum/deb.changelog rename build/{ => deb/ethereum}/deb.control (100%) create mode 100644 build/deb/ethereum/deb.copyright create mode 100644 build/deb/ethereum/deb.docs create mode 100644 build/deb/ethereum/deb.install create mode 100644 build/deb/ethereum/deb.rules create mode 100644 swarm/VERSION diff --git a/build/ci.go b/build/ci.go index 287b35f0d9..5bbc4fb572 100644 --- a/build/ci.go +++ b/build/ci.go @@ -62,6 +62,9 @@ import ( ) var ( + gethVersionFile = "VERSION" + swarmVersionFile = "swarm/VERSION" + // Files that end up in the geth*.zip archive. gethArchiveFiles = []string{ "COPYING", @@ -77,10 +80,15 @@ var ( executablePath("geth"), executablePath("puppeth"), executablePath("rlpdump"), - executablePath("swarm"), executablePath("wnode"), } + // Files that end up in the swarm*.zip archive. + swarmArchiveFiles = []string{ + "COPYING", + executablePath("swarm"), + } + // A debian package is created for all executables listed here. debExecutables = []debExecutable{ { @@ -107,15 +115,37 @@ var ( BinaryName: "rlpdump", Description: "Developer utility tool that prints RLP structures.", }, + { + BinaryName: "wnode", + Description: "Ethereum Whisper diagnostic tool", + }, + } + + // A debian package is created for all executables listed here. + debSwarmExecutables = []debExecutable{ { BinaryName: "swarm", PackageName: "ethereum-swarm", Description: "Ethereum Swarm daemon and tools", }, - { - BinaryName: "wnode", - Description: "Ethereum Whisper diagnostic tool", - }, + } + + debSwarm = debPackage{ + Name: "ethereum-swarm", + VersionFilePath: "swarm/VERSION", + Executables: debSwarmExecutables, + } + + debEthereum = debPackage{ + Name: "ethereum", + VersionFilePath: "VERSION", + Executables: debExecutables, + } + + // Debian meta packages to build and push to Ubuntu PPA + debPackages = []debPackage{ + debSwarm, + debEthereum, } // Distros for which packages are created. @@ -352,7 +382,6 @@ func doLint(cmdline []string) { } // Release Packaging - func doArchive(cmdline []string) { var ( arch = flag.String("arch", runtime.GOARCH, "Architecture cross packaging") @@ -372,10 +401,14 @@ func doArchive(cmdline []string) { } var ( - env = build.Env() - base = archiveBasename(*arch, env) - geth = "geth-" + base + ext - alltools = "geth-alltools-" + base + ext + env = build.Env() + + basegeth = archiveBasename(*arch, env, gethVersionFile) + geth = "geth-" + basegeth + ext + alltools = "geth-alltools-" + basegeth + ext + + baseswarm = archiveBasename(*arch, env, swarmVersionFile) + swarm = "swarm-" + baseswarm + ext ) maybeSkipArchive(env) if err := build.WriteArchive(geth, gethArchiveFiles); err != nil { @@ -384,14 +417,17 @@ func doArchive(cmdline []string) { if err := build.WriteArchive(alltools, allToolsArchiveFiles); err != nil { log.Fatal(err) } - for _, archive := range []string{geth, alltools} { + if err := build.WriteArchive(swarm, swarmArchiveFiles); err != nil { + log.Fatal(err) + } + for _, archive := range []string{geth, alltools, swarm} { if err := archiveUpload(archive, *upload, *signer); err != nil { log.Fatal(err) } } } -func archiveBasename(arch string, env build.Environment) string { +func archiveBasename(arch string, env build.Environment, versionFilePath string) string { platform := runtime.GOOS + "-" + arch if arch == "arm" { platform += os.Getenv("GOARM") @@ -402,11 +438,11 @@ func archiveBasename(arch string, env build.Environment) string { if arch == "ios" { platform = "ios-all" } - return platform + "-" + archiveVersion(env) + return platform + "-" + archiveVersion(env, versionFilePath) } -func archiveVersion(env build.Environment) string { - version := build.VERSION() +func archiveVersion(env build.Environment, versionFilePath string) string { + version := build.VERSION(versionFilePath) if isUnstableBuild(env) { version += "-unstable" } @@ -463,7 +499,6 @@ func maybeSkipArchive(env build.Environment) { } // Debian Packaging - func doDebianSource(cmdline []string) { var ( signer = flag.String("signer", "", `Signing key name, also used as package author`) @@ -487,21 +522,23 @@ func doDebianSource(cmdline []string) { build.MustRun(gpg) } - // Create the packages. - for _, distro := range debDistros { - meta := newDebMetadata(distro, *signer, env, now) - pkgdir := stageDebianSource(*workdir, meta) - debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc") - debuild.Dir = pkgdir - build.MustRun(debuild) + // Create Debian packages and upload them + for _, pkg := range debPackages { + for _, distro := range debDistros { + meta := newDebMetadata(distro, *signer, env, now, pkg.Name, build.VERSION(pkg.VersionFilePath), pkg.Executables) + pkgdir := stageDebianSource(*workdir, meta) + debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc") + debuild.Dir = pkgdir + build.MustRun(debuild) - changes := fmt.Sprintf("%s_%s_source.changes", meta.Name(), meta.VersionString()) - changes = filepath.Join(*workdir, changes) - if *signer != "" { - build.MustRunCommand("debsign", changes) - } - if *upload != "" { - build.MustRunCommand("dput", *upload, changes) + changes := fmt.Sprintf("%s_%s_source.changes", meta.Name(), meta.VersionString()) + changes = filepath.Join(*workdir, changes) + if *signer != "" { + build.MustRunCommand("debsign", changes) + } + if *upload != "" { + build.MustRunCommand("dput", *upload, changes) + } } } } @@ -526,9 +563,17 @@ func isUnstableBuild(env build.Environment) bool { return true } +type debPackage struct { + Name string // the name of the Debian package to produce, e.g. "ethereum", or "ethereum-swarm" + VersionFilePath string // the relative path to the version file to be used for the package, e.g. "VERSION", or "swarm/VERSION" + Executables []debExecutable // executables to be included in the package +} + type debMetadata struct { Env build.Environment + PackageName string + // go-ethereum version being built. Note that this // is not the debian package version. The package version // is constructed by VersionString. @@ -554,18 +599,19 @@ func (d debExecutable) Package() string { return d.BinaryName } -func newDebMetadata(distro, author string, env build.Environment, t time.Time) debMetadata { +func newDebMetadata(distro, author string, env build.Environment, t time.Time, name string, version string, exes []debExecutable) debMetadata { if author == "" { // No signing key, use default author. author = "Ethereum Builds " } return debMetadata{ + PackageName: name, Env: env, Author: author, Distro: distro, - Version: build.VERSION(), + Version: version, Time: t.Format(time.RFC1123Z), - Executables: debExecutables, + Executables: exes, } } @@ -573,9 +619,9 @@ func newDebMetadata(distro, author string, env build.Environment, t time.Time) d // on all executable packages. func (meta debMetadata) Name() string { if isUnstableBuild(meta.Env) { - return "ethereum-unstable" + return meta.PackageName + "-unstable" } - return "ethereum" + return meta.PackageName } // VersionString returns the debian version of the packages. @@ -636,24 +682,23 @@ func stageDebianSource(tmpdir string, meta debMetadata) (pkgdir string) { // Put the debian build files in place. debian := filepath.Join(pkgdir, "debian") - build.Render("build/deb.rules", filepath.Join(debian, "rules"), 0755, meta) - build.Render("build/deb.changelog", filepath.Join(debian, "changelog"), 0644, meta) - build.Render("build/deb.control", filepath.Join(debian, "control"), 0644, meta) - build.Render("build/deb.copyright", filepath.Join(debian, "copyright"), 0644, meta) + build.Render("build/deb/"+meta.PackageName+"/deb.rules", filepath.Join(debian, "rules"), 0755, meta) + build.Render("build/deb/"+meta.PackageName+"/deb.changelog", filepath.Join(debian, "changelog"), 0644, meta) + build.Render("build/deb/"+meta.PackageName+"/deb.control", filepath.Join(debian, "control"), 0644, meta) + build.Render("build/deb/"+meta.PackageName+"/deb.copyright", filepath.Join(debian, "copyright"), 0644, meta) build.RenderString("8\n", filepath.Join(debian, "compat"), 0644, meta) build.RenderString("3.0 (native)\n", filepath.Join(debian, "source/format"), 0644, meta) for _, exe := range meta.Executables { install := filepath.Join(debian, meta.ExeName(exe)+".install") docs := filepath.Join(debian, meta.ExeName(exe)+".docs") - build.Render("build/deb.install", install, 0644, exe) - build.Render("build/deb.docs", docs, 0644, exe) + build.Render("build/deb/"+meta.PackageName+"/deb.install", install, 0644, exe) + build.Render("build/deb/"+meta.PackageName+"/deb.docs", docs, 0644, exe) } return pkgdir } // Windows installer - func doWindowsInstaller(cmdline []string) { // Parse the flags and make skip installer generation on PRs var ( @@ -703,11 +748,11 @@ func doWindowsInstaller(cmdline []string) { // Build the installer. This assumes that all the needed files have been previously // built (don't mix building and packaging to keep cross compilation complexity to a // minimum). - version := strings.Split(build.VERSION(), ".") + version := strings.Split(build.VERSION(gethVersionFile), ".") if env.Commit != "" { version[2] += "-" + env.Commit[:8] } - installer, _ := filepath.Abs("geth-" + archiveBasename(*arch, env) + ".exe") + installer, _ := filepath.Abs("geth-" + archiveBasename(*arch, env, gethVersionFile) + ".exe") build.MustRunCommand("makensis.exe", "/DOUTPUTFILE="+installer, "/DMAJORVERSION="+version[0], @@ -759,7 +804,7 @@ func doAndroidArchive(cmdline []string) { maybeSkipArchive(env) // Sign and upload the archive to Azure - archive := "geth-" + archiveBasename("android", env) + ".aar" + archive := "geth-" + archiveBasename("android", env, gethVersionFile) + ".aar" os.Rename("geth.aar", archive) if err := archiveUpload(archive, *upload, *signer); err != nil { @@ -844,7 +889,7 @@ func newMavenMetadata(env build.Environment) mavenMetadata { } } // Render the version and package strings - version := build.VERSION() + version := build.VERSION(gethVersionFile) if isUnstableBuild(env) { version += "-SNAPSHOT" } @@ -879,7 +924,7 @@ func doXCodeFramework(cmdline []string) { build.MustRun(bind) return } - archive := "geth-" + archiveBasename("ios", env) + archive := "geth-" + archiveBasename("ios", env, gethVersionFile) if err := os.Mkdir(archive, os.ModePerm); err != nil { log.Fatal(err) } @@ -935,7 +980,7 @@ func newPodMetadata(env build.Environment, archive string) podMetadata { } } } - version := build.VERSION() + version := build.VERSION(gethVersionFile) if isUnstableBuild(env) { version += "-unstable." + env.Buildnum } diff --git a/build/deb.changelog b/build/deb/ethereum-swarm/deb.changelog similarity index 100% rename from build/deb.changelog rename to build/deb/ethereum-swarm/deb.changelog diff --git a/build/deb/ethereum-swarm/deb.control b/build/deb/ethereum-swarm/deb.control new file mode 100644 index 0000000000..8cd325bf55 --- /dev/null +++ b/build/deb/ethereum-swarm/deb.control @@ -0,0 +1,19 @@ +Source: {{.Name}} +Section: science +Priority: extra +Maintainer: {{.Author}} +Build-Depends: debhelper (>= 8.0.0), golang-1.10 +Standards-Version: 3.9.5 +Homepage: https://ethereum.org +Vcs-Git: git://github.com/ethereum/go-ethereum.git +Vcs-Browser: https://github.com/ethereum/go-ethereum + +{{range .Executables}} +Package: {{$.ExeName .}} +Conflicts: {{$.ExeConflicts .}} +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Built-Using: ${misc:Built-Using} +Description: {{.Description}} + {{.Description}} +{{end}} diff --git a/build/deb.copyright b/build/deb/ethereum-swarm/deb.copyright similarity index 100% rename from build/deb.copyright rename to build/deb/ethereum-swarm/deb.copyright diff --git a/build/deb.docs b/build/deb/ethereum-swarm/deb.docs similarity index 100% rename from build/deb.docs rename to build/deb/ethereum-swarm/deb.docs diff --git a/build/deb.install b/build/deb/ethereum-swarm/deb.install similarity index 100% rename from build/deb.install rename to build/deb/ethereum-swarm/deb.install diff --git a/build/deb.rules b/build/deb/ethereum-swarm/deb.rules similarity index 100% rename from build/deb.rules rename to build/deb/ethereum-swarm/deb.rules diff --git a/build/deb/ethereum/deb.changelog b/build/deb/ethereum/deb.changelog new file mode 100644 index 0000000000..83f804a833 --- /dev/null +++ b/build/deb/ethereum/deb.changelog @@ -0,0 +1,5 @@ +{{.Name}} ({{.VersionString}}) {{.Distro}}; urgency=low + + * git build of {{.Env.Commit}} + + -- {{.Author}} {{.Time}} diff --git a/build/deb.control b/build/deb/ethereum/deb.control similarity index 100% rename from build/deb.control rename to build/deb/ethereum/deb.control diff --git a/build/deb/ethereum/deb.copyright b/build/deb/ethereum/deb.copyright new file mode 100644 index 0000000000..fe6e36ad9d --- /dev/null +++ b/build/deb/ethereum/deb.copyright @@ -0,0 +1,14 @@ +Copyright 2018 The go-ethereum Authors + +go-ethereum is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +go-ethereum is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with go-ethereum. If not, see . diff --git a/build/deb/ethereum/deb.docs b/build/deb/ethereum/deb.docs new file mode 100644 index 0000000000..62deb04972 --- /dev/null +++ b/build/deb/ethereum/deb.docs @@ -0,0 +1 @@ +AUTHORS diff --git a/build/deb/ethereum/deb.install b/build/deb/ethereum/deb.install new file mode 100644 index 0000000000..e7666ce5fb --- /dev/null +++ b/build/deb/ethereum/deb.install @@ -0,0 +1 @@ +build/bin/{{.BinaryName}} usr/bin diff --git a/build/deb/ethereum/deb.rules b/build/deb/ethereum/deb.rules new file mode 100644 index 0000000000..7f286569ea --- /dev/null +++ b/build/deb/ethereum/deb.rules @@ -0,0 +1,13 @@ +#!/usr/bin/make -f +# -*- makefile -*- + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +override_dh_auto_build: + build/env.sh /usr/lib/go-1.10/bin/go run build/ci.go install -git-commit={{.Env.Commit}} -git-branch={{.Env.Branch}} -git-tag={{.Env.Tag}} -buildnum={{.Env.Buildnum}} -pull-request={{.Env.IsPullRequest}} + +override_dh_auto_test: + +%: + dh $@ diff --git a/internal/build/util.go b/internal/build/util.go index c6e059f0df..dc4b9a7702 100644 --- a/internal/build/util.go +++ b/internal/build/util.go @@ -60,9 +60,9 @@ func GOPATH() string { return os.Getenv("GOPATH") } -// VERSION returns the content of the VERSION file. -func VERSION() string { - version, err := ioutil.ReadFile("VERSION") +// VERSION returns the content of a VERSION file. +func VERSION(path string) string { + version, err := ioutil.ReadFile(path) if err != nil { log.Fatal(err) } diff --git a/swarm/VERSION b/swarm/VERSION new file mode 100644 index 0000000000..9e11b32fca --- /dev/null +++ b/swarm/VERSION @@ -0,0 +1 @@ +0.3.1