diff --git a/.gitea/workflows/rebuild-prod.yaml b/.gitea/workflows/rebuild-prod.yaml new file mode 100644 index 0000000..c13fbcd --- /dev/null +++ b/.gitea/workflows/rebuild-prod.yaml @@ -0,0 +1,89 @@ +# https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions +name: Build Images and Deploy +run-name: ${{ gitea.actor }} is building new PROD images and redeploying the existing stack 🚀 +on: + push: + # not working right now https://github.com/actions/runner/issues/2324 + # paths-ignore: + # - **.yml + branches: + - main + +env: + STACK_NAME: hashex + DOT_ENV: ${{ secrets.PROD_ENV }} + PORTAINER_TOKEN: ${{ vars.PORTAINER_TOKEN }} + PORTAINER_API_URL: https://portainer.dev.nervesocket.com/api + ENDPOINT_NAME: "mini" #sometimes "primary" + IMAGE_TAG: "reg.dev.nervesocket.com/hashex:latest" + +jobs: + Update-PROD-Stack: + runs-on: ubuntu-latest + steps: + # if: contains(github.event.pull_request.head.ref, 'init-stack') + - name: Checkout + uses: actions/checkout@v4 + with: + ref: main + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Build and push PROD Docker image + run: | + echo $DOT_ENV | base64 -d > .env + docker buildx build --push -f Dockerfile -t $IMAGE_TAG . + + - name: Get the endpoint ID + # Usually ID is 1, but you can get it from the API. Only skip this if you are VERY sure. + run: | + ENDPOINT_ID=$(curl -s -H "X-API-Key: $PORTAINER_TOKEN" "$PORTAINER_API_URL/endpoints" | jq -r ".[] | select(.Name==\"$ENDPOINT_NAME\") | .Id") + echo "ENDPOINT_ID=$ENDPOINT_ID" >> $GITHUB_ENV + echo "Got stack Endpoint ID: $ENDPOINT_ID" + + - name: Fetch stack ID from Portainer + run: | + STACK_ID=$(curl -s -H "X-API-Key: $PORTAINER_TOKEN" "$PORTAINER_API_URL/stacks" | jq -r ".[] | select(.Name==\"$STACK_NAME\" and .EndpointId==$ENDPOINT_ID) | .Id") + + echo "STACK_ID=$STACK_ID" >> $GITHUB_ENV + echo "Got stack ID: $STACK_ID matched with Endpoint ID: $ENDPOINT_ID" + + - name: Fetch Stack + run: | + # Get the stack details (including env vars) + STACK_DETAILS=$(curl -s -H "X-API-Key: $PORTAINER_TOKEN" "$PORTAINER_API_URL/stacks/$STACK_ID") + + # Extract environment variables from the stack + echo "$STACK_DETAILS" | jq -r '.Env' > stack_env.json + + echo "Existing stack environment variables:" + cat stack_env.json + + - name: Redeploy stack in Portainer + run: | + # Read stack file content + STACK_FILE_CONTENT=$(echo "$( 0) { + // First try direct device info fetch + let device = null; + try { + console.log(`[DWM] Trying direct device info fetch for ${host}:${devicePort}`); + device = await wemo.getDeviceInfo(host, devicePort); + if (device) { + device.host = host; + device.port = devicePort; + device.manual = true; // Mark as manually added + console.log(`[DWM] Direct fetch successful:`, device); + } + } catch (directErr) { + console.log(`[DWM] Direct fetch failed:`, directErr.message); + } + + // If direct fetch failed, try discovery with manual entry + if (!device) { + console.log(`[DWM] Trying discovery with manual entry`); + const devices = await wemo.discoverDevices(5000, [manualEntry]); + if (devices.length > 0) { + device = devices[0]; + device.manual = true; // Mark as manually added + console.log(`[DWM] Discovery successful:`, device); + } + } + + if (device) { // Add to existing devices - const allDevices = [...store.getDevices(), ...devices]; + const allDevices = [...store.getDevices(), ...[device]]; store.saveDevices(allDevices); - return json(res, devices[0], 201); + console.log(`[DWM] Device added successfully: ${device.friendlyName || device.host}`); + return json(res, device, 201); } else { - return jsonErr(res, 'No Wemo device found at this address', 404); + console.log(`[DWM] No device found at ${host}:${devicePort}`); + return jsonErr(res, `No Wemo device found at ${host}:${devicePort}. Check IP address and port.`, 404); } } catch (err) { + console.log(`[DWM] Error adding device:`, err); return jsonErr(res, `Failed to connect: ${err.message}`, 500); } }