mirror of
https://github.com/cusspvz/openwrt-builder.docker
synced 2025-07-11 00:19:19 +00:00
Initial commit
This commit is contained in:
commit
c03c962f6f
20
.editorconfig
Normal file
20
.editorconfig
Normal file
@ -0,0 +1,20 @@
|
||||
# http://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
indent_size = 2
|
||||
indent_style = space
|
||||
max_line_length = 80
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[Dockerfile]
|
||||
indent_size = 4
|
||||
|
||||
[*.md]
|
||||
max_line_length = 0
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[COMMIT_EDITMSG]
|
||||
max_line_length = 0
|
12
.travis.yml
Normal file
12
.travis.yml
Normal file
@ -0,0 +1,12 @@
|
||||
sudo: required
|
||||
|
||||
services:
|
||||
- docker
|
||||
|
||||
script:
|
||||
- docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
|
||||
- ./builder.sh
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
122
README.md
Normal file
122
README.md
Normal file
@ -0,0 +1,122 @@
|
||||
# OpenWRT Docker Builder
|
||||
|
||||
Docker images for building packages and firmware images
|
||||
|
||||
## What does it do?
|
||||
|
||||
OpenWRT Build System is really huge, and takes a lot of time to build up
|
||||
things, so in order to make it easier to other Devs to use it, the Build
|
||||
System outputs two other build systems: the OpenWRT Package Builder and the
|
||||
OpenWRT Image/Firmware Builder.
|
||||
|
||||
### OpenWRT Package Builder
|
||||
|
||||
The Package Builder allows developers to build up a specific set of packages
|
||||
without having to build the entire packaging system. So this means that the
|
||||
developers just need to plug-in their Package Feeds and set which packages
|
||||
are meant to be built.
|
||||
|
||||
### OpenWRT Image/Firmware Builder
|
||||
|
||||
The Image Builder allows developers to build an Image/Firmware to deploy on
|
||||
their devices without having to build all the packages from scratch.
|
||||
This allows Continuous Delivery systems to be much more eficients since it is
|
||||
just installing packages into newly file-systems.
|
||||
|
||||
## Why?
|
||||
|
||||
I've build this because of disadvantages that I found on not having this:
|
||||
|
||||
1. Setup - It takes some time to setup. And on Docker-based CI environments,
|
||||
in case things aren't cleared properly, it introduces errors in between of
|
||||
build iterations.
|
||||
|
||||
2. Disk usage - A full setup for a target really takes a lot of space. It's
|
||||
better to have some setup where we have ephemeral changes between the build
|
||||
iterations, but only if we can cache the initial setup. (which we can by
|
||||
using docker)
|
||||
|
||||
## Architecture
|
||||
|
||||
### Base image
|
||||
`cusspvz/openwrt-builder:base`
|
||||
|
||||
We have a base image where all the other images are based from. This image is
|
||||
based on Debian and includes all the needed tools to the OpenWRT Builders.
|
||||
|
||||
### OpenWRT Package Builder
|
||||
`cusspvz/openwrt-builder:package-builder_VERSION_TARGET[_SUBTARGET]`
|
||||
|
||||
Examples: `cusspvz/openwrt-builder:package-builder_18.0.1_brcm2708-bcm2710`
|
||||
Examples: `cusspvz/openwrt-builder:package-builder_17.01.6_brcm2708-bcm2710`
|
||||
|
||||
|
||||
### OpenWRT Image/Firmware Builder
|
||||
`cusspvz/openwrt-builder:image-builder_VERSION_TARGET[_SUBTARGET]`
|
||||
|
||||
Examples: `cusspvz/openwrt-builder:image-builder_18.0.1_brcm2708-bcm2710`
|
||||
Examples: `cusspvz/openwrt-builder:image-builder_17.01.6_brcm2708-bcm2710`
|
||||
|
||||
#### Docker Container folders:
|
||||
`/src` - Builder Source
|
||||
`/feeds` - folder to link custom feeds. The image detects mounted folders
|
||||
automatically, so there's no need to tell us which feeds you want to build.
|
||||
`/overlay` - folder with files and folders to overlay on the images root
|
||||
`/output` - folder to output built images
|
||||
|
||||
## Usage
|
||||
|
||||
### OpenWRT Package Builder
|
||||
|
||||
Builds `.opkg` files and a `Packages.gz`
|
||||
|
||||
```bash
|
||||
|
||||
docker run -ti --rm \
|
||||
-e PACKAGES="transmission openvpn node node-npm" \
|
||||
-v /path/to/custom-packages-feed:/feeds/mypackages:z \
|
||||
-v /path/to/output-dir:/output:z \
|
||||
cusspvz/openwrt-builder:package-builder_18.0.1_brcm2708-bcm2710
|
||||
|
||||
```
|
||||
|
||||
### OpenWRT Image/Firmware Builder
|
||||
|
||||
Builds all the target's images.
|
||||
|
||||
```bash
|
||||
|
||||
docker run -ti --rm \
|
||||
-e PACKAGES="-luci transmission openvpn node node-npm" \
|
||||
-e CUSTOM_FEEDS="mypackages" \
|
||||
-v /path/to/custom-packages-feed:/feeds/mypackages:z \
|
||||
-v /path/to/overlay-dir:/overlay:z \
|
||||
-v /path/to/output-dir:/output:z \
|
||||
cusspvz/openwrt-builder:image-builder_18.0.1_brcm2708-bcm2710
|
||||
|
||||
```
|
||||
|
||||
|
||||
## Donate
|
||||
|
||||
Want to buy me a cup of coffee?
|
||||
|
||||
BTC: 3FyTUneEqXrpRyCjmXvH4kdmvg7Tomwc4j
|
||||
LTC: MFyux9RBvgjy79iQDgtegYMkJbUqiC27i7
|
||||
ETH: 0xa2b5Be27d03916E48Ae445A48d784B0E3cBD825a
|
||||
ETC: 0xC4b531135a381d2A91F718249eb33a90f187B231
|
||||
BTC-CASH: qpyme0065wt6c37jart8dn7fy8ldwua74spr2s7vy0
|
||||
|
||||
Thanks
|
||||
|
||||
|
||||
## Credits
|
||||
|
||||
Thanks to the user [jandelgado](https://github.com/jandelgado) for his work on the
|
||||
docker builder and the docker compiler.
|
||||
|
||||
This exists thanks to:
|
||||
- @OpenWRT team on [OpenWRT](https://github.com/openwrt/openwrt)
|
||||
- @jandelgado on [lede-dockercompiler](https://github.com/jandelgado/lede-dockercompiler)
|
||||
- @jandelgado on [lede-dockerbuilder](https://github.com/jandelgado/lede-dockerbuilder)
|
||||
|
24
base-image/Dockerfile
Normal file
24
base-image/Dockerfile
Normal file
@ -0,0 +1,24 @@
|
||||
FROM debian:8
|
||||
LABEL MAINTAINER "Jose Moreira <josemoreiravarzim@gmail.com>"
|
||||
|
||||
RUN echo "deb http://ftp.debian.org/debian jessie-backports main" >> /etc/apt/sources.list \
|
||||
&& apt-get update \
|
||||
&& apt-get -t jessie-backports install "gosu" \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
ca-certificates wget curl rsync \
|
||||
git subversion \
|
||||
build-essential g++ \
|
||||
python time unzip file gawk ccache gettext xsltproc \
|
||||
libssl-dev libncurses5-dev zlib1g-dev \
|
||||
&& apt-get autoclean \
|
||||
&& apt-get clean \
|
||||
&& apt-get autoremove \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
ADD etc/entrypoint.sh /entrypoint
|
||||
RUN chmod 755 /entrypoint
|
||||
|
||||
RUN mkdir -p /src /output
|
||||
WORKDIR /src
|
||||
ENTRYPOINT ["/entrypoint"]
|
||||
CMD ["/bin/bash"]
|
17
base-image/entrypoint.sh
Normal file
17
base-image/entrypoint.sh
Normal file
@ -0,0 +1,17 @@
|
||||
#!/bin/sh
|
||||
|
||||
chown -R $GOSU_USER /lede
|
||||
|
||||
# If GOSU_USER environment variable set to something other than 0:0 (root:root),
|
||||
# become user:group set within and exec command passed in args
|
||||
if [ "$GOSU_USER" != "0:0" ]; then
|
||||
# make sure a valid user exists in /etc/passwd
|
||||
if grep "^builder:" /etc/passwd; then
|
||||
sed -i "/^builder:/d" /etc/passwd
|
||||
fi
|
||||
echo "builder:x:$GOSU_USER:LEDE builder:/lede:/bin/bash" >> /etc/passwd
|
||||
exec gosu $GOSU_USER "$@"
|
||||
fi
|
||||
|
||||
# If GOSU_USER was 0:0 exec command passed in args without gosu (assume already root)
|
||||
exec "$@"
|
87
builder.sh
Executable file
87
builder.sh
Executable file
@ -0,0 +1,87 @@
|
||||
#!/bin/bash
|
||||
|
||||
DOCKER_USE_SUDO=${DOCKER_USE_SUDO:-0}
|
||||
DOCKER_USERNAME=${DOCKER_USERNAME:-cusspvz}
|
||||
DOCKER_PASSWORD=${DOCKER_PASSWORD}
|
||||
DOCKER_IMAGE=${DOCKER_IMAGE:-$DOCKER_USERNAME/openwrt-builder}
|
||||
|
||||
DOCKER="${DOCKER:-docker}"
|
||||
|
||||
CLOSE_EXEC="/dev/null"
|
||||
# CLOSE_EXEC=">/dev/null 2>&1"
|
||||
if [ ! -z DEBUG ]; then
|
||||
CLOSE_EXEC="/dev/null"
|
||||
fi
|
||||
|
||||
function safeexit () {
|
||||
echo "$1"
|
||||
[ ! -z $2 ] && exit $2 || exit 0
|
||||
}
|
||||
|
||||
if [ -z $DOCKER_USERNAME ] || [ -z $DOCKER_PASSWORD ]; then
|
||||
safeexit "Please make sure that you've specified the DOCKER_USERNAME and DOCKER_PASSWORD envs" 1
|
||||
fi
|
||||
|
||||
|
||||
if [ "$DOCKER_USE_SUDO" != "0" ]; then
|
||||
DOCKER="sudo ${DOCKER}"
|
||||
fi
|
||||
|
||||
function docker_tag_exists() {
|
||||
curl --silent -f -lSL https://index.docker.io/v1/repositories/$1/tags/$2 &>$CLOSE_EXEC;
|
||||
}
|
||||
|
||||
function generate_dockerfile_based_on() {
|
||||
echo "FROM $1:base"
|
||||
cat $2
|
||||
}
|
||||
|
||||
# MAIN - this is where it starts
|
||||
|
||||
echo "BASE - Building/Fetching base image"
|
||||
|
||||
# Lets pull up the base image
|
||||
$DOCKER pull "$DOCKER_IMAGE:base" &>$CLOSE_EXEC;
|
||||
|
||||
# Now that we have it in cache, lets build the base image to ensure
|
||||
# that it has the same output
|
||||
$DOCKER build -t "$DOCKER_IMAGE:base" ./base-image &>$CLOSE_EXEC;
|
||||
|
||||
# Push the docker base in case it gets changed
|
||||
$DOCKER push "$DOCKER_IMAGE:base" &>$CLOSE_EXEC;
|
||||
|
||||
# Now it's time to do the same
|
||||
for VERSION in $(ls targets/); do
|
||||
for TARGET in $(ls targets/${VERSION}/); do
|
||||
echo "${VERSION} ${TARGET} - Loading up target configs"
|
||||
eval "$(cat targets/${VERSION}/${TARGET})"
|
||||
|
||||
DOCKER_PACKAGE_BUILDER_TAG="package-builder_${VERSION}_${TARGET}"
|
||||
DOCKER_IMAGE_BUILDER_TAG="image-builder_${VERSION}_${TARGET}"
|
||||
|
||||
# Handle Package builder
|
||||
if docker_tag_exists "$DOCKER_IMAGE" "$DOCKER_PACKAGE_BUILDER_TAG"; then
|
||||
echo "${VERSION} ${TARGET} - Package Builder already exists"
|
||||
else
|
||||
echo "${VERSION} ${TARGET} - Building Package Builder ..."
|
||||
generate_dockerfile_based_on $DOCKER_IMAGE ./package-builder/Dockerfile | $DOCKER build -f - -t "$DOCKER_IMAGE:$DOCKER_PACKAGE_BUILDER_TAG" ./package-builder &>$CLOSE_EXEC;
|
||||
|
||||
echo "${VERSION} ${TARGET} - Pushing Package Builder ..."
|
||||
$DOCKER push "$DOCKER_IMAGE:$DOCKER_PACKAGE_BUILDER_TAG" &>$CLOSE_EXEC;
|
||||
fi
|
||||
|
||||
# Handle Image builder
|
||||
if docker_tag_exists "$DOCKER_IMAGE" "$DOCKER_IMAGE_BUILDER_TAG"; then
|
||||
echo "${VERSION} ${TARGET} - Image Builder already exists"
|
||||
else
|
||||
echo "${VERSION} ${TARGET} - Building Image Builder ..."
|
||||
generate_dockerfile_based_on $DOCKER_IMAGE ./image-builder/Dockerfile | $DOCKER build -f - -t "$DOCKER_IMAGE:$DOCKER_IMAGE_BUILDER_TAG" ./image-builder &>$CLOSE_EXEC;
|
||||
|
||||
echo "${VERSION} ${TARGET} - Pushing Image Builder ..."
|
||||
$DOCKER push "$DOCKER_IMAGE:$DOCKER_IMAGE_BUILDER_TAG" &>$CLOSE_EXEC;
|
||||
fi
|
||||
|
||||
done;
|
||||
done;
|
||||
|
||||
echo "Builder is now going to rest ..."
|
0
image-builder/Dockerfile
Normal file
0
image-builder/Dockerfile
Normal file
1
image-builder/builder.sh
Normal file
1
image-builder/builder.sh
Normal file
@ -0,0 +1 @@
|
||||
#!/bin/bash
|
2
package-builder/Dockerfile
Normal file
2
package-builder/Dockerfile
Normal file
@ -0,0 +1,2 @@
|
||||
LABEL MAINTAINER "Jose Moreira <josemoreiravarzim@gmail.com>"
|
||||
|
34
package-builder/builder.sh
Normal file
34
package-builder/builder.sh
Normal file
@ -0,0 +1,34 @@
|
||||
#!/bin/bash
|
||||
|
||||
PATH_SRC=/src
|
||||
PATH_FEEDS=/feeds
|
||||
CUSTOM_FEEDS=$(ls $PATH_FEEDS)
|
||||
CPUS=${CPUS:-2}
|
||||
CLEAN=${CLEAN:-0}
|
||||
|
||||
## Verify if we have packages to build
|
||||
[ -z "$PACKAGES" ] && {
|
||||
echo "Please provide a list of packages for us to build"
|
||||
exit 1
|
||||
}
|
||||
|
||||
## HANDLE FEEDS
|
||||
cp $PATH_SRC/feeds.conf.default $PATH_SRC/feeds.conf
|
||||
for CUSTOM_FEED in $CUSTOM_FEEDS; do
|
||||
echo "src-link ${CUSTOM_FEED} ${PATH_FEEDS}/${CUSTOM_FEED}" >> $PATH_SRC/feeds.conf
|
||||
done;
|
||||
|
||||
./scripts/feeds update -a
|
||||
for CUSTOM_FEED in $CUSTOM_FEEDS; do
|
||||
./scripts/feeds install -a -p $CUSTOM_FEED
|
||||
done;
|
||||
|
||||
make defconfig
|
||||
|
||||
for PACKAGE in $PACKAGES; do
|
||||
[ "$CLEAN" != "0" ] && {
|
||||
make package/${PACKAGE}/clean
|
||||
}
|
||||
|
||||
make package/${PACKAGE}/compile
|
||||
done
|
2
targets/18.0.1/brcm2708-brcm2710
Normal file
2
targets/18.0.1/brcm2708-brcm2710
Normal file
@ -0,0 +1,2 @@
|
||||
OWRT_IMAGE_BUILDER="http://downloads.openwrt.org/releases/18.06.1/targets/brcm2708/bcm2710/openwrt-imagebuilder-18.06.1-brcm2708-bcm2710.Linux-x86_64.tar.xz"
|
||||
OWRT_SDK="http://downloads.openwrt.org/releases/18.06.1/targets/brcm2708/bcm2710/openwrt-sdk-18.06.1-brcm2708-bcm2710_gcc-7.3.0_musl.Linux-x86_64.tar.xz"
|
Loading…
x
Reference in New Issue
Block a user