name: Patch Mikrotik RouterOS on: schedule: - cron: "00 09 * * *" # At UTC 09:00 (Beijing 17:00) on every day workflow_dispatch: inputs: version: description: 'Select Version (v6/v7/all)' required: true default: 'all' type: choice options: - all - v6 - v7 release: description: 'Release' required: false default: true type: boolean jobs: Check_Versions: runs-on: ubuntu-latest outputs: upgrades_v6: ${{ steps.set-matrix.outputs.upgrades_v6 }} upgrades_v7: ${{ steps.set-matrix.outputs.upgrades_v7 }} steps: - name: Fetch and compare versions id: set-matrix run: | OFFICIAL_UPGRADE=$(curl -s https://upgrade.mikrotik.com/routeros/upgrade.json || echo '{}') if ! echo "$OFFICIAL_UPGRADE" | jq -e . >/dev/null 2>&1; then OFFICIAL_UPGRADE='{}' fi echo "=== OFFICIAL_UPGRADE ===" echo "$OFFICIAL_UPGRADE" | jq . || echo "Invalid JSON" if [[ "${{ github.event_name }}" != "workflow_dispatch" ]]; then PATCH_UPGRADE=$(curl -s https://upgrade.mikrotik.ltd/routeros/upgrade.json || echo '{}') if ! echo "$PATCH_UPGRADE" | jq -e . >/dev/null 2>&1; then PATCH_UPGRADE='{}' fi echo "=== PATCH_UPGRADE ===" echo "$PATCH_UPGRADE" | jq . || echo "Invalid JSON" CANDIDATES=$(echo "$OFFICIAL_UPGRADE" | jq -c --argjson patch "$PATCH_UPGRADE" ' ($patch.upgradePaths | objects // {}) as $paths | .upgradePaths // {} | to_entries | map( .value.version as $official_version | ($paths[.key] | objects) as $patch_value | select( $patch_value != null and $official_version != $patch_value.version and ( any( $paths[] | objects | .version; . == $official_version ) | not ) and ( .key | test("^NEWEST6") or .key | test("^NEWESTa7") ) ) | { majorVersion: (if .key | test("^NEWESTa7") then "7" else "6" end), channel: (.key | split(".")[1]), version: .value.version } ) ' || echo '[]') else CANDIDATES=$(echo "$OFFICIAL_UPGRADE" | jq -c ' (.upgradePaths | objects // {}) | to_entries | map( select( .key | test("^NEWEST6") or .key | test("^NEWESTa7") ) | { majorVersion: (if .key | test("^NEWESTa7") then "7" else "6" end), channel: (.key | split(".")[1]), version: .value.version } ) ' || echo '[]') fi VERSION_FILTER="${{ inputs.version || 'all' }}" if [[ "$VERSION_FILTER" == "v6" ]]; then V6_MATRIX=$(echo "$CANDIDATES" | jq -c 'map(select(.majorVersion == "6"))') V7_MATRIX='[]' elif [[ "$VERSION_FILTER" == "v7" ]]; then V6_MATRIX='[]' V7_MATRIX=$(echo "$CANDIDATES" | jq -c 'map(select(.majorVersion == "7"))') else V6_MATRIX=$(echo "$CANDIDATES" | jq -c 'map(select(.majorVersion == "6"))') V7_MATRIX=$(echo "$CANDIDATES" | jq -c 'map(select(.majorVersion == "7"))') fi echo "upgrades_v6=$V6_MATRIX" >> $GITHUB_OUTPUT echo "upgrades_v7=$V7_MATRIX" >> $GITHUB_OUTPUT echo "Upgrades V6: $V6_MATRIX" echo "Upgrades V7: $V7_MATRIX" Patch_V6: needs: Check_Versions if: ${{ needs.Check_Versions.outputs.upgrades_v6 != '[]' }} uses: ./.github/workflows/patch_v6.yml strategy: matrix: target: ${{ fromJson(needs.Check_Versions.outputs.upgrades_v6) }} fail-fast: false with: channel: ${{ matrix.target.channel }} version: ${{ matrix.target.version }} release: ${{ github.event_name == 'workflow_dispatch' && inputs.release || github.event_name != 'workflow_dispatch' && true }} secrets: inherit Patch_V7: needs: Check_Versions if: ${{ needs.Check_Versions.outputs.upgrades_v7 != '[]' }} uses: ./.github/workflows/patch_v7.yml strategy: matrix: target: ${{ fromJson(needs.Check_Versions.outputs.upgrades_v7) }} fail-fast: false with: channel: ${{ matrix.target.channel }} version: ${{ matrix.target.version }} release: ${{ github.event_name == 'workflow_dispatch' && inputs.release || github.event_name != 'workflow_dispatch' && true }} secrets: inherit