Compare commits

...

18 commits
7.17 ... master

Author SHA1 Message Date
Pavel Zloi
4db197ad1a
Update build-and-push.yml 2025-08-26 12:18:30 +03:00
Pavel Zloi
b4eaf7b592
Merge pull request #66 from ghostfreak3000/patch-1
Fallback to default qemu64 emulation when KVM not available
2025-08-21 09:36:10 +03:00
Pavel Zloi
4e5ce69ce6
Merge pull request #67 from EvilFreelancer/dependabot/github_actions/actions/checkout-5
Bump actions/checkout from 4 to 5
2025-08-21 09:35:24 +03:00
dependabot[bot]
4feb3983f7
Bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-18 07:54:39 +00:00
Bishaka Samuel
0f332e0580
Fallback to default qemu64 emulation when KVM not available
This fixes the `qemu-system-x86_64: unable to find CPU model 'host'` error when trying to run the docker image on m1 macs
2025-08-17 05:20:29 +03:00
Pavel Zloi
238d20470e
Merge pull request #65 from EvilFreelancer/dependabot/docker/alpine-3.22.1
Bump alpine from 3.22.0 to 3.22.1
2025-07-27 22:39:31 +03:00
dependabot[bot]
1338176e9a
Bump alpine from 3.22.0 to 3.22.1
Bumps alpine from 3.22.0 to 3.22.1.

---
updated-dependencies:
- dependency-name: alpine
  dependency-version: 3.22.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-21 07:01:15 +00:00
Pavel Zloi
fd17c53b8f
Merge pull request #64 from EvilFreelancer/dependabot/docker/alpine-3.22.0
Bump alpine from 3.21.3 to 3.22.0
2025-06-03 13:44:16 +03:00
dependabot[bot]
b264d35ad5
Bump alpine from 3.21.3 to 3.22.0
Bumps alpine from 3.21.3 to 3.22.0.

---
updated-dependencies:
- dependency-name: alpine
  dependency-version: 3.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-02 05:59:46 +00:00
Pavel Zloi
ceb354a293
Merge pull request #61 from jafarijason/for-pr
PR for proof of concept
2025-02-28 13:45:53 +03:00
Pavel Zloi
882706a1e7
Merge pull request #62 from EvilFreelancer/dependabot/docker/alpine-3.21.3
Bump alpine from 3.21.2 to 3.21.3
2025-02-18 14:23:36 +03:00
dependabot[bot]
f55bdcb19d
Bump alpine from 3.21.2 to 3.21.3
Bumps alpine from 3.21.2 to 3.21.3.

---
updated-dependencies:
- dependency-name: alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-17 05:26:47 +00:00
Jason Jafari
3ac118eaf9 Bring back docker repository 2025-02-03 19:40:19 -05:00
Jason Jafari
d2ee32092b WIP 2025-02-03 19:10:28 -05:00
Jason Jafari
6face9e8b5 Test 1 2025-02-03 18:49:25 -05:00
pasha
63c948b6e1 Small tunes of version in Dockerfile 2025-01-27 00:23:47 +03:00
pasha
89b36db462 Version added 2025-01-27 00:19:10 +03:00
pasha
4d98b6ff5d Legacy build logic removed 2025-01-27 00:16:33 +03:00
10 changed files with 92 additions and 189 deletions

69
.github/workflows/build-and-push.yml vendored Normal file
View file

@ -0,0 +1,69 @@
name: Check for new RouterOS versions, build and push containers
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *' # Every day at midnight
jobs:
check-and-build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Install dependencies
run: sudo apt-get install -y curl jq
- name: Get latest RouterOS version
id: get_routeros_version
run: |
VERSION=$(
curl https://mikrotik.com/download/archive -o - 2>/dev/null | \
grep -o '<a href=['"'"'"][^"'"'"']*['"'"'"]' | \
sed -e 's/^<a href=["'"'"']//' -e 's/["'"'"']$//' | \
grep -i c-stable | \
sed -r 's/\#c-stable-v//gi' | \
sed -r 's/_/\./gi' | \
sort -V | \
tail -n 1
)
echo "Latest RouterOS version: $VERSION"
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Get Docker Hub tags
id: docker_hub_tags
run: |
OWNER="evilfreelancer"
REPO="docker-routeros"
URL="https://registry.hub.docker.com/v2/repositories/${OWNER}/${REPO}/tags/"
TAGS=$(curl -s "$URL" | jq -r '.results[].name' | grep -v "latest")
echo "tags=$(echo $TAGS | tr '\n' ' ')" >> $GITHUB_OUTPUT
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and test if new version
if: ${{ !contains(steps.docker_hub_tags.outputs.tags, steps.get_routeros_version.outputs.version) }}
run: |
VERSION="${{ steps.get_routeros_version.outputs.version }}"
OWNER="evilfreelancer"
REPO="docker-routeros"
# Set up Docker Buildx
docker buildx create --use --name routeros_builder
# Build and push images
docker buildx build --push \
--platform linux/amd64,linux/arm64 \
--tag $OWNER/$REPO:$VERSION \
--tag $OWNER/$REPO:latest \
--build-arg ROUTEROS_VERSION=$VERSION .
- name: Skip build
if: ${{ contains(steps.docker_hub_tags.outputs.tags, steps.get_routeros_version.outputs.version) }}
run: echo "Version ${{ steps.get_routeros_version.outputs.version }} already exists. Skipping build."

