├── .gitignore ├── .github ├── dependabot.yml └── workflows │ └── containers.yml ├── Dockerfile.rootfs ├── Dockerfile ├── setup.sh ├── keys ├── 0x1D53D1877742E911.asc ├── 88CA59E8.asc ├── 2074BE7A.asc ├── CD54E82DADB3684D.asc └── 626471F1.asc ├── README.md └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | sha256sums* 2 | usign/ 3 | gpg/ 4 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "github-actions" 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "weekly" 12 | -------------------------------------------------------------------------------- /Dockerfile.rootfs: -------------------------------------------------------------------------------- 1 | FROM ghcr.io/openwrt/buildbot/buildworker-v3.11.8:v21 as builder 2 | 3 | ARG DOWNLOAD_FILE="imagebuilder-.*x86_64.tar.[xz|zst]" 4 | ARG TARGET=x86/64 5 | ARG FILE_HOST=downloads.openwrt.org 6 | ARG VERSION_PATH 7 | 8 | ENV DOWNLOAD_FILE=$DOWNLOAD_FILE 9 | ENV TARGET=$TARGET 10 | ENV FILE_HOST=$FILE_HOST 11 | ENV VERSION_PATH=$VERSION_PATH 12 | 13 | USER root 14 | WORKDIR /builder/rootfs 15 | 16 | ADD --chown=buildbot:buildbot keys/*.asc /builder/keys/ 17 | COPY --chmod=0755 setup.sh /builder/setup.sh 18 | 19 | RUN /builder/setup.sh 20 | 21 | FROM scratch 22 | 23 | ARG CMD=/bin/ash 24 | ARG USER=root 25 | 26 | ENV CMD=$CMD 27 | ENV USER=$USER 28 | 29 | COPY --from=builder /builder/rootfs/ / 30 | 31 | ENTRYPOINT [ ] 32 | 33 | # required to have CMD as ENV to be executed 34 | ENV CMD_ENV=${CMD} 35 | CMD ${CMD_ENV} -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG BASE_IMAGE=ghcr.io/openwrt/buildbot/buildworker-v3.11.8:v21 2 | 3 | FROM $BASE_IMAGE 4 | ARG USER=buildbot 5 | ARG WORKDIR=/builder/ 6 | ARG CMD="/bin/bash" 7 | 8 | ARG DOWNLOAD_FILE="imagebuilder-.*x86_64.tar.[xz|zst]" 9 | ARG TARGET=x86/64 10 | ARG FILE_HOST=downloads.openwrt.org 11 | ARG VERSION_PATH 12 | 13 | ENV DOWNLOAD_FILE=$DOWNLOAD_FILE 14 | ENV TARGET=$TARGET 15 | ENV FILE_HOST=$FILE_HOST 16 | ENV VERSION_PATH=$VERSION_PATH 17 | 18 | USER $USER 19 | WORKDIR $WORKDIR 20 | 21 | ADD --chown=buildbot:buildbot keys/*.asc /builder/keys/ 22 | COPY --chmod=0755 setup.sh /builder/setup.sh 23 | 24 | ARG RUN_SETUP=0 25 | ENV RUN_SETUP=$RUN_SETUP 26 | RUN if [ "$RUN_SETUP" -eq 1 ]; then /builder/setup.sh; fi 27 | 28 | ENTRYPOINT [ ] 29 | 30 | # required to have CMD as ENV to be executed 31 | ENV CMD_ENV=${CMD} 32 | CMD ${CMD_ENV} 33 | -------------------------------------------------------------------------------- /setup.sh: -------------------------------------------------------------------------------- 1 | set -e 2 | 3 | # the inputs: 4 | TARGET="${TARGET:-x86/64}" 5 | VERSION_PATH="${VERSION_PATH:-snapshots}" 6 | FILE_HOST="${UPSTREAM_URL:-${FILE_HOST:-https://downloads.openwrt.org}}" 7 | DOWNLOAD_FILE="${DOWNLOAD_FILE:-imagebuilder-.*x86_64.tar.[xz|zst]}" 8 | DOWNLOAD_PATH="$VERSION_PATH/targets/$TARGET" 9 | 10 | wget -nv "$FILE_HOST/$DOWNLOAD_PATH/sha256sums" -O sha256sums 11 | wget -nv "$FILE_HOST/$DOWNLOAD_PATH/sha256sums.asc" -O sha256sums.asc 12 | 13 | gpg --import /builder/keys/*.asc && rm -rf /builder/keys/ 14 | gpg --with-fingerprint --verify sha256sums.asc sha256sums 15 | 16 | # determine archive name 17 | file_name="$(grep "$DOWNLOAD_FILE" sha256sums | cut -d "*" -f 2)" 18 | 19 | # download imagebuilder/sdk archive 20 | wget -nv "$FILE_HOST/$DOWNLOAD_PATH/$file_name" 21 | 22 | # shrink checksum file to single desired file and verify downloaded archive 23 | grep "$file_name" sha256sums > sha256sums_min 24 | cat sha256sums_min 25 | sha256sum -c sha256sums_min 26 | 27 | # cleanup 28 | rm -vrf sha256sums{,_min,.asc} keys/ 29 | 30 | tar xf "$file_name" --strip=1 --no-same-owner -C . 31 | rm -vrf "$file_name" 32 | -------------------------------------------------------------------------------- /keys/0x1D53D1877742E911.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | 3 | 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 50 | DA== 51 | =kEP/ 52 | -----END PGP PUBLIC KEY BLOCK----- 53 | -------------------------------------------------------------------------------- /keys/88CA59E8.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | 3 | 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 51 | DAT8f8syxL8GNRw= 52 | =Odut 53 | -----END PGP PUBLIC KEY BLOCK----- 54 | -------------------------------------------------------------------------------- /keys/2074BE7A.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | Comment: OpenWrt 19.07 public key 3 | 4 | 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 53 | =VpI5 54 | -----END PGP PUBLIC KEY BLOCK----- 55 | -------------------------------------------------------------------------------- /keys/CD54E82DADB3684D.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | 3 | 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 63 | pnfnQw== 64 | =TMB4 65 | -----END PGP PUBLIC KEY BLOCK----- 66 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenWrt Docker repository 2 | 3 | [![GPL-2.0-only License][license-badge]][license-ref] 4 | [![CI][ci-badge]][ci-ref] 5 | [![Docker Hub][docker-hub-badge]][docker-hub-ref] 6 | 7 | This repository contains files to create OpenWrt containers. While mostly used 8 | for our CI you may use the scripts to build containers on your own. 9 | 10 | > [!WARNING] 11 | > Starting with the branch of OpenWrt 24.10 any snapshot (aka nightly), builds no 12 | > longer contain the actual binaries but instead a `setup.sh` script. The 13 | > environment variables are set automatically per container to download the 14 | > correct archive containing the SDK/ImageBuilder/rootfs. This dramatically 15 | > reduces bandwidth and storage usage. Sorry for the inconvenience. 16 | 17 | Available containers: 18 | 19 | * `sdk` compile OpenWrt packages 20 | * `imagebuilder` create firmware images 21 | * `rootfs` test software inside an OpenWrt runtime 22 | 23 | All containers are mirrored to the following three registries under `openwrt` account: 24 | 25 | * docker.io ([sdk](https://hub.docker.com/r/openwrt/sdk) | [imagebuilder](https://hub.docker.com/r/openwrt/imagebuilder) | [rootfs](https://hub.docker.com/r/openwrt/rootfs)) `*` 26 | * ghcr.io ([sdk](https://github.com/openwrt/docker-openwrt/pkgs/container/sdk) | [imagebuilder](https://github.com/openwrt/docker-openwrt/pkgs/container/imagebuilder) | [rootfs](https://github.com/openwrt/docker-openwrt/pkgs/container/rootfs)) 27 | * quay.io ([sdk](https://quay.io/repository/openwrt/sdk) | [imagebuilder](https://quay.io/repository/openwrt/imagebuilder) | [rootfs](https://quay.io/repository/openwrt/rootfs)) 28 | 29 | > `*` We have switched our account from `openwrtorg` to `openwrt` on docker.io 30 | 31 | Find more details on the container types below 32 | 33 | ## `sdk` 34 | 35 | Contains the [OpenWrt 36 | SDK](https://openwrt.org/docs/guide-developer/toolchain/using_the_sdk) based on 37 | the same container we use for our [Buildbot](https://buildbot.openwrt.org/) 38 | infrastructure. This can be useful when building packages on macOS, Windows or 39 | via CI. 40 | 41 | ### SDK Example 42 | 43 | ```shell 44 | docker run --rm -v "$(pwd)"/bin/:/builder/bin -it openwrt/sdk 45 | # inside the Docker container 46 | [ ! -d ./scripts ] && ./setup.sh 47 | ./scripts/feeds update packages 48 | make defconfig 49 | ./scripts/feeds install tmate 50 | make package/tmate/{clean,compile} -j$(nproc) 51 | ``` 52 | 53 | Enjoy a local OpenWrt SDK container building the `tmate` package with the 54 | binary in hosts `./bin` folder. 55 | 56 | ### SDK Tags 57 | 58 | All currently available SDKs via tags in the following format: 59 | 60 | * `-[-]` 61 | * `[-]` 62 | 63 | The `branch|tag|version` can be something like `openwrt-22.03` (branch), 64 | `v22.03.4` (tag) or `21.02.3` (version). To use daily builds use either `main` 65 | or `SNAPSHOT`. 66 | 67 | ## `imagebuilder` 68 | 69 | Contains the [OpenWrt 70 | ImageBuilder](https://openwrt.org/docs/guide-user/additional-software/imagebuilder) 71 | based on the same container we use for our [buildbot](https://buildbot.openwrt.org) 72 | infrastructure. This can be useful when creating images on macOS, Windows or 73 | via CI. 74 | 75 | ### ImageBuilder Example 76 | 77 | ```shell 78 | docker run --rm -v "$(pwd)"/bin/:/builder/bin -it openwrt/imagebuilder 79 | # inside the Docker container 80 | [ ! -d ./scripts ] && ./setup.sh 81 | make image PROFILE=generic PACKAGES=tmate 82 | ``` 83 | 84 | Enjoy a local OpenWrt ImageBuilder container building an image for x86/64 and 85 | store the binary in hosts `./bin` folder. 86 | 87 | ### ImageBuilder Tags 88 | 89 | All currently available ImageBuilders via tags in the following format: 90 | 91 | * `-[-]` 92 | * `[-]` 93 | 94 | The `branch|tag|version` can be something like `openwrt-22.03` (branch), 95 | `v22.03.4` (tag) or `21.02.3` (version). To use daily builds use either `main` 96 | or `SNAPSHOT`. 97 | 98 | ## `rootfs` (experimental) 99 | 100 | > The OpenWrt runtime uses multiple active services to work, it's not really 101 | > suited as a container. This `rootfs` should only be used for special cases 102 | > like CI testing. 103 | 104 | An unpackaged version of OpenWrt's rootfs for different architectures. The 105 | `./rootfs` folder requires slight modifications to work within Docker, 106 | additional files for the rootfs should be added there before building. 107 | 108 | ### Rootfs Example 109 | 110 | ```shell 111 | docker run --rm -it openwrt/rootfs 112 | # inside the Docker container 113 | [ ! -d ./scripts ] && ./setup.sh 114 | mkdir /var/lock/ 115 | opkg update 116 | opkg install tmate 117 | tmate 118 | ``` 119 | 120 | Enjoy a local OpenWrt container running the x86/64 architecture with internet 121 | access. Once closed the container is removed. 122 | 123 | ### Rootfs Tags 124 | 125 | `|||armvirt/32|armvirt/64|malta/be|mvebu/cortexa9` 126 | 127 | * `x86/64` or `x86_64` 128 | * `x86/generic` or `i386_pentium4` 129 | * `x86/geode` or `i386_pentium-mmx` 130 | * `armvirt/32` or `arm_cortex-a15_neon-vfpv4` 131 | * `armvirt/64` or `aarch64_cortex-a53` 132 | * `malta/be` or `mips_24kc` 133 | * `mvebu/cortexa9` or `arm_cortex-a9_vfpv3-d16` 134 | 135 | ## Build Your Own 136 | 137 | If you wan to create your own container you can use the `Dockerfile`. You can set the following build arguments: 138 | 139 | * `TARGET` - the target to build for (e.g. `x86/64`) 140 | * `DOWNLOAD_FILE` - the file to download (e.g. `imagebuilder-.*x86_64.tar.xz`) 141 | * `FILE_HOST` - the host to download the ImageBuilder/SDK/rootfs from (e.g. `downloads.openwrt.org`) 142 | * `VERSION_PATH` - the path to the ImageBuilder/SDK/rootfs (e.g. `snapshots` or `releases/21.02.3`) 143 | 144 | ### Example ImageBuilder 145 | 146 | > If you plan to use your own server please add your own GPG key to the 147 | > `./keys/` folder. 148 | 149 | ```shell 150 | docker build \ 151 | --build-arg TARGET=x86/64 \ 152 | --build-arg DOWNLOAD_FILE="imagebuilder-.*x86_64.tar.[xz|zst]" \ 153 | --build-arg FILE_HOST=downloads.openwrt.org \ 154 | --build-arg VERSION_PATH=snapshots \ 155 | -t openwrt/x86_64 . 156 | ``` 157 | 158 | [ci-badge]: https://github.com/openwrt/docker/actions/workflows/containers.yml/badge.svg 159 | [ci-ref]: https://github.com/openwrt/docker/actions/workflows/containers.yml 160 | [docker-hub-badge]: https://img.shields.io/badge/docker--hub-openwrt-blue.svg?style=flat-square 161 | [docker-hub-ref]: https://hub.docker.com/u/openwrt 162 | [license-badge]: https://img.shields.io/github/license/openwrt/docker.svg?style=flat-square 163 | [license-ref]: LICENSE 164 | -------------------------------------------------------------------------------- /keys/626471F1.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | Comment: PGP key for unattended snapshot builds 3 | 4 | mQINBFeXZ7wBEAC3QZ+jhWrdj2XW9AdZpZrgHETZCW7lXxI3pJ2kS4UXNq+40KR2 5 | GJOdsXDnLb7ZiHNn6yio6qKLXFD/bimxK+22HSJlc3LSF2kKzNrgKoFR2rIKbL3c 6 | Us7GpWY8VqGTrfwR6OQNcoWqa1n5/tK9xuqKhfpoA2Eci8K+w5YCzCmnOz2vzbgS 7 | ptuFshTKYI2Z/DLQZyP+OQkEYPfCdani2KsISn4DTx8xFjmW/sb/zf0isemTwWyK 8 | Oh76FTa0tYdjTtAv3JHqyr2XkddM/oUSc09baCOfhUdo7Ep5rUqKw7BQsjreBYoZ 9 | WcL/hmlIksUrFlqo/HRpoBgCZpSjsF/Z9otZpSugMHVVlRCnAKQiWxWAd+V+y2FG 10 | q79myPgiMkbkaIrCelrUhDFRQ5wTnfAppFolw+xtT9bwdkwxZDNBe6PCYuLqD8wg 11 | jtDtt3q5UaUOMGJrMDKZ0Wi6ycdl/sM59kLfyBV4ybmYkwOLTlMvOATiyUZeJJZO 12 | 2bTKBvD+izsx3Ea4VLPWYSFmk6QwaOMtj6tcXwBgtljzqMJ0S9Gubmopy3WAkP/m 13 | /6ETJpuIupqEtvbRTX4O/+qnBgY40aQX7B4NgJi2SypP/WML5v2B2amLlhTcN+we 14 | ULWyH9KvfKny5mrtG5C9xq1eAgKtB2QEDEbRyz34DWVWGpqIY1mscaNv8wARAQAB 15 | tF1PcGVuV3J0IEJ1aWxkIFN5c3RlbSAoUEdQIGtleSBmb3IgdW5hdHRlbmRlZCBz 16 | bmFwc2hvdCBidWlsZHMpIDxwZ3BzaWduLXNuYXBzaG90c0BvcGVud3J0Lm9yZz6J 17 | AlEEEwEIADsCGwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AWIQRUzHQweixtyc5h 18 | gmnNhLztYmRx8QUCXTdRjQIZAQAKCRDNhLztYmRx8QgjEACmORm3zSoIX77q3YXg 19 | rjLiCaHBCT+2ViyuGbI121jUhy1mJk3+258Jl0YOddLjQovK3mECWOIU8UoucAkK 20 | OKRNV5bSCQtlp5sjiw8mUc6NAJ74Ef+SHEV4JYK64JDfQrQU8TuqzWUwTDHhJxhU 21 | nlk4NWSpq9jQDIaeS5YqS2SHNOGACAYmcRWuWEkAXe/FECWZYR3C8ukX3FhdSZM2 22 | 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 100 | 94igaYUvzmq0U7NziyphAaEuP2IxF+Y3 101 | =hW8R 102 | -----END PGP PUBLIC KEY BLOCK----- 103 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 2, June 1991 3 | 4 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | Preamble 10 | 11 | The licenses for most software are designed to take away your 12 | freedom to share and change it. By contrast, the GNU General Public 13 | License is intended to guarantee your freedom to share and change free 14 | software--to make sure the software is free for all its users. This 15 | General Public License applies to most of the Free Software 16 | Foundation's software and to any other program whose authors commit to 17 | using it. (Some other Free Software Foundation software is covered by 18 | the GNU Lesser General Public License instead.) You can apply it to 19 | your programs, too. 20 | 21 | When we speak of free software, we are referring to freedom, not 22 | price. Our General Public Licenses are designed to make sure that you 23 | have the freedom to distribute copies of free software (and charge for 24 | this service if you wish), that you receive source code or can get it 25 | if you want it, that you can change the software or use pieces of it 26 | in new free programs; and that you know you can do these things. 27 | 28 | To protect your rights, we need to make restrictions that forbid 29 | anyone to deny you these rights or to ask you to surrender the rights. 30 | These restrictions translate to certain responsibilities for you if you 31 | distribute copies of the software, or if you modify it. 32 | 33 | For example, if you distribute copies of such a program, whether 34 | gratis or for a fee, you must give the recipients all the rights that 35 | you have. You must make sure that they, too, receive or can get the 36 | source code. And you must show them these terms so they know their 37 | rights. 38 | 39 | We protect your rights with two steps: (1) copyright the software, and 40 | (2) offer you this license which gives you legal permission to copy, 41 | distribute and/or modify the software. 42 | 43 | Also, for each author's protection and ours, we want to make certain 44 | that everyone understands that there is no warranty for this free 45 | software. If the software is modified by someone else and passed on, we 46 | want its recipients to know that what they have is not the original, so 47 | that any problems introduced by others will not reflect on the original 48 | authors' reputations. 49 | 50 | Finally, any free program is threatened constantly by software 51 | patents. We wish to avoid the danger that redistributors of a free 52 | program will individually obtain patent licenses, in effect making the 53 | program proprietary. To prevent this, we have made it clear that any 54 | patent must be licensed for everyone's free use or not licensed at all. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | GNU GENERAL PUBLIC LICENSE 60 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 61 | 62 | 0. This License applies to any program or other work which contains 63 | a notice placed by the copyright holder saying it may be distributed 64 | under the terms of this General Public License. The "Program", below, 65 | refers to any such program or work, and a "work based on the Program" 66 | means either the Program or any derivative work under copyright law: 67 | that is to say, a work containing the Program or a portion of it, 68 | either verbatim or with modifications and/or translated into another 69 | language. (Hereinafter, translation is included without limitation in 70 | the term "modification".) Each licensee is addressed as "you". 71 | 72 | Activities other than copying, distribution and modification are not 73 | covered by this License; they are outside its scope. The act of 74 | running the Program is not restricted, and the output from the Program 75 | is covered only if its contents constitute a work based on the 76 | Program (independent of having been made by running the Program). 77 | Whether that is true depends on what the Program does. 78 | 79 | 1. You may copy and distribute verbatim copies of the Program's 80 | source code as you receive it, in any medium, provided that you 81 | conspicuously and appropriately publish on each copy an appropriate 82 | copyright notice and disclaimer of warranty; keep intact all the 83 | notices that refer to this License and to the absence of any warranty; 84 | and give any other recipients of the Program a copy of this License 85 | along with the Program. 86 | 87 | You may charge a fee for the physical act of transferring a copy, and 88 | you may at your option offer warranty protection in exchange for a fee. 89 | 90 | 2. You may modify your copy or copies of the Program or any portion 91 | of it, thus forming a work based on the Program, and copy and 92 | distribute such modifications or work under the terms of Section 1 93 | above, provided that you also meet all of these conditions: 94 | 95 | a) You must cause the modified files to carry prominent notices 96 | stating that you changed the files and the date of any change. 97 | 98 | b) You must cause any work that you distribute or publish, that in 99 | whole or in part contains or is derived from the Program or any 100 | part thereof, to be licensed as a whole at no charge to all third 101 | parties under the terms of this License. 102 | 103 | c) If the modified program normally reads commands interactively 104 | when run, you must cause it, when started running for such 105 | interactive use in the most ordinary way, to print or display an 106 | announcement including an appropriate copyright notice and a 107 | notice that there is no warranty (or else, saying that you provide 108 | a warranty) and that users may redistribute the program under 109 | these conditions, and telling the user how to view a copy of this 110 | License. (Exception: if the Program itself is interactive but 111 | does not normally print such an announcement, your work based on 112 | the Program is not required to print an announcement.) 113 | 114 | These requirements apply to the modified work as a whole. If 115 | identifiable sections of that work are not derived from the Program, 116 | and can be reasonably considered independent and separate works in 117 | themselves, then this License, and its terms, do not apply to those 118 | sections when you distribute them as separate works. But when you 119 | distribute the same sections as part of a whole which is a work based 120 | on the Program, the distribution of the whole must be on the terms of 121 | this License, whose permissions for other licensees extend to the 122 | entire whole, and thus to each and every part regardless of who wrote it. 123 | 124 | Thus, it is not the intent of this section to claim rights or contest 125 | your rights to work written entirely by you; rather, the intent is to 126 | exercise the right to control the distribution of derivative or 127 | collective works based on the Program. 128 | 129 | In addition, mere aggregation of another work not based on the Program 130 | with the Program (or with a work based on the Program) on a volume of 131 | a storage or distribution medium does not bring the other work under 132 | the scope of this License. 133 | 134 | 3. You may copy and distribute the Program (or a work based on it, 135 | under Section 2) in object code or executable form under the terms of 136 | Sections 1 and 2 above provided that you also do one of the following: 137 | 138 | a) Accompany it with the complete corresponding machine-readable 139 | source code, which must be distributed under the terms of Sections 140 | 1 and 2 above on a medium customarily used for software interchange; or, 141 | 142 | b) Accompany it with a written offer, valid for at least three 143 | years, to give any third party, for a charge no more than your 144 | cost of physically performing source distribution, a complete 145 | machine-readable copy of the corresponding source code, to be 146 | distributed under the terms of Sections 1 and 2 above on a medium 147 | customarily used for software interchange; or, 148 | 149 | c) Accompany it with the information you received as to the offer 150 | to distribute corresponding source code. (This alternative is 151 | allowed only for noncommercial distribution and only if you 152 | received the program in object code or executable form with such 153 | an offer, in accord with Subsection b above.) 154 | 155 | The source code for a work means the preferred form of the work for 156 | making modifications to it. For an executable work, complete source 157 | code means all the source code for all modules it contains, plus any 158 | associated interface definition files, plus the scripts used to 159 | control compilation and installation of the executable. However, as a 160 | special exception, the source code distributed need not include 161 | anything that is normally distributed (in either source or binary 162 | form) with the major components (compiler, kernel, and so on) of the 163 | operating system on which the executable runs, unless that component 164 | itself accompanies the executable. 165 | 166 | If distribution of executable or object code is made by offering 167 | access to copy from a designated place, then offering equivalent 168 | access to copy the source code from the same place counts as 169 | distribution of the source code, even though third parties are not 170 | compelled to copy the source along with the object code. 171 | 172 | 4. You may not copy, modify, sublicense, or distribute the Program 173 | except as expressly provided under this License. Any attempt 174 | otherwise to copy, modify, sublicense or distribute the Program is 175 | void, and will automatically terminate your rights under this License. 176 | However, parties who have received copies, or rights, from you under 177 | this License will not have their licenses terminated so long as such 178 | parties remain in full compliance. 179 | 180 | 5. You are not required to accept this License, since you have not 181 | signed it. However, nothing else grants you permission to modify or 182 | distribute the Program or its derivative works. These actions are 183 | prohibited by law if you do not accept this License. Therefore, by 184 | modifying or distributing the Program (or any work based on the 185 | Program), you indicate your acceptance of this License to do so, and 186 | all its terms and conditions for copying, distributing or modifying 187 | the Program or works based on it. 188 | 189 | 6. Each time you redistribute the Program (or any work based on the 190 | Program), the recipient automatically receives a license from the 191 | original licensor to copy, distribute or modify the Program subject to 192 | these terms and conditions. You may not impose any further 193 | restrictions on the recipients' exercise of the rights granted herein. 194 | You are not responsible for enforcing compliance by third parties to 195 | this License. 196 | 197 | 7. If, as a consequence of a court judgment or allegation of patent 198 | infringement or for any other reason (not limited to patent issues), 199 | conditions are imposed on you (whether by court order, agreement or 200 | otherwise) that contradict the conditions of this License, they do not 201 | excuse you from the conditions of this License. If you cannot 202 | distribute so as to satisfy simultaneously your obligations under this 203 | License and any other pertinent obligations, then as a consequence you 204 | may not distribute the Program at all. For example, if a patent 205 | license would not permit royalty-free redistribution of the Program by 206 | all those who receive copies directly or indirectly through you, then 207 | the only way you could satisfy both it and this License would be to 208 | refrain entirely from distribution of the Program. 209 | 210 | If any portion of this section is held invalid or unenforceable under 211 | any particular circumstance, the balance of the section is intended to 212 | apply and the section as a whole is intended to apply in other 213 | circumstances. 214 | 215 | It is not the purpose of this section to induce you to infringe any 216 | patents or other property right claims or to contest validity of any 217 | such claims; this section has the sole purpose of protecting the 218 | integrity of the free software distribution system, which is 219 | implemented by public license practices. Many people have made 220 | generous contributions to the wide range of software distributed 221 | through that system in reliance on consistent application of that 222 | system; it is up to the author/donor to decide if he or she is willing 223 | to distribute software through any other system and a licensee cannot 224 | impose that choice. 225 | 226 | This section is intended to make thoroughly clear what is believed to 227 | be a consequence of the rest of this License. 228 | 229 | 8. If the distribution and/or use of the Program is restricted in 230 | certain countries either by patents or by copyrighted interfaces, the 231 | original copyright holder who places the Program under this License 232 | may add an explicit geographical distribution limitation excluding 233 | those countries, so that distribution is permitted only in or among 234 | countries not thus excluded. In such case, this License incorporates 235 | the limitation as if written in the body of this License. 236 | 237 | 9. The Free Software Foundation may publish revised and/or new versions 238 | of the General Public License from time to time. Such new versions will 239 | be similar in spirit to the present version, but may differ in detail to 240 | address new problems or concerns. 241 | 242 | Each version is given a distinguishing version number. If the Program 243 | specifies a version number of this License which applies to it and "any 244 | later version", you have the option of following the terms and conditions 245 | either of that version or of any later version published by the Free 246 | Software Foundation. If the Program does not specify a version number of 247 | this License, you may choose any version ever published by the Free Software 248 | Foundation. 249 | 250 | 10. If you wish to incorporate parts of the Program into other free 251 | programs whose distribution conditions are different, write to the author 252 | to ask for permission. For software which is copyrighted by the Free 253 | Software Foundation, write to the Free Software Foundation; we sometimes 254 | make exceptions for this. Our decision will be guided by the two goals 255 | of preserving the free status of all derivatives of our free software and 256 | of promoting the sharing and reuse of software generally. 257 | 258 | NO WARRANTY 259 | 260 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 261 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 262 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 263 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 264 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 265 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 266 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 267 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 268 | REPAIR OR CORRECTION. 269 | 270 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 271 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 272 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 273 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 274 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 275 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 276 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 277 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 278 | POSSIBILITY OF SUCH DAMAGES. 279 | 280 | END OF TERMS AND CONDITIONS 281 | 282 | How to Apply These Terms to Your New Programs 283 | 284 | If you develop a new program, and you want it to be of the greatest 285 | possible use to the public, the best way to achieve this is to make it 286 | free software which everyone can redistribute and change under these terms. 287 | 288 | To do so, attach the following notices to the program. It is safest 289 | to attach them to the start of each source file to most effectively 290 | convey the exclusion of warranty; and each file should have at least 291 | the "copyright" line and a pointer to where the full notice is found. 292 | 293 | 294 | Copyright (C) 295 | 296 | This program is free software; you can redistribute it and/or modify 297 | it under the terms of the GNU General Public License as published by 298 | the Free Software Foundation; either version 2 of the License, or 299 | (at your option) any later version. 300 | 301 | This program is distributed in the hope that it will be useful, 302 | but WITHOUT ANY WARRANTY; without even the implied warranty of 303 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 304 | GNU General Public License for more details. 305 | 306 | You should have received a copy of the GNU General Public License along 307 | with this program; if not, write to the Free Software Foundation, Inc., 308 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 309 | 310 | Also add information on how to contact you by electronic and paper mail. 311 | 312 | If the program is interactive, make it output a short notice like this 313 | when it starts in an interactive mode: 314 | 315 | Gnomovision version 69, Copyright (C) year name of author 316 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 317 | This is free software, and you are welcome to redistribute it 318 | under certain conditions; type `show c' for details. 319 | 320 | The hypothetical commands `show w' and `show c' should show the appropriate 321 | parts of the General Public License. Of course, the commands you use may 322 | be called something other than `show w' and `show c'; they could even be 323 | mouse-clicks or menu items--whatever suits your program. 324 | 325 | You should also get your employer (if you work as a programmer) or your 326 | school, if any, to sign a "copyright disclaimer" for the program, if 327 | necessary. Here is a sample; alter the names: 328 | 329 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 330 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 331 | 332 | , 1 April 1989 333 | Ty Coon, President of Vice 334 | 335 | This General Public License does not permit incorporating your program into 336 | proprietary programs. If your program is a subroutine library, you may 337 | consider it more useful to permit linking proprietary applications with the 338 | library. If this is what you want to do, use the GNU Lesser General 339 | Public License instead of this License. 340 | -------------------------------------------------------------------------------- /.github/workflows/containers.yml: -------------------------------------------------------------------------------- 1 | name: Build and push containers 2 | run-name: ${{ inputs.ref }} ${{ inputs.target }} 3 | 4 | env: 5 | FILE_HOST: https://mirror-03.infra.openwrt.org 6 | 7 | on: 8 | # push: 9 | pull_request: 10 | workflow_dispatch: 11 | inputs: 12 | ref: 13 | description: "Tag or branch to deploy (empty for main)" 14 | default: "main" 15 | required: false 16 | target: 17 | description: "Single target to build (empty for all)" 18 | required: false 19 | file_host: 20 | description: "File host to use (empty for default)" 21 | required: false 22 | prefix: 23 | description: "Prefix for the image name (add '-' at the end)" 24 | required: false 25 | 26 | jobs: 27 | generate_matrix: 28 | name: Set matrix 29 | runs-on: ubuntu-latest 30 | 31 | outputs: 32 | imagebuilders: ${{ steps.find_targets.outputs.imagebuilders }} 33 | rootfs: ${{ steps.find_targets.outputs.rootfs }} 34 | sdks: ${{ steps.find_targets.outputs.sdks }} 35 | ref: ${{ steps.find_targets.outputs.ref }} 36 | version: ${{ steps.find_targets.outputs.version }} 37 | version_path: ${{ steps.find_targets.outputs.version_path }} 38 | file_host: ${{ steps.find_targets.outputs.file_host }} 39 | run_setup: ${{ steps.find_targets.outputs.run_setup }} 40 | 41 | steps: 42 | - name: Set release 43 | if: github.event.inputs.ref != '' 44 | run: | 45 | export REF=${{ github.event.inputs.ref == 'master' && 'main' || github.event.inputs.ref }} 46 | echo "REF=$REF" >> "$GITHUB_ENV" 47 | 48 | case $REF in 49 | main) 50 | VERSION=SNAPSHOT 51 | echo "VERSION_PATH=snapshots" >> "$GITHUB_ENV" 52 | ;; 53 | openwrt-*) 54 | VERSION=${REF//openwrt-/}-SNAPSHOT 55 | echo "VERSION_PATH=releases/$VERSION" >> "$GITHUB_ENV" 56 | ;; 57 | v*) 58 | VERSION=${REF//v/} 59 | echo "VERSION_PATH=releases/$VERSION" >> "$GITHUB_ENV" 60 | echo "RUN_SETUP=1" >> "$GITHUB_ENV" 61 | ;; 62 | *) 63 | echo "No tag or branch found" 64 | exit 1 65 | ;; 66 | esac 67 | echo "VERSION=$VERSION" >> "$GITHUB_ENV" 68 | 69 | - name: Checkout 70 | uses: actions/checkout@v6 71 | with: 72 | repository: openwrt/openwrt 73 | ref: ${{ env.REF}} 74 | 75 | - name: Set targets 76 | id: find_targets 77 | run: | 78 | TARGET_FILTER="${{ github.event.inputs.target }}" 79 | 80 | # imagebuilders & rootfs 81 | JSON_IB='[' 82 | FIRST_IB=1 83 | 84 | JSON_ROOTFS='[' 85 | FIRST_ROOTFS=1 86 | 87 | while read -r line; 88 | do 89 | TARGET=$(echo "$line" | cut -d " " -f 1) 90 | ARCH=$(echo "$line" | cut -d " " -f 2) 91 | 92 | [[ $FIRST_IB -ne 1 ]] && JSON_IB="$JSON_IB"',' 93 | FIRST_IB=0 94 | 95 | JSON_IB="$JSON_IB"'{"target":"'"$TARGET"'"}' 96 | 97 | case "$TARGET" in 98 | x86/*|arm*|malta/be|mvebu/cortexa9) 99 | [[ $FIRST_ROOTFS -ne 1 ]] && JSON_ROOTFS="$JSON_ROOTFS"',' 100 | FIRST_ROOTFS=0 101 | 102 | JSON_ROOTFS="$JSON_ROOTFS"'{"target":"'"$TARGET"'","arch":"'"$ARCH"'"}' 103 | ;; 104 | esac 105 | 106 | done <<< $(perl ./scripts/dump-target-info.pl targets 2>/dev/null | ([[ -n "$TARGET_FILTER" ]] && grep -w "$TARGET_FILTER" || cat)) 107 | 108 | JSON_IB='{"include":'"$JSON_IB"']}' 109 | echo -e "\n---- imagebuilders ----\n" 110 | echo "$JSON_IB" | jq 111 | echo -e "\n---- imagebuilders ----\n" 112 | echo "imagebuilders=$JSON_IB" >> "$GITHUB_OUTPUT" 113 | 114 | JSON_ROOTFS='{"include":'"$JSON_ROOTFS"']}' 115 | echo -e "\n---- rootfs ----\n" 116 | echo "$JSON_ROOTFS" | jq 117 | echo -e "\n---- rootfs ----\n" 118 | echo "rootfs=$JSON_ROOTFS" >> "$GITHUB_OUTPUT" 119 | 120 | # sdks 121 | JSON='[' 122 | FIRST=1 123 | 124 | while read -r line; 125 | do 126 | ARCH=$(echo "$line" | cut -d " " -f 1) 127 | [ -z "$TARGET_FILTER" ] && TARGET=$(echo "$line" | cut -d " " -f 2) || TARGET="$TARGET_FILTER" 128 | TARGETS=$(echo "$line" | cut -d " " -f 2- | sed -e 's/ /\\n/g') 129 | 130 | [[ $FIRST -ne 1 ]] && JSON="$JSON"',' 131 | FIRST=0 132 | 133 | JSON="$JSON"'{"arch":"'"$ARCH"'","target":"'"$TARGET"'","tags":"'"$ARCH"'\n'"$TARGETS"'"}' 134 | done <<< $(perl ./scripts/dump-target-info.pl architectures 2>/dev/null | ([[ -n "$TARGET_FILTER" ]] && grep -w "$TARGET_FILTER" || cat)) 135 | 136 | JSON='{"include":'"$JSON"']}' 137 | echo -e "\n---- sdks ----\n" 138 | echo "$JSON" | jq 139 | echo -e "\n---- sdks ----\n" 140 | echo "sdks=$JSON" >> "$GITHUB_OUTPUT" 141 | 142 | echo "ref=${REF:-main}" >> "$GITHUB_OUTPUT" 143 | echo "version=${VERSION:-SNAPSHOT}" >> "$GITHUB_OUTPUT" 144 | echo "version_path=${VERSION_PATH:-snapshots}" >> "$GITHUB_OUTPUT" 145 | echo "run_setup=${RUN_SETUP:-0}" >> "$GITHUB_OUTPUT" 146 | 147 | FILE_HOST=${{ needs.generate_matrix.outputs.file_host }} 148 | echo "file_host=${FILE_HOST:-mirror-03.infra.openwrt.org}" >> "$GITHUB_OUTPUT" 149 | 150 | push-imagebuilder-container: 151 | name: ImageBuilder 152 | runs-on: ubuntu-latest 153 | needs: generate_matrix 154 | strategy: 155 | fail-fast: False 156 | matrix: ${{fromJson(needs.generate_matrix.outputs.imagebuilders)}} 157 | 158 | steps: 159 | - name: Login to GitHub Container Registry 160 | if: github.event_name != 'pull_request' 161 | uses: docker/login-action@v3 162 | with: 163 | registry: ghcr.io 164 | username: ${{ github.actor }} 165 | password: ${{ secrets.GITHUB_TOKEN }} 166 | 167 | - name: Login to Docker.io Container Registry 168 | if: github.event_name != 'pull_request' 169 | uses: docker/login-action@v3 170 | with: 171 | username: ${{ secrets.DOCKER_USER }} 172 | password: ${{ secrets.DOCKER_TOKEN }} 173 | 174 | - name: Login to Quay.io Container Registry 175 | if: github.event_name != 'pull_request' 176 | uses: docker/login-action@v3 177 | with: 178 | registry: quay.io 179 | username: ${{ secrets.QUAY_USER }} 180 | password: ${{ secrets.QUAY_TOKEN }} 181 | 182 | - name: Docker meta 183 | id: meta 184 | uses: docker/metadata-action@v5 185 | with: 186 | images: | 187 | ghcr.io/openwrt/imagebuilder 188 | docker.io/openwrt/imagebuilder 189 | quay.io/openwrt/imagebuilder 190 | flavor: | 191 | latest=false 192 | prefix=${{ github.event.inputs.prefix }} 193 | tags: | 194 | ${{ matrix.target }}-${{ needs.generate_matrix.outputs.ref }} 195 | ${{ matrix.target }}-${{ needs.generate_matrix.outputs.version }} 196 | ${{ matrix.target }}-master,enable=${{ needs.generate_matrix.outputs.ref == 'main' }} 197 | ${{ matrix.target }},enable=${{ needs.generate_matrix.outputs.version == 'SNAPSHOT' }} 198 | latest,enable=${{ needs.generate_matrix.outputs.version == 'SNAPSHOT' && matrix.target == 'x86/64'}} 199 | 200 | - name: Build 201 | id: build 202 | uses: docker/build-push-action@v6 203 | with: 204 | no-cache: true 205 | push: false 206 | tags: ${{ steps.meta.outputs.tags }} 207 | labels: ${{ steps.meta.outputs.labels }} 208 | build-args: | 209 | DOWNLOAD_FILE=imagebuilder-.*x86_64.tar.[xz|zst] 210 | VERSION_PATH=${{ needs.generate_matrix.outputs.version_path }} 211 | TARGET=${{ matrix.target }} 212 | FILE_HOST=${{ needs.generate_matrix.outputs.file_host }} 213 | RUN_SETUP=${{ needs.generate_matrix.outputs.run_setup }} 214 | 215 | - name: Smoke test 216 | run: | 217 | docker run ${{ steps.build.outputs.imageid }} \ 218 | bash -c ' \ 219 | cd $HOME && \ 220 | bash setup.sh && \ 221 | make image PACKAGES=coreutils-echo \ 222 | ' 223 | 224 | - name: Push 225 | if: github.event_name != 'pull_request' 226 | uses: docker/build-push-action@v6 227 | with: 228 | push: true 229 | no-cache: true 230 | tags: ${{ steps.meta.outputs.tags }} 231 | labels: ${{ steps.meta.outputs.labels }} 232 | build-args: | 233 | DOWNLOAD_FILE=imagebuilder-.*x86_64.tar.[xz|zst] 234 | VERSION_PATH=${{ needs.generate_matrix.outputs.version_path }} 235 | TARGET=${{ matrix.target }} 236 | FILE_HOST=${{ needs.generate_matrix.outputs.file_host }} 237 | RUN_SETUP=${{ needs.generate_matrix.outputs.run_setup }} 238 | 239 | - name: Cleanup Docker containers 240 | run: docker system prune -f 241 | 242 | push-sdk-container: 243 | name: SDK 244 | runs-on: ubuntu-latest 245 | needs: generate_matrix 246 | strategy: 247 | fail-fast: False 248 | matrix: ${{fromJson(needs.generate_matrix.outputs.sdks)}} 249 | 250 | steps: 251 | - name: Login to GitHub Container Registry 252 | if: github.event_name != 'pull_request' 253 | uses: docker/login-action@v3 254 | with: 255 | registry: ghcr.io 256 | username: ${{ github.actor }} 257 | password: ${{ secrets.GITHUB_TOKEN }} 258 | 259 | - name: Login to Docker.io Container Registry 260 | if: github.event_name != 'pull_request' 261 | uses: docker/login-action@v3 262 | with: 263 | username: ${{ secrets.DOCKER_USER }} 264 | password: ${{ secrets.DOCKER_TOKEN }} 265 | 266 | - name: Login to Quay.io Container Registry 267 | if: github.event_name != 'pull_request' 268 | uses: docker/login-action@v3 269 | with: 270 | registry: quay.io 271 | username: ${{ secrets.QUAY_USER }} 272 | password: ${{ secrets.QUAY_TOKEN }} 273 | 274 | - name: Docker meta (tag or branch) 275 | id: meta_ref 276 | uses: docker/metadata-action@v5 277 | with: 278 | images: | 279 | ghcr.io/openwrt/sdk 280 | docker.io/openwrt/sdk 281 | quay.io/openwrt/sdk 282 | flavor: | 283 | latest=false 284 | prefix=${{ github.event.inputs.prefix }} 285 | suffix=-${{ needs.generate_matrix.outputs.ref }} 286 | tags: ${{ matrix.tags }} 287 | 288 | - name: Docker meta (version) 289 | id: meta_version 290 | uses: docker/metadata-action@v5 291 | with: 292 | images: | 293 | ghcr.io/openwrt/sdk 294 | docker.io/openwrt/sdk 295 | quay.io/openwrt/sdk 296 | flavor: | 297 | latest=false 298 | prefix=${{ github.event.inputs.prefix }} 299 | suffix=-${{ needs.generate_matrix.outputs.version }} 300 | tags: ${{ matrix.tags }} 301 | 302 | - name: Docker meta (master) 303 | if: needs.generate_matrix.outputs.ref == 'main' 304 | id: meta_master 305 | uses: docker/metadata-action@v5 306 | with: 307 | images: | 308 | ghcr.io/openwrt/sdk 309 | docker.io/openwrt/sdk 310 | quay.io/openwrt/sdk 311 | flavor: | 312 | latest=false 313 | prefix=${{ github.event.inputs.prefix }} 314 | suffix=-master 315 | tags: ${{ matrix.tags }} 316 | 317 | - name: Docker meta (target and arch) 318 | if: needs.generate_matrix.outputs.version == 'SNAPSHOT' 319 | id: meta_target_arch 320 | uses: docker/metadata-action@v5 321 | with: 322 | images: | 323 | ghcr.io/openwrt/sdk 324 | docker.io/openwrt/sdk 325 | quay.io/openwrt/sdk 326 | flavor: | 327 | latest=false 328 | prefix=${{ github.event.inputs.prefix }} 329 | tags: ${{ matrix.tags }} 330 | 331 | - name: Docker meta (latest) 332 | if: needs.generate_matrix.outputs.version == 'SNAPSHOT' && matrix.target == 'x86/64' 333 | id: meta_latest 334 | uses: docker/metadata-action@v5 335 | with: 336 | images: | 337 | ghcr.io/openwrt/sdk 338 | docker.io/openwrt/sdk 339 | quay.io/openwrt/sdk 340 | tags: latest 341 | 342 | - name: Build 343 | id: build 344 | uses: docker/build-push-action@v6 345 | with: 346 | no-cache: true 347 | push: false 348 | tags: | 349 | ${{ steps.meta_ref.outputs.tags }} 350 | ${{ steps.meta_version.outputs.tags }} 351 | ${{ steps.meta_master.outputs.tags }} 352 | ${{ steps.meta_target_arch.outputs.tags }} 353 | ${{ steps.meta_latest.outputs.tags }} 354 | build-args: | 355 | DOWNLOAD_FILE=sdk-.*.Linux-x86_64.tar.[xz|zst] 356 | VERSION_PATH=${{ needs.generate_matrix.outputs.version_path }} 357 | TARGET=${{ matrix.target }} 358 | FILE_HOST=${{ needs.generate_matrix.outputs.file_host }} 359 | RUN_SETUP=${{ needs.generate_matrix.outputs.run_setup }} 360 | labels: ${{ steps.meta_ref.outputs.labels }} 361 | 362 | - name: Smoke test 363 | run: | 364 | docker run --rm ${{ steps.build.outputs.imageid }} \ 365 | bash -c ' \ 366 | cd $HOME && \ 367 | bash ./setup.sh && \ 368 | make defconfig && \ 369 | sed -i -E "s;git.openwrt.org/(feed|project|openwrt);github.com/openwrt;" feeds.conf.default && \ 370 | ./scripts/feeds update base && \ 371 | ./scripts/feeds install urngd && \ 372 | make package/urngd/{clean,compile} V=s -j$(nproc) && \ 373 | find ./bin/packages -name urngd*.?pk | grep ^./bin/packages/.*urngd \ 374 | ' 375 | 376 | - name: Push 377 | if: github.event_name != 'pull_request' 378 | uses: docker/build-push-action@v6 379 | with: 380 | push: true 381 | no-cache: true 382 | tags: | 383 | ${{ steps.meta_ref.outputs.tags }} 384 | ${{ steps.meta_version.outputs.tags }} 385 | ${{ steps.meta_master.outputs.tags }} 386 | ${{ steps.meta_target_arch.outputs.tags }} 387 | ${{ steps.meta_latest.outputs.tags }} 388 | build-args: | 389 | DOWNLOAD_FILE=sdk-.*.Linux-x86_64.tar.[xz|zst] 390 | VERSION_PATH=${{ needs.generate_matrix.outputs.version_path }} 391 | TARGET=${{ matrix.target }} 392 | FILE_HOST=${{ needs.generate_matrix.outputs.file_host }} 393 | RUN_SETUP=${{ needs.generate_matrix.outputs.run_setup }} 394 | labels: ${{ steps.meta_ref.outputs.labels }} 395 | 396 | - name: Cleanup Docker containers 397 | run: docker system prune -f 398 | 399 | push-rootfs-container: 400 | name: RootFS 401 | runs-on: ubuntu-latest 402 | needs: generate_matrix 403 | if: needs.generate_matrix.outputs.rootfs != '{"include":[]}' 404 | strategy: 405 | fail-fast: False 406 | matrix: ${{fromJson(needs.generate_matrix.outputs.rootfs)}} 407 | 408 | steps: 409 | - name: Set up QEMU 410 | run: | 411 | sudo apt-get update 412 | sudo apt-get install -y qemu-user-static binfmt-support 413 | sudo update-binfmts --import 414 | 415 | - name: Set up Docker Buildx 416 | uses: docker/setup-buildx-action@v3 417 | 418 | - name: Login to GitHub Container Registry 419 | if: github.event_name != 'pull_request' 420 | uses: docker/login-action@v3 421 | with: 422 | registry: ghcr.io 423 | username: ${{ github.actor }} 424 | password: ${{ secrets.GITHUB_TOKEN }} 425 | 426 | - name: Login to Docker.io Container Registry 427 | if: github.event_name != 'pull_request' 428 | uses: docker/login-action@v3 429 | with: 430 | username: ${{ secrets.DOCKER_USER }} 431 | password: ${{ secrets.DOCKER_TOKEN }} 432 | 433 | - name: Login to Quay.io Container Registry 434 | if: github.event_name != 'pull_request' 435 | uses: docker/login-action@v3 436 | with: 437 | registry: quay.io 438 | username: ${{ secrets.QUAY_USER }} 439 | password: ${{ secrets.QUAY_TOKEN }} 440 | 441 | - name: Docker meta 442 | id: meta 443 | uses: docker/metadata-action@v5 444 | with: 445 | images: | 446 | ghcr.io/openwrt/rootfs 447 | docker.io/openwrt/rootfs 448 | quay.io/openwrt/rootfs 449 | flavor: | 450 | latest=false 451 | prefix=${{ github.event.inputs.prefix }} 452 | tags: | 453 | ${{ matrix.target }}-${{ needs.generate_matrix.outputs.ref }} 454 | ${{ matrix.target }}-${{ needs.generate_matrix.outputs.version }} 455 | ${{ matrix.target }}-master,enable=${{ needs.generate_matrix.outputs.ref == 'main' }} 456 | ${{ matrix.target }},enable=${{ needs.generate_matrix.outputs.version == 'SNAPSHOT' }} 457 | ${{ matrix.arch }}-${{ needs.generate_matrix.outputs.ref }} 458 | ${{ matrix.arch }}-${{ needs.generate_matrix.outputs.version }} 459 | ${{ matrix.arch }}-master,enable=${{ needs.generate_matrix.outputs.ref == 'main' }} 460 | ${{ matrix.arch }},enable=${{ needs.generate_matrix.outputs.version == 'SNAPSHOT' }} 461 | latest,enable=${{ needs.generate_matrix.outputs.version == 'SNAPSHOT' && matrix.target == 'x86/64'}} 462 | 463 | - name: Generate build args 464 | id: build_args 465 | run: | 466 | echo 'args<> $GITHUB_OUTPUT 477 | 478 | - name: Build 479 | id: build 480 | uses: docker/build-push-action@v6 481 | with: 482 | no-cache: true 483 | push: false 484 | tags: ${{ steps.meta.outputs.tags }} 485 | load: true 486 | file: Dockerfile.rootfs 487 | build-args: ${{ steps.build_args.outputs.args }} 488 | labels: ${{ steps.meta.outputs.labels }} 489 | platforms: linux/${{ matrix.arch }} 490 | 491 | - name: Smoke test 492 | run: docker run --platform=linux/${{ matrix.arch }} ${{ steps.build.outputs.imageid }} uname -m 493 | 494 | - name: Push 495 | if: github.event_name != 'pull_request' 496 | uses: docker/build-push-action@v6 497 | with: 498 | no-cache: true 499 | push: true 500 | tags: ${{ steps.meta.outputs.tags }} 501 | file: Dockerfile.rootfs 502 | build-args: ${{ steps.build_args.outputs.args }} 503 | labels: ${{ steps.meta.outputs.labels }} 504 | platforms: linux/${{ matrix.arch }} 505 | 506 | - name: Cleanup Docker containers 507 | run: docker system prune -f 508 | --------------------------------------------------------------------------------