├── .dockerignore ├── .flake8 ├── .github ├── dependabot.yml └── workflows │ └── build-push.yml ├── .gitignore ├── .gitlab-ci.yml ├── .gitlab ├── docker.yml └── docker │ ├── README.md │ ├── buildmaster │ └── gitlab.yml │ └── buildworker │ └── gitlab.yml ├── .ruff.toml ├── README.md ├── build-docker-images.sh ├── docker ├── buildmaster │ ├── Dockerfile │ └── files │ │ ├── entry.sh │ │ └── start.sh ├── buildworker │ ├── Dockerfile │ └── files │ │ ├── entry.sh │ │ └── start.sh ├── certs │ ├── buildmaster-phase1.crt │ ├── buildmaster-phase1.key │ ├── buildmaster-phase2.crt │ ├── buildmaster-phase2.key │ ├── ca.crt │ └── ca.key ├── config.ini ├── docker-compose.yml └── rsync │ ├── Dockerfile │ └── files │ └── entry.sh ├── phase1 ├── buildbot.tac ├── config.ini.example └── master.cfg ├── phase2 ├── buildbot.tac ├── config.ini.example └── master.cfg ├── requirements-dev.txt ├── scripts ├── ccache.sh ├── cleanup.sh ├── findbin.pl ├── makebranch.sh ├── rsync.sh ├── sec2pubkey.pl ├── sha2rsync.pl └── signall.sh └── tests └── cram ├── master ├── 01-logs.t └── 02-apk.t └── worker └── 01-logs.t /.dockerignore: -------------------------------------------------------------------------------- 1 | docker/rsync 2 | !docker/rsync/files 3 | docker/build 4 | docker/docker-compose.yml 5 | -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length = 140 3 | per-file-ignores = 4 | phase2/master.cfg: E101,E117,E128,E201,E202,E203,E221,E225,E251,E266,E302,E305,E501,W191 5 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Set update schedule for GitHub Actions 2 | 3 | version: 2 4 | updates: 5 | 6 | - package-ecosystem: "github-actions" 7 | directory: "/" 8 | schedule: 9 | # Check for updates to GitHub Actions every week 10 | interval: "weekly" 11 | # Prefix all commit messages with "CI" plus its scope, that is, a 12 | # list of updated dependencies 13 | commit-message: 14 | prefix: "CI" 15 | include: "scope" 16 | -------------------------------------------------------------------------------- /.github/workflows/build-push.yml: -------------------------------------------------------------------------------- 1 | name: Build and push containers 2 | on: 3 | push: 4 | branches: 5 | - main 6 | tags: 7 | - 'v*' 8 | pull_request: 9 | 10 | env: 11 | BUILDBOT_VERSION: 3.11.8 12 | GITHUB_SHA_LEN: 8 13 | 14 | concurrency: 15 | group: ${{ github.workflow }}-${{ github.ref }} 16 | cancel-in-progress: ${{ github.event_name == 'pull_request' }} 17 | 18 | jobs: 19 | test-lint: 20 | name: Test with Python ${{ matrix.python-version }} 21 | runs-on: ubuntu-latest 22 | 23 | strategy: 24 | matrix: 25 | python-version: 26 | - "3.11" 27 | 28 | steps: 29 | - name: Checkout 30 | uses: actions/checkout@v4 31 | 32 | - uses: actions/setup-python@v5 33 | with: 34 | python-version: ${{ matrix.python-version }} 35 | 36 | - name: Install dependencies 37 | run: pip install -r requirements-dev.txt 38 | 39 | - name: Lint with ruff 40 | run: ruff phase*/master.cfg 41 | 42 | - name: Lint with flake8 43 | run: flake8 phase*/master.cfg 44 | 45 | - name: Stylecheck with black 46 | run: black phase1/master.cfg 47 | 48 | build-test: 49 | name: Build and Test container 50 | runs-on: ubuntu-latest 51 | needs: test-lint 52 | 53 | permissions: 54 | packages: write 55 | 56 | strategy: 57 | fail-fast: ${{ github.event_name == 'pull_request' }} 58 | matrix: 59 | include: 60 | - container_flavor: master 61 | - container_flavor: worker 62 | container_test_command: "--env BUILDWORKER_TLS=1 --env BUILDWORKER_MASTER=Z:1922 --env BUILDWORKER_NAME=X --env BUILDWORKER_PASSWORD=Y" 63 | 64 | steps: 65 | - name: Checkout 66 | uses: actions/checkout@v4 67 | 68 | - name: Environment variables 69 | run: | 70 | echo "GIT_SHA_SHORT=${GITHUB_SHA::${{ env.GITHUB_SHA_LEN }}}" >> $GITHUB_ENV 71 | 72 | - name: Build container and export it to local Docker 73 | uses: docker/build-push-action@v6 74 | with: 75 | load: true 76 | tags: local/${{ matrix.container_flavor }} 77 | file: docker/build${{ matrix.container_flavor }}/Dockerfile 78 | build-args: | 79 | BUILDBOT_VERSION=${{ env.BUILDBOT_VERSION }} 80 | OPENWRT_VERSION=${{ env.GIT_SHA_SHORT }} 81 | 82 | - name: Test ${{ matrix.container_flavor }} Docker container 83 | run: | 84 | docker run --detach ${{ matrix.container_test_command }} --name test-${{ matrix.container_flavor }} local/${{ matrix.container_flavor }} 85 | sleep 5 86 | pip install cram 87 | cram --verbose "tests/cram/${{ matrix.container_flavor }}" 88 | 89 | deploy: 90 | name: Push Container 91 | if: github.event_name != 'pull_request' || github.repository_owner != 'openwrt' 92 | runs-on: ubuntu-latest 93 | needs: build-test 94 | 95 | environment: production 96 | 97 | permissions: 98 | packages: write 99 | 100 | strategy: 101 | matrix: 102 | container_flavor: 103 | - master 104 | - worker 105 | 106 | steps: 107 | - name: Checkout 108 | uses: actions/checkout@v4 109 | 110 | - name: Environment variables 111 | run: | 112 | echo "GIT_SHA_SHORT=${GITHUB_SHA::${{ env.GITHUB_SHA_LEN }}}" >> $GITHUB_ENV 113 | 114 | - name: Docker meta 115 | id: meta 116 | uses: docker/metadata-action@v5 117 | with: 118 | images: name=ghcr.io/${{ github.repository }}/build${{ matrix.container_flavor }}-v${{ env.BUILDBOT_VERSION }} 119 | 120 | - name: Login to GitHub Container Registry 121 | uses: docker/login-action@v3 122 | with: 123 | registry: ghcr.io 124 | username: ${{ github.actor }} 125 | password: ${{ secrets.GITHUB_TOKEN }} 126 | 127 | - name: Build container again and push it 128 | uses: docker/build-push-action@v6 129 | with: 130 | push: true 131 | tags: ${{ steps.meta.outputs.tags }} 132 | labels: ${{ steps.meta.outputs.labels }} 133 | file: docker/build${{ matrix.container_flavor }}/Dockerfile 134 | build-args: | 135 | BUILDBOT_VERSION=${{ env.BUILDBOT_VERSION }} 136 | OPENWRT_VERSION=${{ env.GIT_SHA_SHORT }} 137 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | !.dockerignore 4 | !build-docker-images.sh 5 | !docker 6 | !docker/* 7 | !docker/*/* 8 | !docker/*/*/* 9 | docker/build 10 | !scripts 11 | !scripts/* 12 | !phase[12] 13 | !phase[12]/* 14 | phase[12]/*/* 15 | phase[12]/config.ini 16 | phase[12]/http.log 17 | phase[12]/key-build* 18 | phase[12]/state.sqlite* 19 | phase[12]/twistd.* 20 | !.gitlab-ci.yml 21 | !.gitlab 22 | !.gitlab/* 23 | !.gitlab/**/* 24 | !.github 25 | !.github/**/* 26 | !requirements-dev.txt 27 | !.ruff.toml 28 | !tests 29 | !tests/**/* 30 | !.flake8 31 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | variables: 2 | BUILDBOT_VERSION: 3.5.0 3 | OPENWRT_VERSION: $CI_COMMIT_SHORT_SHA 4 | 5 | include: 6 | - local: .gitlab/docker.yml 7 | - local: .gitlab/docker/buildmaster/gitlab.yml 8 | - local: .gitlab/docker/buildworker/gitlab.yml 9 | 10 | stages: 11 | - docker 12 | - docker test 13 | - docker deploy 14 | -------------------------------------------------------------------------------- /.gitlab/docker.yml: -------------------------------------------------------------------------------- 1 | .docker in docker: 2 | tags: 3 | - linux 4 | - openwrt 5 | - light-jobs 6 | - docker-privileged 7 | image: docker:19.03.7 8 | services: 9 | - docker:19.03.7-dind 10 | variables: 11 | DOCKER_DRIVER: overlay2 12 | DOCKER_TLS_CERTDIR: "/certs" 13 | 14 | .build Docker image: 15 | stage: docker 16 | extends: .docker in docker 17 | script: 18 | - export IMAGE_NAME="$(echo $CI_JOB_NAME | sed 's/build Docker image \(.*\)/\1/')" 19 | - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY 20 | - docker build --build-arg BUILDBOT_VERSION=$BUILDBOT_VERSION --build-arg OPENWRT_VERSION=$OPENWRT_VERSION -t "$IMAGE_NAME" -f "docker/$IMAGE_NAME/Dockerfile" . 21 | - docker tag "$IMAGE_NAME" "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:$CI_COMMIT_REF_SLUG" 22 | - docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:$CI_COMMIT_REF_SLUG" 23 | 24 | .deploy Docker image: 25 | extends: .docker in docker 26 | rules: 27 | - if: $CI_COMMIT_TAG 28 | - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH 29 | script: 30 | - export IMAGE_NAME="$(echo $CI_JOB_NAME | sed 's/deploy Docker image \(.*\)/\1/')" 31 | - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY 32 | - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:$CI_COMMIT_REF_SLUG" 33 | 34 | - docker tag "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:$CI_COMMIT_REF_SLUG" "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:latest" 35 | - docker tag "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:latest" "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:$CI_COMMIT_SHORT_SHA" 36 | - docker tag "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:latest" "$CI_REGISTRY_IMAGE/$IMAGE_NAME:latest" 37 | 38 | - docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:latest" 39 | - docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:$CI_COMMIT_SHORT_SHA" 40 | - docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME:latest" 41 | -------------------------------------------------------------------------------- /.gitlab/docker/README.md: -------------------------------------------------------------------------------- 1 | # Content 2 | 3 | This directory contains bits for Docker images used on the GitLab CI. 4 | 5 | ## buildmaster 6 | ## buildworker 7 | -------------------------------------------------------------------------------- /.gitlab/docker/buildmaster/gitlab.yml: -------------------------------------------------------------------------------- 1 | build Docker image buildmaster: 2 | stage: docker 3 | extends: .build Docker image 4 | 5 | test Docker image buildmaster: 6 | stage: docker test 7 | extends: .docker in docker 8 | needs: ["build Docker image buildmaster"] 9 | script: 10 | - export IMAGE_NAME="$(echo $CI_JOB_NAME | sed 's/test Docker image \(.*\)/\1/')" 11 | - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY 12 | - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:$CI_COMMIT_REF_SLUG" 13 | - > 14 | docker run --rm "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:$CI_COMMIT_REF_SLUG" | 15 | grep "buildmaster configured in /master" 16 | 17 | deploy Docker image buildmaster: 18 | stage: docker deploy 19 | extends: .deploy Docker image 20 | needs: ["test Docker image buildmaster"] 21 | -------------------------------------------------------------------------------- /.gitlab/docker/buildworker/gitlab.yml: -------------------------------------------------------------------------------- 1 | build Docker image buildworker: 2 | stage: docker 3 | extends: .build Docker image 4 | 5 | .test Docker image buildworker: 6 | stage: docker test 7 | extends: .docker in docker 8 | needs: ["build Docker image buildworker"] 9 | script: 10 | - export IMAGE_NAME="$(echo $CI_JOB_NAME | sed 's/test Docker image \(.*\)/\1/')" 11 | - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY 12 | - docker pull "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:$CI_COMMIT_REF_SLUG" 13 | - > 14 | docker run --rm --env BUILDWORKER_NAME=foo --env BUILDWORKER_PASSWORD=XXX 15 | "$CI_REGISTRY_IMAGE/$IMAGE_NAME-$BUILDBOT_VERSION:$CI_COMMIT_REF_SLUG" | 16 | grep "worker configured in /builder" 17 | 18 | deploy Docker image buildworker: 19 | stage: docker deploy 20 | extends: .deploy Docker image 21 | #needs: ["test Docker image buildworker"] 22 | -------------------------------------------------------------------------------- /.ruff.toml: -------------------------------------------------------------------------------- 1 | ignore = ["E501"] 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenWrt buildbot configuration 2 | 3 | This repository provides containers used for building OpenWrt at https://buildbot.openwrt.org 4 | -------------------------------------------------------------------------------- /build-docker-images.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | docker build -t openwrtorg/buildmaster -f docker/buildmaster/Dockerfile . 4 | docker push openwrtorg/buildmaster 5 | 6 | docker build -t openwrtorg/buildworker -f docker/buildworker/Dockerfile . 7 | docker push openwrtorg/buildworker 8 | -------------------------------------------------------------------------------- /docker/buildmaster/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpinelinux/build-base:latest-x86_64 AS apk-builder 2 | 3 | RUN abuild-apk add -u \ 4 | gcc \ 5 | git \ 6 | linux-headers \ 7 | lua5.3-dev \ 8 | lua5.3-lzlib \ 9 | make \ 10 | musl-dev \ 11 | openssl-dev \ 12 | openssl-libs-static \ 13 | zlib-dev \ 14 | zlib-static \ 15 | zstd-dev \ 16 | zstd-static 17 | 18 | ARG APK_TOOLS_COMMIT=74de0e9bd73d1af8720df40aa68d472943909804 19 | 20 | RUN git clone https://gitlab.alpinelinux.org/alpine/apk-tools.git /tmp/apk-tools 21 | WORKDIR /tmp/apk-tools 22 | RUN git checkout $APK_TOOLS_COMMIT 23 | RUN make -j$(nproc) static 24 | 25 | 26 | FROM debian:11 27 | MAINTAINER OpenWrt Maintainers 28 | 29 | ARG DEBIAN_FRONTEND=noninteractive 30 | ARG BUILDBOT_VERSION=2.10.1 31 | ARG OPENWRT_VERSION=unknown 32 | 33 | ENV BUILDMASTER_CONFIG config.ini 34 | ENV BUILDMASTER_PHASE 1 35 | 36 | USER root 37 | 38 | RUN \ 39 | apt-get update && \ 40 | apt-get install -y \ 41 | build-essential \ 42 | gawk \ 43 | git-core \ 44 | gosu \ 45 | libncurses5-dev \ 46 | locales \ 47 | pv \ 48 | pwgen \ 49 | python3-venv \ 50 | python3-pip \ 51 | signify-openbsd \ 52 | wget && \ 53 | apt-get clean && \ 54 | localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 55 | 56 | RUN python3 -m venv /opt/venv 57 | ENV PATH="/opt/venv/bin:$PATH" 58 | RUN pip3 install -U pip 59 | RUN \ 60 | pip3 install \ 61 | "buildbot==$BUILDBOT_VERSION" \ 62 | "buildbot-www==$BUILDBOT_VERSION" \ 63 | "buildbot-waterfall-view==$BUILDBOT_VERSION" \ 64 | "buildbot-console-view==$BUILDBOT_VERSION" \ 65 | "buildbot-grid-view==$BUILDBOT_VERSION" \ 66 | "buildbot-worker==$BUILDBOT_VERSION" \ 67 | pyOpenSSL \ 68 | service_identity 69 | 70 | RUN \ 71 | sed -i \ 72 | 's/Welcome to buildbot/Welcome to OpenWrt buildbot/' \ 73 | /opt/venv/lib/python*/site-packages/buildbot_www/static/scripts.js 74 | 75 | RUN \ 76 | sed -i \ 77 | "s;\"col-sm-12\">