diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 4a1afef..811883a 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,3 @@ # These are supported funding model platforms -custom: [https://pay.cloudtips.ru/p/937f48ac, https://boosty.to/evilfreelancer] \ No newline at end of file +custom: [https://pay.cloudtips.ru/p/937f48ac, https://boosty.to/evilfreelancer] diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml deleted file mode 100644 index 3e51da4..0000000 --- a/.github/workflows/build-and-push.yml +++ /dev/null @@ -1,69 +0,0 @@ -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 '> $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." diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 0000000..b2ef7d0 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,34 @@ +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 }} + \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..8ad2c72 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,46 @@ +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 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..dbb13a9 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,14 @@ +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 diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml new file mode 100644 index 0000000..07256ab --- /dev/null +++ b/.github/workflows/pr.yml @@ -0,0 +1,47 @@ +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 ' "$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" + body: 'Created by Github action' + title: 'Update RouterOS version to ${{ steps.check_release.outputs.release }}' + branch: update-routeros diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml new file mode 100644 index 0000000..6cfad76 --- /dev/null +++ b/.github/workflows/tag.yml @@ -0,0 +1,38 @@ +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 }} diff --git a/.gitignore b/.gitignore index 178ed4b..42efebe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ /.idea/ /*.vdi /docker-compose.yml -build.txt \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index fe8f4e5..7912d56 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM alpine:3.22.1 +FROM alpine:3.20.3 # For access via VNC EXPOSE 5900 @@ -9,8 +9,6 @@ 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 \ @@ -19,17 +17,16 @@ RUN set -xe \ bridge-utils iptables jq bash python3 # Environments which may be change -ARG ROUTEROS_VERSION -ENV ROUTEROS_VERSION=${ROUTEROS_VERSION} +ENV ROUTEROS_VERSION="7.16" 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_source/${ROUTEROS_IMAGE}.zip" && \ - unzip "/routeros_source/${ROUTEROS_IMAGE}.zip" -d "/routeros_source" && \ - rm -f "/routeros_source/${ROUTEROS_IMAGE}.zip" +RUN wget "$ROUTEROS_PATH" -O "/routeros/${ROUTEROS_IMAGE}.zip" && \ + unzip "/routeros/${ROUTEROS_IMAGE}.zip" -d "/routeros" && \ + rm -f "/routeros/${ROUTEROS_IMAGE}.zip" # Copy script to routeros folder -ADD ["./scripts", "/routeros_source"] +ADD ["./scripts", "/routeros"] -ENTRYPOINT ["/routeros_source/entrypoint.sh"] +ENTRYPOINT ["/routeros/entrypoint.sh"] diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh index 8701ef8..7240d84 100755 --- a/scripts/entrypoint.sh +++ b/scripts/entrypoint.sh @@ -1,13 +1,5 @@ #!/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' @@ -49,14 +41,13 @@ KVM_OPTS="" if [ -e /dev/kvm ]; then if grep -q -e vmx -e svm /proc/cpuinfo; then echo "Enabling KVM" - CPU_FEATURES="host,kvm=on" + CPU_FEATURES=",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: @@ -71,7 +62,7 @@ exec qemu-system-x86_64 \ -nographic \ -m 512 \ -smp 4,sockets=1,cores=4,threads=1 \ - -cpu $CPU_FEATURES \ + -cpu host$CPU_FEATURES \ $KVM_OPTS \ -nic tap,id=qemu1,mac=54:05:AB:CD:12:31,script=$QEMU_IFUP,downscript=$QEMU_IFDOWN \ "$@" \