test-action-debian-package/main.js

192 lines
5.9 KiB
JavaScript
Raw Permalink Normal View History

2020-03-26 09:34:31 +00:00
const core = require("@actions/core")
const exec = require("@actions/exec")
const firstline = require("firstline")
2020-03-26 14:37:35 +00:00
const hub = require("docker-hub-utils")
2020-03-26 12:26:07 +00:00
const path = require("path")
const fs = require("fs")
2020-03-26 09:34:31 +00:00
2020-11-12 16:35:42 +00:00
function getImageTag(imageName, distribution) {
if (imageName == "debian") {
return distribution.replace("UNRELEASED", "unstable")
.replace("-security", "")
} else {
return distribution.replace("UNRELEASED", "unstable")
.replace("-security", "")
.replace("-backports", "")
}
2020-03-26 14:37:35 +00:00
}
2020-11-12 16:35:42 +00:00
async function getImageName(distribution) {
const tag = getImageTag("", distribution)
for (const image of ["debian", "ubuntu"]) {
const tags = await hub.queryTags({ user: "library", name: image })
if (tags.find(t => t.name == tag)) {
return image
2020-03-26 14:37:35 +00:00
}
}
}
2020-03-26 09:34:31 +00:00
async function main() {
try {
2020-07-25 10:29:47 +00:00
const sourceRelativeDirectory = core.getInput("source_directory") || "./"
const artifactsRelativeDirectory = core.getInput("artifacts_directory") || "./"
2020-03-26 09:34:31 +00:00
2020-03-26 12:26:07 +00:00
const workspaceDirectory = process.cwd()
2020-03-26 14:37:35 +00:00
const sourceDirectory = path.join(workspaceDirectory, sourceRelativeDirectory)
const buildDirectory = path.dirname(sourceDirectory)
const artifactsDirectory = path.join(workspaceDirectory, artifactsRelativeDirectory)
const file = path.join(sourceDirectory, "debian/changelog")
2020-03-26 09:34:31 +00:00
const changelog = await firstline(file)
2020-11-12 16:35:42 +00:00
const regex = /^(?<pkg>.+) \(((?<epoch>[0-9]+):)?(?<version>[^:-]+)(-(?<revision>[^:-]+))?\) (?<distribution>.+);/
2020-03-26 09:34:31 +00:00
const match = changelog.match(regex)
2020-11-12 16:35:42 +00:00
const { pkg, epoch, version, revision, distribution } = match.groups
const imageName = await getImageName(distribution)
const imageTag = await getImageTag(imageName, distribution)
const container = pkg
const image = imageName + ":" + imageTag
2020-03-26 09:34:31 +00:00
2020-03-26 12:26:07 +00:00
fs.mkdirSync(artifactsDirectory, { recursive: true })
2020-03-26 15:04:59 +00:00
core.startGroup("Print details")
const details = {
2020-11-12 16:35:42 +00:00
pkg: pkg,
2020-03-26 17:39:23 +00:00
epoch: epoch,
2020-03-26 15:04:59 +00:00
version: version,
revision: revision,
2020-11-12 16:35:42 +00:00
distribution: distribution,
2020-03-26 15:04:59 +00:00
image: image,
2020-11-12 16:35:42 +00:00
container: container,
2020-03-26 15:04:59 +00:00
workspaceDirectory: workspaceDirectory,
sourceDirectory: sourceDirectory,
buildDirectory: buildDirectory,
artifactsDirectory: artifactsDirectory
}
console.log(details)
core.endGroup()
2020-03-26 09:34:31 +00:00
core.startGroup("Create container")
await exec.exec("docker", [
"create",
"--name", container,
"--volume", workspaceDirectory + ":" + workspaceDirectory,
2020-03-26 14:37:35 +00:00
"--workdir", sourceDirectory,
2020-03-26 15:51:21 +00:00
"--env", "DEBIAN_FRONTEND=noninteractive",
"--env", "DPKG_COLORS=always",
"--env", "FORCE_UNSAFE_CONFIGURE=1",
2020-03-26 09:34:31 +00:00
"--tty",
image,
"sleep", "inf"
])
2020-12-09 22:07:04 +00:00
core.saveState("container", container)
2020-03-26 09:34:31 +00:00
core.endGroup()
core.startGroup("Start container")
await exec.exec("docker", [
"start",
container
])
core.endGroup()
core.startGroup("Prepare environment")
await exec.exec("docker", [
"exec",
container,
2020-12-26 17:15:06 +00:00
"bash", "-c", "echo 'APT::Get::Assume-Yes \"true\";' > /etc/apt/apt.conf.d/00noconfirm"
])
await exec.exec("docker", [
"exec",
container,
2020-12-26 17:08:49 +00:00
"bash", "-c", "cat /etc/apt/apt.conf.d/00noconfirm"
])
await exec.exec("docker", [
"exec",
container,
2020-12-26 17:00:53 +00:00
"bash", "-c", "echo debconf debconf/frontend select Noninteractive | debconf-set-selections"
])
core.endGroup()
2020-03-26 12:26:07 +00:00
if (revision) {
core.startGroup("Create tarball")
await exec.exec("docker", [
"exec",
container,
"tar",
"--exclude-vcs",
"--exclude", "./debian",
2020-11-12 16:35:42 +00:00
"--transform", `s/^\./${pkg}-${version}/S`,
"-cvzf", `${buildDirectory}/${pkg}_${version}.orig.tar.gz`,
2020-03-26 15:00:12 +00:00
"-C", sourceDirectory,
"./"
2020-03-26 12:26:07 +00:00
])
core.endGroup()
}
2020-03-26 10:06:08 +00:00
2020-03-26 09:34:31 +00:00
core.startGroup("Update packages list")
await exec.exec("docker", [
"exec",
container,
"apt-get", "update"
])
core.endGroup()
core.startGroup("Install development packages")
await exec.exec("docker", [
"exec",
container,
2020-12-26 16:17:46 +00:00
"apt-get", "install", "-yq", "-t", imageTag, "dpkg-dev", "debhelper", "devscripts"
2020-03-26 09:34:31 +00:00
])
core.endGroup()
core.startGroup("Install build dependencies")
await exec.exec("docker", [
"exec",
container,
2020-11-12 16:35:42 +00:00
"apt-get", "build-dep", "-yq", "-t", imageTag, sourceDirectory
2020-03-26 09:34:31 +00:00
])
core.endGroup()
2020-12-26 16:13:03 +00:00
core.startGroup("Build packages")
2020-03-26 09:34:31 +00:00
await exec.exec("docker", [
"exec",
container,
2020-03-26 10:16:30 +00:00
"dpkg-buildpackage", "-tc"
2020-03-26 09:34:31 +00:00
])
core.endGroup()
2020-03-26 10:45:32 +00:00
2020-12-26 16:13:03 +00:00
core.startGroup("Install built packages")
await exec.exec("docker", [
"exec",
container,
"debi", "--with-depends"
])
core.endGroup()
core.startGroup("List packages contents")
await exec.exec("docker", [
"exec",
container,
"debc"
])
core.endGroup()
core.startGroup("Move build artifacts")
2020-03-26 10:49:41 +00:00
await exec.exec("docker", [
"exec",
container,
2020-03-26 11:07:14 +00:00
"find",
2020-03-26 14:37:35 +00:00
buildDirectory,
2020-03-26 11:07:14 +00:00
"-maxdepth", "1",
2020-11-12 16:35:42 +00:00
"-name", `${pkg}*${version}*.*`,
2020-03-26 11:07:14 +00:00
"-type", "f",
"-print",
"-exec", "mv", "{}", artifactsDirectory, ";"
2020-03-26 10:45:32 +00:00
])
core.endGroup()
2020-03-26 09:34:31 +00:00
} catch (error) {
core.setFailed(error.message)
}
}
main()