mirror of
https://github.com/vxcontrol/run-on-arch-action.git
synced 2026-07-01 10:04:29 -04:00
feat(base_image): add custom base_image argument
This commit is contained in:
@@ -21,6 +21,9 @@ jobs:
|
||||
distro: fedora_latest
|
||||
- arch: armv7
|
||||
distro: archarm_latest
|
||||
- arch: x86_64
|
||||
distro: ubuntu18.04
|
||||
base_image: ubuntu:18.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -30,6 +33,7 @@ jobs:
|
||||
with:
|
||||
arch: ${{ matrix.arch }}
|
||||
distro: ${{ matrix.distro }}
|
||||
base_image: ${{ matrix.base_image }}
|
||||
|
||||
# Not required, but speeds up builds
|
||||
githubToken: ${{ github.token }}
|
||||
|
||||
@@ -85,8 +85,8 @@ jobs:
|
||||
install: |
|
||||
case "${{ matrix.distro }}" in
|
||||
ubuntu*|jessie|stretch|buster|bullseye)
|
||||
apt-get update -q -y
|
||||
apt-get install -q -y git
|
||||
apt-get update -q -y --force-yes
|
||||
apt-get install -q -y --force-yes git
|
||||
;;
|
||||
fedora*)
|
||||
dnf -y update
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
.vscode/
|
||||
@@ -20,6 +20,7 @@ The action also accepts some optional input parameters:
|
||||
* `dockerRunArgs`: Additional arguments to pass to `docker run`, such as volume mappings. See [`docker run` documentation](https://docs.docker.com/engine/reference/commandline/run).
|
||||
* `setup`: Shell commands to execute on the host before running the container, such as creating directories for volume mappings.
|
||||
* `install`: Shell commands to execute in the container as part of `docker build`, such as installing dependencies. This speeds up subsequent builds if `githubToken` is also used, but note that the image layer will be publicly available in your projects GitHub Package Registry, so make sure the resulting image does not have any secrets cached in logs or state.
|
||||
* `base_image`: Specify a custom base image. This is optional. See the [advanced example](./.github/workflows/advanced-example.yml) in this repo.
|
||||
|
||||
### Basic example
|
||||
|
||||
|
||||
@@ -39,6 +39,10 @@ inputs:
|
||||
description: 'Shell commands to execute in the container as part of docker build, such as installing dependencies. This speeds up subsequent builds if githubToken is also used, but note that the image layer will be publicly available in your projects GitHub Package Registry, so make sure the resulting image does not have any secrets cached in logs or state.'
|
||||
required: false
|
||||
default: ''
|
||||
base_image:
|
||||
description: 'Using the specific custom base image.'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
runs:
|
||||
using: 'node16'
|
||||
|
||||
+38
-11
@@ -1,9 +1,13 @@
|
||||
/*jshint esversion: 9 */
|
||||
|
||||
const core = require('@actions/core')
|
||||
const fs = require('fs');
|
||||
const path = require('path')
|
||||
const YAML = require('yaml');
|
||||
const shlex = require('shlex');
|
||||
const { exec } = require('@actions/exec')
|
||||
const {
|
||||
exec
|
||||
} = require('@actions/exec')
|
||||
|
||||
function slug(str) {
|
||||
return str.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase();
|
||||
@@ -14,12 +18,30 @@ async function main() {
|
||||
throw new Error('run-on-arch supports only Linux')
|
||||
}
|
||||
|
||||
const arch = core.getInput('arch', { required: true });
|
||||
const distro = core.getInput('distro', { required: true });
|
||||
const arch = core.getInput('arch', {
|
||||
required: true
|
||||
});
|
||||
const distro = core.getInput('distro', {
|
||||
required: true
|
||||
});
|
||||
const base_image = core.getInput('base_image', {
|
||||
required: false
|
||||
});
|
||||
|
||||
// If bad arch/distro passed, fail fast before installing all the qemu stuff
|
||||
const dockerFile = path.join(
|
||||
__dirname, '..', 'Dockerfiles', `Dockerfile.${arch}.${distro}`);
|
||||
|
||||
// If a custom base image is given, then dynamically create its Dockerfile.
|
||||
if (base_image) {
|
||||
let lines = [];
|
||||
lines.push(`FROM ${base_image}`);
|
||||
lines.push("COPY ./run-on-arch-install.sh /root/run-on-arch-install.sh");
|
||||
lines.push("RUN chmod +x /root/run-on-arch-install.sh && /root/run-on-arch-install.sh");
|
||||
console.log(`Writing custom Dockerfile to: ${dockerFile} ...`);
|
||||
fs.writeFileSync(dockerFile, lines.join("\n"));
|
||||
}
|
||||
|
||||
if (!fs.existsSync(dockerFile)) {
|
||||
throw new Error(`run-on-arch: ${dockerFile} does not exist.`);
|
||||
}
|
||||
@@ -61,7 +83,9 @@ async function main() {
|
||||
|
||||
// Write container commands to a script file for running
|
||||
const commands = [
|
||||
`#!${shell}`, 'set -eu;', core.getInput('run', { required: true }),
|
||||
`#!${shell}`, 'set -eu;', core.getInput('run', {
|
||||
required: true
|
||||
}),
|
||||
].join('\n');
|
||||
fs.writeFileSync(
|
||||
path.join(__dirname, 'run-on-arch-commands.sh'),
|
||||
@@ -74,7 +98,9 @@ async function main() {
|
||||
const githubToken = core.getInput('githubToken');
|
||||
|
||||
// Copy environment variables from parent process
|
||||
const env = { ...process.env };
|
||||
const env = {
|
||||
...process.env
|
||||
};
|
||||
|
||||
if (githubToken) {
|
||||
env.GITHUB_TOKEN = githubToken;
|
||||
@@ -85,7 +111,7 @@ async function main() {
|
||||
// docker run.
|
||||
const envYAML = core.getInput('env');
|
||||
if (envYAML) {
|
||||
const mapping = YAML.parse(envYAML)
|
||||
const mapping = YAML.parse(envYAML);
|
||||
if (typeof mapping !== 'object' || mapping instanceof Array) {
|
||||
throw new Error(`run-on-arch: env must be a flat mapping of key/value pairs.`);
|
||||
}
|
||||
@@ -105,14 +131,15 @@ async function main() {
|
||||
arch, distro,
|
||||
].join('-'));
|
||||
|
||||
console.log('Configuring Docker for multi-architecture support')
|
||||
console.log('Configuring Docker for multi-architecture support');
|
||||
await exec(
|
||||
path.join(__dirname, 'run-on-arch.sh'),
|
||||
[ dockerFile, containerName, ...dockerRunArgs ],
|
||||
{ env },
|
||||
[dockerFile, containerName, ...dockerRunArgs], {
|
||||
env
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
core.setFailed(err.message)
|
||||
})
|
||||
core.setFailed(err.message);
|
||||
});
|
||||
Reference in New Issue
Block a user