View file

@ -1,34 +0,0 @@
name: "Build docker image and push to DockerHub when a tag is pushed"
on:
workflow_dispatch:
push:
tags:
- '*'
jobs:
build:
name: "Build images"
runs-on: "ubuntu-latest"
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Docker metadata from Git
id: meta
uses: docker/metadata-action@v5
with:
images: evilfreelancer/docker-routeros
- name: Login to DockerHub
if: ${{ !env.ACT }}
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build with Docker
uses: docker/build-push-action@v6
with:
context: .
push: ${{ !env.ACT }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

View file

@ -1,46 +0,0 @@
name: "Continuous Integration Tests"
on:
push:
pull_request:
workflow_dispatch:
workflow_call:
jobs:
test:
name: "Build & Test images"
runs-on: "ubuntu-latest"
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download docker-compose when using act
run: |
sudo curl -L "https://github.com/docker/compose/releases/download/v2.29.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- name: Test with Docker
run: |
# start the container
docker-compose -f docker-compose.dist.yml up --build -d routeros-local
# wait for the container to start
sleep 5
DOCKERID=$(docker ps --format '{{.ID}}.{{.Names}}.{{.Image}}'|grep evilfreelancer/docker-routeros|cut -f 1 -d '.')
echo "Watching $DOCKERID for Mikrotik login..."
while true
do
if docker logs "$DOCKERID" 2>&1|grep 'MikroTik'
then
break
fi
echo "Not found yet, sleeping..."
sleep 5
done
# display logs
echo "Container logs:"
docker logs "$DOCKERID"
# download resource and check platform is Mikrotik
curl --retry 12 --retry-all-errors -k -u admin: http://127.0.0.1:7777/rest/system/resource | jq .platform |grep -i mikrotik
- name: Stop container
run: docker-compose -f docker-compose.dist.yml down

View file

@ -1,14 +0,0 @@
name: Lint github-action
on: [ 'pull_request' ]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Lint
uses: docker://rhysd/actionlint:1.6.26
with:
args: -color

View file

@ -1,47 +0,0 @@
name: "Check for update on Mikrotik website and generate a PR if necessary"
on:
workflow_dispatch:
schedule:
- cron: "0 4 * * *"
jobs:
routeros:
name: "Build & Test images"
runs-on: "ubuntu-latest"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: '1'
- name: Check new release
id: check_release
run: |
LAST_MIKROTIK_RELEASE=$( curl https://mikrotik.com/download/archive -o - 2>/dev/null | grep -o '<a href=['"'"'"][^"'"'"']*['"'"'"]' | sed -e 's/^<a href=["'"'"']//' -e 's/["'"'"']$//' | grep -i c-stable | sed -r 's/\#c-stable-v//gi'|sed -r 's/_/\./gi'|sort -V|tail -n 1)
NEW_TAG=$(grep "ROUTEROS_VERSION=\"" Dockerfile |cut -d "\"" -f 2)
if [ "$LAST_MIKROTIK_RELEASE" != "$NEW_TAG" ]; then
echo "New version found: $LAST_MIKROTIK_RELEASE"
echo "Current version: $NEW_TAG"
echo "release=$LAST_MIKROTIK_RELEASE" > "$GITHUB_OUTPUT"
echo "new=true" >> "$GITHUB_OUTPUT"
else
echo "No new version found"
echo "new=false" >> "$GITHUB_OUTPUT"
fi
- name: Edit Dockerfile
if: ${{ steps.check_release.outputs.new == 'true' }}
run: |
sed -r "s/(ROUTEROS_VERSION=\")(.*)(\")/\1${{ steps.check_release.outputs.release }}\3/g" -i Dockerfile
git diff
- name: Create Pull Request
if: ${{ steps.check_release.outputs.new == 'true' && !env.ACT }}
uses: peter-evans/create-pull-request@v7
with:
commit-message: "Update RouterOS version to ${{ steps.check_release.outputs.release }}"
committer: "GitHub Actions<github-actions@users.noreply.github.com>"
body: 'Created by Github action'
title: 'Update RouterOS version to ${{ steps.check_release.outputs.release }}'
branch: update-routeros

View file

@ -1,38 +0,0 @@
name: "Tag master with new version of RouterOS when CI pass"
on:
push:
branches:
- "master"
permissions:
contents: write
pull-requests: read
jobs:
call_test:
uses: EvilFreelancer/docker-routeros/.github/workflows/ci.yml@master
tag:
name: "Add a tag to git"
runs-on: "ubuntu-latest"
needs: call_test
if: always() && needs.call_test.result == 'success'
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: '0'
- name: Add new tag on git
id: tag
run: |
NEW_TAG=$(grep 'ROUTEROS_VERSION="' Dockerfile |cut -d '"' -f 2)
git config user.name 'GitHub Actions'
git config user.email 'github-actions@users.noreply.github.com'
git tag "$NEW_TAG"
echo "new_tag=$NEW_TAG" >> "$GITHUB_OUTPUT"
- name: Push new tag to git
if: ${{ !env.ACT }}
run: git push origin ${{ steps.tag.outputs.new_tag }}

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
/.idea/
/*.vdi
/docker-compose.yml
build.txt

View file

@ -1,4 +1,4 @@
FROM alpine:3.21.2
FROM alpine:3.22.1
# For access via VNC
EXPOSE 5900
@ -9,6 +9,8 @@ EXPOSE 1194 1701 1723 1812/udp 1813/udp 21 22 23 443 4500/udp 50 500/udp 51 2021
# Change work dir (it will also create this folder if is not exist)
WORKDIR /routeros
RUN mkdir -p /routeros_source
# Install dependencies
RUN set -xe \
&& apk add --no-cache --update \
@ -17,16 +19,17 @@ RUN set -xe \
bridge-utils iptables jq bash python3
# Environments which may be change
ENV ROUTEROS_VERSION="7.17"
ARG ROUTEROS_VERSION
ENV ROUTEROS_VERSION=${ROUTEROS_VERSION}
ENV ROUTEROS_IMAGE="chr-${ROUTEROS_VERSION}.vdi"
ENV ROUTEROS_PATH="https://cdn.mikrotik.com/routeros/${ROUTEROS_VERSION}/${ROUTEROS_IMAGE}.zip"
# Download VDI image from remote site
RUN wget "$ROUTEROS_PATH" -O "/routeros/${ROUTEROS_IMAGE}.zip" && \
unzip "/routeros/${ROUTEROS_IMAGE}.zip" -d "/routeros" && \
rm -f "/routeros/${ROUTEROS_IMAGE}.zip"
RUN wget "$ROUTEROS_PATH" -O "/routeros_source/${ROUTEROS_IMAGE}.zip" && \
unzip "/routeros_source/${ROUTEROS_IMAGE}.zip" -d "/routeros_source" && \
rm -f "/routeros_source/${ROUTEROS_IMAGE}.zip"
# Copy script to routeros folder
ADD ["./scripts", "/routeros"]
ADD ["./scripts", "/routeros_source"]
ENTRYPOINT ["/routeros/entrypoint.sh"]
ENTRYPOINT ["/routeros_source/entrypoint.sh"]

View file

@ -1,5 +1,13 @@
#!/usr/bin/env bash
if [[ ! -e "/routeros/generate-dhcpd-conf.py" ]]; then
cp -r /routeros_source/. /routeros
fi
cd /routeros
QEMU_BRIDGE_ETH1='qemubr1'
default_dev1='eth0'
@ -41,13 +49,14 @@ KVM_OPTS=""
if [ -e /dev/kvm ]; then
if grep -q -e vmx -e svm /proc/cpuinfo; then
echo "Enabling KVM"
CPU_FEATURES=",kvm=on"
CPU_FEATURES="host,kvm=on"
KVM_OPTS="-machine accel=kvm -enable-kvm"
fi
fi
if [ "$CPU_FEATURES" = "" ]; then
echo "KVM not available, running in emulation mode. This will be slow."
CPU_FEATURES="qemu64"
fi
# And run the VM! A brief explanation of the options here:
@ -62,7 +71,7 @@ exec qemu-system-x86_64 \
-nographic \
-m 512 \
-smp 4,sockets=1,cores=4,threads=1 \
-cpu host$CPU_FEATURES \
-cpu $CPU_FEATURES \
$KVM_OPTS \
-nic tap,id=qemu1,mac=54:05:AB:CD:12:31,script=$QEMU_IFUP,downscript=$QEMU_IFDOWN \
"$@" \