From 426dd6e196ddb82426f34b23b005115fa7d5ff44 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Sun, 2 Nov 2025 08:32:31 -0500 Subject: [PATCH 01/18] Add detached exec option to Docker manager --- README.md | 11 +++++++---- main.cpp | 49 +++++++++++++++++++++++++++++++++++++++++-------- tux-dock | Bin 78816 -> 83904 bytes 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 2258dd1..22fe35a 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ It offers a clean, interactive menu for common Docker operations like pulling im - πŸ”Ή **Script-to-image workflow** β€” turn a bash setup script into a Dockerfile and build the resulting image in one go. - πŸ”Ή **Quick MySQL setup** β€” spin up a MySQL container with version, password, and port configuration in seconds. - πŸ”Ή **Get container IP address** β€” cleanly retrieves and displays only the container’s assigned IP. +- πŸ”Ή **Run detached commands** β€” execute background jobs inside a container without attaching an interactive shell. - πŸ”Ή **Modern C++ design** β€” built with classes, minimal dependencies, and clear abstractions. --- @@ -58,10 +59,11 @@ Tux-Dock: Docker Management Menu 8. Stop Container 9. Remove Container 10. Attach Shell to Running Container -11. Spin Up MySQL Container -12. Get Container IP Address -13. Create Dockerfile & Build Image from Bash Script -14. Exit +11. Run Detached Command in Container +12. Spin Up MySQL Container +13. Get Container IP Address +14. Create Dockerfile & Build Image from Bash Script +15. Exit ``` Each action guides you through the required steps. @@ -92,6 +94,7 @@ class DockerManager { void runContainerInteractive(); void listContainers() const; void startInteractive(); + void execDetachedCommand(); void stopContainer(); void showContainerIP(); }; diff --git a/main.cpp b/main.cpp index 16b6fe9..e5b0c29 100644 --- a/main.cpp +++ b/main.cpp @@ -6,6 +6,7 @@ #include #include #include +#include using namespace std; @@ -21,6 +22,7 @@ public: void stopContainer(); void removeContainer(); void execShell(); + void execDetachedCommand(); void createDockerfile(); void spinUpMySQL(); void showContainerIP(); @@ -153,6 +155,35 @@ void DockerManager::execShell() { if (!id.empty()) runCommand("docker exec -it " + id + " /bin/sh"); } +void DockerManager::execDetachedCommand() { + string id = selectContainer("Select container to run command in (detached)"); + if (id.empty()) return; + + // Flush any leftover newline before using getline + cin.ignore(numeric_limits::max(), '\n'); + + string command; + cout << "Enter command to execute inside the container: "; + getline(cin, command); + + if (command.empty()) { + cout << "No command entered. Aborting.\n"; + return; + } + + string escapedCommand; + escapedCommand.reserve(command.size() * 2); + for (char c : command) { + if (c == '"' || c == '\\') + escapedCommand += '\\'; + escapedCommand += c; + } + + cout << "Executing command in detached mode...\n"; + runCommand("docker exec -d " + id + " /bin/sh -c \"" + escapedCommand + "\""); + cout << "Command dispatched.\n"; +} + void DockerManager::spinUpMySQL() { string port, password, version; cout << "Enter port mapping (e.g., 3306:3306): "; @@ -275,10 +306,11 @@ int main() { << "8. Stop Container\n" << "9. Remove Container\n" << "10. Attach Shell to Running Container\n" - << "11. Spin Up MySQL Container\n" - << "12. Get Container IP Address\n" - << "13. Create Dockerfile & Build Image from Bash Script\n" - << "14. Exit\n" + << "11. Run Detached Command in Container\n" + << "12. Spin Up MySQL Container\n" + << "13. Get Container IP Address\n" + << "14. Create Dockerfile & Build Image from Bash Script\n" + << "15. Exit\n" << "----------------------------------\n" << "Choose an option: "; @@ -295,10 +327,11 @@ int main() { case 8: docker.stopContainer(); break; case 9: docker.removeContainer(); break; case 10: docker.execShell(); break; - case 11: docker.spinUpMySQL(); break; - case 12: docker.showContainerIP(); break; - case 13: docker.createDockerfile(); break; - case 14: + case 11: docker.execDetachedCommand(); break; + case 12: docker.spinUpMySQL(); break; + case 13: docker.showContainerIP(); break; + case 14: docker.createDockerfile(); break; + case 15: cout << "Exiting Tux-Dock.\n"; return 0; default: diff --git a/tux-dock b/tux-dock index 5312b2c39c6ce2ec1631e6f36f6104cccc9eba88..82eb04be4b5bba5332128a26114dab1f54952fe3 100755 GIT binary patch literal 83904 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 E0G>*VasU7T delta 23805 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 JHV!n!{vSkJ6Dj}z From b695c3f8efe3c1680bbe29c7a3631dadb7fd8f63 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 15:52:34 -0500 Subject: [PATCH 02/18] Add CI build for tuxdock --- .forgejo/workflows/build.yaml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .forgejo/workflows/build.yaml diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml new file mode 100644 index 0000000..7ae9ea3 --- /dev/null +++ b/.forgejo/workflows/build.yaml @@ -0,0 +1,23 @@ +name: Build TuxDock + +on: + push: + branches: + - main + - master + - dev + - feature/** + +jobs: + build: + runs-on: [self-hosted] + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Compile tux-dock + run: | + #!/bin/sh + g++ -std=c++17 main.cpp -o tux-dock && echo "tux-dock successfully compiled!" + + From 1218614e6891efbe11f934d865681ed94c13d21c Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 16:00:16 -0500 Subject: [PATCH 03/18] Workflow fix attempt --- .forgejo/workflows/build.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index 7ae9ea3..c8f0f32 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -11,6 +11,8 @@ on: jobs: build: runs-on: [self-hosted] + env: + FORGEJO_SERVER_URL: https://mentalnet.xyz/forgejo steps: - name: Checkout code uses: actions/checkout@v4 From 56b3d8a376efabc3bda4346a7ab4b6a93c8c4ad3 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 16:12:03 -0500 Subject: [PATCH 04/18] Workflow retry --- .forgejo/workflows/build.yaml | 25 ------------------------- .forgejo/workflows/test.yaml | 8 ++++++++ 2 files changed, 8 insertions(+), 25 deletions(-) delete mode 100644 .forgejo/workflows/build.yaml create mode 100644 .forgejo/workflows/test.yaml diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml deleted file mode 100644 index c8f0f32..0000000 --- a/.forgejo/workflows/build.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: Build TuxDock - -on: - push: - branches: - - main - - master - - dev - - feature/** - -jobs: - build: - runs-on: [self-hosted] - env: - FORGEJO_SERVER_URL: https://mentalnet.xyz/forgejo - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Compile tux-dock - run: | - #!/bin/sh - g++ -std=c++17 main.cpp -o tux-dock && echo "tux-dock successfully compiled!" - - diff --git a/.forgejo/workflows/test.yaml b/.forgejo/workflows/test.yaml new file mode 100644 index 0000000..b7887b4 --- /dev/null +++ b/.forgejo/workflows/test.yaml @@ -0,0 +1,8 @@ +on: [push] + +jobs: + test: + runs-on: self-hosted + steps: + - run: echo "All good from tuxdock runner on $(hostname)!" + From a017b138000b6bb4ec7a116f6aca0903b7d9ee74 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 16:14:16 -0500 Subject: [PATCH 05/18] Testing build action, removing included build binary file --- .forgejo/workflows/build.yaml | 21 +++++++++++++++++++++ tux-dock | Bin 83904 -> 0 bytes 2 files changed, 21 insertions(+) create mode 100644 .forgejo/workflows/build.yaml delete mode 100755 tux-dock diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml new file mode 100644 index 0000000..60232cc --- /dev/null +++ b/.forgejo/workflows/build.yaml @@ -0,0 +1,21 @@ +name: Build TuxDock + +on: [push] + +jobs: + build: + runs-on: [self-hosted] + steps: + - name: Manual clone + run: | + git clone https://mentalnet.xyz/forgejo/markmental/tuxdock.git . + echo "βœ… Repository cloned successfully" + + - name: Compile tux-dock + run: | + g++ -std=c++17 main.cpp -o tux-dock && echo "πŸŽ‰ tux-dock successfully compiled!" + + - name: Verify build + run: | + file tux-dock || echo "⚠️ tux-dock binary not found!" + diff --git a/tux-dock b/tux-dock deleted file mode 100755 index 82eb04be4b5bba5332128a26114dab1f54952fe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83904 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 E0G>*VasU7T From f1ce4da927e6a26c81fee3e5de971b53306ca68e Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 16:20:39 -0500 Subject: [PATCH 06/18] Build Artifact test --- .forgejo/workflows/build.yaml | 14 +++++++++++--- .forgejo/workflows/test.yaml | 8 -------- 2 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 .forgejo/workflows/test.yaml diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index 60232cc..81be2cd 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -1,4 +1,4 @@ -name: Build TuxDock +name: Build & Upload tux-dock on: [push] @@ -13,9 +13,17 @@ jobs: - name: Compile tux-dock run: | - g++ -std=c++17 main.cpp -o tux-dock && echo "πŸŽ‰ tux-dock successfully compiled!" + g++ -std=c++17 main.cpp -o tux-dock + echo "πŸŽ‰ tux-dock successfully compiled!" - name: Verify build run: | - file tux-dock || echo "⚠️ tux-dock binary not found!" + file tux-dock + + - name: Upload build artifact + uses: actions/upload-artifact@v4 + with: + name: tux-dock-linux-x86_64 + path: tux-dock + diff --git a/.forgejo/workflows/test.yaml b/.forgejo/workflows/test.yaml deleted file mode 100644 index b7887b4..0000000 --- a/.forgejo/workflows/test.yaml +++ /dev/null @@ -1,8 +0,0 @@ -on: [push] - -jobs: - test: - runs-on: self-hosted - steps: - - run: echo "All good from tuxdock runner on $(hostname)!" - From d4dabad314b7a3d388781f0719bdae851652bb4c Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 16:22:28 -0500 Subject: [PATCH 07/18] Build Artifact test - switch to v3 --- .forgejo/workflows/build.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index 81be2cd..ce91cc0 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -17,11 +17,10 @@ jobs: echo "πŸŽ‰ tux-dock successfully compiled!" - name: Verify build - run: | - file tux-dock + run: file tux-dock - name: Upload build artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v3 with: name: tux-dock-linux-x86_64 path: tux-dock From a4ae73dd8b299bcdd5b89e31708727e671189fa9 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 16:44:23 -0500 Subject: [PATCH 08/18] trixie runner test --- .forgejo/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index ce91cc0..9393930 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -4,7 +4,7 @@ on: [push] jobs: build: - runs-on: [self-hosted] + runs-on: [self-hosted:docker://node:trixie] steps: - name: Manual clone run: | From d2b25f54ed6a5a7cb73d47e3dfa7af88f054a5ed Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 16:55:48 -0500 Subject: [PATCH 09/18] trixie runner test, attempt 2 --- .forgejo/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index 9393930..06773ff 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -4,7 +4,7 @@ on: [push] jobs: build: - runs-on: [self-hosted:docker://node:trixie] + runs-on: [self-hosted-trixie] steps: - name: Manual clone run: | From d2e513eb37d08a8d3a441e9806b9ba4a47852f3b Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 17:21:51 -0500 Subject: [PATCH 10/18] Build Workflow Tweak --- .forgejo/workflows/build.yaml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index 06773ff..cff4dc9 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -19,10 +19,14 @@ jobs: - name: Verify build run: file tux-dock - - name: Upload build artifact + - name: Package build as zip + run: | + zip tux-dock-linux-x86_64.zip tux-dock + echo "πŸ“¦ Created tux-dock-linux-x86_64.zip" + + - name: Upload build artifact (zip) uses: actions/upload-artifact@v3 with: - name: tux-dock-linux-x86_64 - path: tux-dock - + name: tux-dock-linux-x86_64-zip + path: tux-dock-linux-x86_64.zip From c933bcbaab40c6a9ae95035ae803cf1dc2e66112 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 17:24:00 -0500 Subject: [PATCH 11/18] Build Workflow Tweak - tar instead of zip file artifact --- .forgejo/workflows/build.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index cff4dc9..bd89d45 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -19,14 +19,14 @@ jobs: - name: Verify build run: file tux-dock - - name: Package build as zip + - name: Package build as tar.gz run: | - zip tux-dock-linux-x86_64.zip tux-dock - echo "πŸ“¦ Created tux-dock-linux-x86_64.zip" + tar -czvf tux-dock-linux-x86_64.tar.gz tux-dock + echo "πŸ“¦ Created tux-dock-linux-x86_64.tar.gz" - - name: Upload build artifact (zip) + - name: Upload build artifact (tar.gz) uses: actions/upload-artifact@v3 with: - name: tux-dock-linux-x86_64-zip - path: tux-dock-linux-x86_64.zip + name: tux-dock-linux-x86_64-tar + path: tux-dock-linux-x86_64.tar.gz From f1b0d41a9c1303a7470aa2b09e006478a1d76790 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 17:28:40 -0500 Subject: [PATCH 12/18] Build Workflow Tweak - letting actions upload zip --- .forgejo/workflows/build.yaml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index bd89d45..a6491b1 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -19,14 +19,10 @@ jobs: - name: Verify build run: file tux-dock - - name: Package build as tar.gz - run: | - tar -czvf tux-dock-linux-x86_64.tar.gz tux-dock - echo "πŸ“¦ Created tux-dock-linux-x86_64.tar.gz" - - - name: Upload build artifact (tar.gz) + - name: Upload build artifact uses: actions/upload-artifact@v3 with: - name: tux-dock-linux-x86_64-tar - path: tux-dock-linux-x86_64.tar.gz + # The artifact itself will be a zip automatically + name: tux-dock-linux-x86_64.zip + path: tux-dock From 7c79efa2a1d0d84f0a8b1a93f2611f5b27f99103 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 17:31:42 -0500 Subject: [PATCH 13/18] Removing the redundant .zip extension --- .forgejo/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index a6491b1..89f04ed 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -23,6 +23,6 @@ jobs: uses: actions/upload-artifact@v3 with: # The artifact itself will be a zip automatically - name: tux-dock-linux-x86_64.zip + name: tux-dock-linux-x86_64 path: tux-dock From 01546a049810b92e0f4501899e44f35574e18664 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 17:37:12 -0500 Subject: [PATCH 14/18] Back to debian bookworm for compatibility in build workflow --- .forgejo/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index 89f04ed..f7d57bf 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -4,7 +4,7 @@ on: [push] jobs: build: - runs-on: [self-hosted-trixie] + runs-on: [self-hosted] steps: - name: Manual clone run: | From 6cca377d2f678965638881e532ebf7d59eb05768 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 17:42:48 -0500 Subject: [PATCH 15/18] Artifact QOL fixes --- .forgejo/workflows/build.yaml | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index f7d57bf..af04a28 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -1,28 +1,38 @@ name: Build & Upload tux-dock -on: [push] +on: + push: + branches: + - main + - dev jobs: build: runs-on: [self-hosted] steps: - - name: Manual clone + - name: Clone current branch run: | - git clone https://mentalnet.xyz/forgejo/markmental/tuxdock.git . - echo "βœ… Repository cloned successfully" + git clone --branch ${{ github.ref_name }} https://mentalnet.xyz/forgejo/markmental/tuxdock.git . + echo "βœ… Checked out branch ${{ github.ref_name }}" - name: Compile tux-dock run: | g++ -std=c++17 main.cpp -o tux-dock - echo "πŸŽ‰ tux-dock successfully compiled!" + chmod +x tux-dock + echo "πŸŽ‰ tux-dock successfully compiled and marked executable!" - name: Verify build run: file tux-dock + - name: Prepare artifact directory + run: | + mkdir -p build/${{ github.ref_name }} + mv tux-dock build/${{ github.ref_name }}/ + echo "πŸ“ Prepared build directory: build/${{ github.ref_name }}/tux-dock" + - name: Upload build artifact uses: actions/upload-artifact@v3 with: - # The artifact itself will be a zip automatically name: tux-dock-linux-x86_64 - path: tux-dock + path: build/ From c53d4a98fbd2ee463565a1de0e2f8a0897ab00cc Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 17:51:34 -0500 Subject: [PATCH 16/18] .tar build exploration --- .forgejo/workflows/build.yaml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index af04a28..140c976 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -24,15 +24,17 @@ jobs: - name: Verify build run: file tux-dock - - name: Prepare artifact directory + - name: Package build as tar run: | mkdir -p build/${{ github.ref_name }} + chmod +x tux-dock mv tux-dock build/${{ github.ref_name }}/ - echo "πŸ“ Prepared build directory: build/${{ github.ref_name }}/tux-dock" - + tar czf tux-dock-linux-x86_64-${{ github.ref_name }}.tar.gz -C build ${ { github.ref_name } } + echo "πŸ“¦ Created tarball with preserved permissions" - name: Upload build artifact uses: actions/upload-artifact@v3 with: - name: tux-dock-linux-x86_64 - path: build/ + name: tux-dock-linux-x86_64-${{ github.ref_name }} + path: tux-dock-linux-x86_64-${{ github.ref_name }}.tar.gz + From 4be73d33daff1725f408492cedc97a56598dfc23 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 17:54:04 -0500 Subject: [PATCH 17/18] .tar build exploration v2 --- .forgejo/workflows/build.yaml | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index 140c976..32e608f 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -9,32 +9,33 @@ on: jobs: build: runs-on: [self-hosted] + env: + BRANCH: ${{ github.ref_name }} steps: - name: Clone current branch run: | - git clone --branch ${{ github.ref_name }} https://mentalnet.xyz/forgejo/markmental/tuxdock.git . - echo "βœ… Checked out branch ${{ github.ref_name }}" + git clone --branch "$BRANCH" https://mentalnet.xyz/forgejo/markmental/tuxdock.git . + echo "βœ… Checked out branch $BRANCH" - name: Compile tux-dock run: | g++ -std=c++17 main.cpp -o tux-dock chmod +x tux-dock - echo "πŸŽ‰ tux-dock successfully compiled and marked executable!" + echo "πŸŽ‰ tux-dock compiled and marked executable!" - name: Verify build run: file tux-dock - - name: Package build as tar + - name: Prepare build artifact (tarball) run: | - mkdir -p build/${{ github.ref_name }} - chmod +x tux-dock - mv tux-dock build/${{ github.ref_name }}/ - tar czf tux-dock-linux-x86_64-${{ github.ref_name }}.tar.gz -C build ${ { github.ref_name } } - echo "πŸ“¦ Created tarball with preserved permissions" + mkdir -p build/"$BRANCH" + mv tux-dock build/"$BRANCH"/ + tar czf tux-dock-linux-x86_64-"$BRANCH".tar.gz -C build "$BRANCH" + echo "πŸ“¦ Created tux-dock-linux-x86_64-$BRANCH.tar.gz" + - name: Upload build artifact uses: actions/upload-artifact@v3 with: - name: tux-dock-linux-x86_64-${{ github.ref_name }} - path: tux-dock-linux-x86_64-${{ github.ref_name }}.tar.gz - + name: tux-dock-linux-x86_64-${{ env.BRANCH }} + path: tux-dock-linux-x86_64-${{ env.BRANCH }}.tar.gz From 60b7c9ae905c7c6190143a927e0034607bf5c5f6 Mon Sep 17 00:00:00 2001 From: mrkmntal Date: Mon, 3 Nov 2025 18:11:31 -0500 Subject: [PATCH 18/18] Add commit hash to compressed files --- .forgejo/workflows/build.yaml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index 32e608f..c8a8b85 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -11,11 +11,12 @@ jobs: runs-on: [self-hosted] env: BRANCH: ${{ github.ref_name }} + COMMIT: ${{ github.sha }} steps: - name: Clone current branch run: | git clone --branch "$BRANCH" https://mentalnet.xyz/forgejo/markmental/tuxdock.git . - echo "βœ… Checked out branch $BRANCH" + echo "βœ… Checked out branch $BRANCH ($COMMIT)" - name: Compile tux-dock run: | @@ -26,16 +27,19 @@ jobs: - name: Verify build run: file tux-dock - - name: Prepare build artifact (tarball) + - name: Prepare build artifact (tar.gz) run: | mkdir -p build/"$BRANCH" mv tux-dock build/"$BRANCH"/ - tar czf tux-dock-linux-x86_64-"$BRANCH".tar.gz -C build "$BRANCH" - echo "πŸ“¦ Created tux-dock-linux-x86_64-$BRANCH.tar.gz" + SHORT_HASH=$(echo "$COMMIT" | cut -c1-7) + TAR_NAME="tux-dock-linux-x86_64-${BRANCH}-${SHORT_HASH}.tar.gz" + tar czf "$TAR_NAME" -C build "$BRANCH" + echo "πŸ“¦ Created $TAR_NAME" - name: Upload build artifact uses: actions/upload-artifact@v3 with: - name: tux-dock-linux-x86_64-${{ env.BRANCH }} - path: tux-dock-linux-x86_64-${{ env.BRANCH }}.tar.gz + name: tux-dock-linux-x86_64-${{ env.BRANCH }}-${{ env.COMMIT }} + path: tux-dock-linux-x86_64-${{ env.BRANCH }}-*.tar.gz +