Kaizen #160: Automating ZDK CLI commands using shell scripting

Kaizen #160: Automating ZDK CLI commands using shell scripting


Hello everyone,
Welcome back to Kaizen.  ZDK CLI's command-line nature allows you to easily incorporate it within a shell script, to achieve any custom action that you want to execute.  It allows you to execute multiple ZDK CLI commands seamlessly, enhancing productivity.

In this week's Kaizen post, we will discuss a shell script designed to automate the process of pushing locally modified metadata to our CRM environment. Before executing the push operation, ensure that the local metadata is up-to-date and conflicts (same file has been modified in both the local ZDK environment and the remote UI environment) are resolved. To achieve this, we will perform the following steps for files in conflict where manual intervention is required:
  • Retrieve the latest metadata from Zoho CRM to our local environment using zdk org:pull command
  • Address conflicts that may arise during the pull operation using zdk org:pull:resolve command 
  • Update our local directory with the newly pulled file using zdk org:pull:update command
  • Push changes from your local environment to the CRM using zdk org:push command
  • Update local directory and check status of push command using zdk org:push:result command
This script automates the sequential execution of these commands.

Prerequisites
  • ZDK CLI Version 1.0.2-beta
To update ZDK CLI, execute the following command in your terminal


  npm install -g @zohocrm/zdk-cli


This will initiate the installation process for the latest version.

Crafting the Shell Script

 
1.Create a new shell script file zdk_automation.sh in your ZDK project's root directory.
#!/bin/bash
touch stdout.txt
#This script is used to automate ZDK CLI conflict resolve flow
conflict_flag=false
# Clear stdout.txt at the start
> stdout.txt
#Step 1: Initial Push Command
echo "====Start of the script ====" >> stdout.txt
echo "**Executing the initial zdk org:push -j" >> stdout.txt
json_content=$(zdk org:push -j)
echo "Output  $json_content" >> stdout.txt
next_command=$(echo "$json_content" | jq -r '.next_command_sequence // empty')
echo "next_command after initial push  is $next_command">> stdout.txt
# Check if the JSON is valid
if echo "$json_content" | jq empty 2>/dev/null; then
#Step 2: Conflict Detection
    message=$(echo "$json_content" | jq -r '.message')
    echo "message: $message" >>stdout.txt
    if [[ "$message" == *"Merge Conflicts!"* ]]; then
        #Step 3: Resolving Conflicts
        conflict_flag=true
        # Pull changes to the local repository and store the output in a variable
        echo "**Executing zdk org:pull -j" >> stdout.txt
        json_content=$(zdk org:pull -j)
        echo "Output  $json_content" >> stdout.txt
        if echo "$json_content" | jq empty 2>/dev/null; then
            message=$(echo "$json_content" | jq -r '.result')
            echo "message $message" >>stdout.txt
            IFS=$'\n' read -r -d '' -a filenames <<< "$message"
            # Iterate over each filename and execute the resolve command
            for filename in "${filenames[@]}"; do
                echo "**Executing zdk org:pull:resolve for $filename" >> stdout.txt
                # Executing zdk org:pull:resolve 
                json_content=$(zdk org:pull:resolve -f "$filename" -j)
                echo "Output  $json_content" >> stdout.txt
            done
            echo "***Executing zdk org:pull:update" >> stdout.txt
            json_content=$(zdk org:pull:update -j)
            echo "Output  $json_content" >> stdout.txt
        fi
    fi
fi
#Step 4: Second Push Attempt after conflict
if [ "$conflict_flag" = true ]; then
# Push changes to the org and store the output in a variable again
echo "***Executing: zdk org:push -j after conflict resolution" >> stdout.txt
json_content=$(zdk org:push -j)
echo "Output  $json_content" >> stdout.txt
# Extract the line containing "next_command_sequence" from the push output
next_command=$(echo "$json_content" | jq -r '.next_command_sequence')
echo "Next command $next_command " >> stdout.txt
fi
#Step 5: Push result command
# Execute the next command if it exists
counter=0  # Initialize a counter
if [ -n "$next_command" ]; then
    while true; do
    # Execute the command stored in next_command and capture the output
    echo "***Executing: $next_command -j"  >> stdout.txt
    output=$(eval "$next_command -j")
    echo "Output $output" >>stdout.txt
    # Check if the output contains "Process in progress"
    if echo "$output" | grep -q "Process in progress"; then
        echo "Push process in progress. Waiting for 5 seconds..."  >> stdout.txt
        sleep 5  # Wait for 5 seconds
    else
        # If not found, break the loop and handle the output
        echo "Command executed successfully or completed."  >> stdout.txt
        break
    fi
     # Increment the counter
    counter=$((counter + 1))

    # Break the loop after 10 iterations
    if [ "$counter" -ge 10 ]; then
        echo "Maximum number of attempts(10) reached. Exiting the loop." >> stdout.txt
        echo "Try executing $next_command after some time" >> stdout.txt
        break
    fi
done
fi

Explanation of the script

Step 1: Initial Push Command
  • The script starts by executing the zdk org:push -j command. 
  • The commands executed using -j option ensures that the output is in a machine-readable JSON format, which facilitates easier parsing and processing.
  • The conflict_flag is set to false.
Step 2: Conflict Detection
  • The script checks the output for any merge conflicts. 
  • If conflicts are detected, it executes the zdk org:pull -j  command to retrieve the latest changes from the organization. The conflict_flag is set to true.
  • If conflicts are not present, the script proceeds to Step 5: Executing the push:result command.
Step 3: Resolving Conflicts
  • If conflicts are present, the script extracts a list of filenames associated with these conflicts. 
  • It iterates through this list and executes the zdk org:pull:resolve -j command for each filename, allowing for manual resolution of conflicts as needed. 
  • This opens a three-way editor in the browser where the conflicts can be resolved.
Step 4: Second Push Attempt after conflict
  • Once all conflicts are resolved, the script attempts to push any changes back to Zoho CRM by executing the zdk org:push -j command. 
Step 5: Executing push:result command 
  • This command should be followed by zdk org:push:result --jobid {id} command (indicated by a next_command_sequence) which displays the result of the push process with the mentioned job id and updates the local directory. 
  • During this process, if the result is shown as "Process in progress", a subsequent push:result command is required. In this case, the script waits for five seconds before trying again to ensure that operations complete successfully. 

2.Make the script executable
chmod +x zdk_automation.sh

3.Run your script
./zdk_automation.sh & tail -f stdout.txt

Logging ActionsAll actions taken by the script are logged in stdout.txt. This serves as a record for later reference and troubleshooting.







Using ZDK CLI with shell script ensures that your ZDK CLI operations are automated daily, minimizing manual intervention while effectively managing conflicts. 
Notes
For the current beta release, ZDK CLI is exclusively available for Sandbox environment and is not operational in Production environments. 

We hope you found this post useful. We will meet you next week with another interesting topic!
If you have any questions, let us know in the comment section.

Happy Exploring!


    • Sticky Posts

    • Kaizen #197: Frequently Asked Questions on GraphQL APIs

      🎊 Nearing 200th Kaizen Post – We want to hear from you! Do you have any questions, suggestions, or topics you would like us to cover in future posts? Your insights and suggestions help us shape future content and make this series better for everyone.
    • Kaizen #198: Using Client Script for Custom Validation in Blueprint

      Nearing 200th Kaizen Post – 1 More to the Big Two-Oh-Oh! Do you have any questions, suggestions, or topics you would like us to cover in future posts? Your insights and suggestions help us shape future content and make this series better for everyone.
    • Celebrating 200 posts of Kaizen! Share your ideas for the milestone post

      Hello Developers, We launched the Kaizen series in 2019 to share helpful content to support your Zoho CRM development journey. Staying true to its spirit—Kaizen Series: Continuous Improvement for Developer Experience—we've shared everything from FAQs
    • Kaizen #193: Creating different fields in Zoho CRM through API

      🎊 Nearing 200th Kaizen Post – We want to hear from you! Do you have any questions, suggestions, or topics you would like us to cover in future posts? Your insights and suggestions help us shape future content and make this series better for everyone.
    • Client Script | Update - Introducing Commands in Client Script!

      Have you ever wished you could trigger Client Script from contexts other than just the supported pages and events? Have you ever wanted to leverage the advantage of Client Script at your finger tip? Discover the power of Client Script - Commands! Commands
    • Recent Topics

    • Hide Inactive Social Sign-In Providers from Login Screen

      Hello Zoho Team, We hope you are doing well. Currently, Zoho One allows admins to configure security policies and enable or disable Social Sign-In options for third-party providers such as Apple, Google, Microsoft, LinkedIn, Yahoo, Twitter, Facebook,
    • [Free Webinar] AI Agents in Zoho Creator - Creator Tech Connect

      Hello Everyone! We welcome you all to the upcoming free webinar on the Creator Tech Connect Series. The Creator Tech Connect series is a free monthly webinar that runs for around 45 minutes. It comprises technical sessions in which we delve deep into
    • Download All Attached Files

      It would be extremely useful to have "download-all" functionality for downloading files attached to a task, subtask, comment, forum post or hosted in the "Documents" section etc. We've instructed our users to zip multiple files prior to uploading, but of course they forget all the time. Having to download lots of files one-at-a-time off a comment or task wastes a lot of time.
    • unable to send message reason 554 5.1.8 Email outgoing blocked

      unable to send message reason 554 5.1.8 Email outgoing blocked
    • Ship via Carrier Not Working Since Commerce Update

      Since the recent update to the Commerce platform, I can no longer use the ship via carrier function. It will take me to the address screen and let me verify them but when I go to save and move tot he next screen it will not do anything. This is happening
    • automations: Can I execute a step on a specific date?

      I have created a form in Zoho forms, and created a contacts list. I have also begun setting up an automation with the intention of sending the form to the contact list on a specific date every month (via email) for the entire year (essentially sending
    • Zoho Expense - The ability to add detail to a Trip during booking

      As an admin, I would like the ability to add more detail to the approved Trips. At present a requestor can add flights, accommodation details and suggest their preferences. It would be great if the exact details of the trip could be added either by the
    • Adding Folders in Android App

      Is it possible to create a new email folder within the Zoho Mail Android app?  Or can this only be done from the desktop version of Zoho Mail? Cheers!
    • Schedule Exports for Regular Project Updates

      Tracking project data often means exporting data at regular intervals. Instead of manually exporting data every time, users can schedule exports for Phases, Tasks, and Tasks in Zoho Projects. These exports can be set to run once, daily, weekly, or monthly
    • Question about custom fields using Pivot Tables.

      I have created a pivot table showing annual revenue of a client and how much payment that client is paying my company. Is there a way using pivot table to add an additional field that subtracts those to fields / shows me a percentage of that difference?
    • Request for Light/Dark Mode

      Would love the ability to switch between Light and Dark mode similar to Zoho CRM. https://help.zoho.com/portal/en/community/topic/introducing-dark-mode-light-mode-a-new-look-for-your-crm
    • Signature field is showing black

      Hello, When customer signed the service form, it is showing as below picture Phone model: iPhone 16 Pro We tried delete and install application, but it not solved. This has on phone of a few person. There is any advice to solve this?
    • Journey Email - Ignored Contacts

      I have a journey setup which simply sends a string of emails over time. For some reason I am getting large amounts of the contacts who enter the first email being ignored and I can't find anywhere in reports or audit logs why these contacts are not
    • Involved account types are not applicable when create journals

      { "journal_date": "2016-01-31", "reference_number": "20160131", "notes": "SimplePay Payroll", "line_items": [{ "account_id": "538624000000035003", "description": "Net Pay", "amount": 26690.09, "debit_or_credit": "credit" }, { "account_id": "538624000000000403", "description": "Gross", "amount": 32000, "debit_or_credit": "debit" }, { "account_id": "538624000000000427", "description": "CPP", "amount": 1295.64, "debit_or_credit": "debit" }, { "account_id": "538624000000000376", "description":
    • Zoho Books - Include Payment Terms as a Custom View filter

      It would be great if you could created a custom view based on Payment Terms. This would be really handy for seeing a list of customers who have credit terms. A workaround is not required. I could do something with a creditor checkbox, but it would be
    • How to update changed purchase account of item in invoice

      I have selected the wrong purchase account for various articles and created invoices. I had to adjust the purchase account in the article afterwards, but the old purchase account is still posted in the transaction-journal of the invoice. To adjust the
    • Help - Zoho CRM notification on mobile (IOS/Android)

      Hello Community! Can I get the IOS/Andoid CRM app to notify me of events, calls, etc. due as I can with MANY other apps?   I am running the free Zoho I would like this to be native to the Zoho CRM app. I do not want to write a sep. mobile app
    • Zoho Books Idea - Include another field in Bank Details for Address

      Hi Books team, Currently use the Description field in the Bank Details to store the bank's address. This works fine but it would be great if you could add another field for Bank Address, so that other notes about the bank account could be stored in the
    • a question about the COQL API v8

      When I specify eight or more values in a WHERE IN clause and execute it, an error occurs. Is there a limit to the number of values that can be specified in a WHERE IN clause? ↓Error select * FROM Vendors WHERE (id in (1, 2, 3, 4, 5, 6, 7, 8, 9)) ↓Success
    • Zoho Books Idea - Bank Details Button on Banking

      Hi Books team, Sometimes I'm asked to share bank details with a customer or a colleague. So I go to the Banking Module, find the correct bank account, click Setting > Edit, then copy and paste the bank details. Wouldn't it be great if there was a button
    • JS SDK 8.0 – TypeError: Cannot read properties of undefined (reading 'getCacheStore') with sample code

      Hello Zoho Support Team, I’m integrating the Zoho CRM JavaScript SDK v8.0 and I’m getting the error below when running your official sample. I tested directly from: https://github.com/zoho/zohocrm-javascript-sdk-8.0/blob/main/samples/create_records_sample/create_records.js
    • Function #55: Convert multiple quotes to single SO using Custom Button

      Hello everyone, and welcome back to our series! In Zoho Books, after a quote is accepted by your customer, it can be converted into a sales order or an invoice. Often, a customer might have multiple quotes, and for easier billing or upon the customer's
    • Time based workflow without edit/action

      Hello I need help solving this problem if possible. We have Deals come into the CRM via Live Transfer which have the field properties: Stage = New Channel = Inbound Some of them don't get answered so we want these to automatically go into our Outbound
    • What's New - August 2025 | Zoho Backstage

      Every month, Zoho Backstage grows with you. These updates aren't just features and fixes, they're about making your workday smoother, your events more impactful, and your attendees happier. We’ve listened, learned, and shaped this release to keep things
    • prevent selling expired items

      Hello. I need to make a constraint on expired batch items not to be sold. Is it possible in Zoho Inventory? if so, then how? Thanks for further help.
    • Product details removed during update from other system

      We maintain our product details in an other system. These details are synchronized with Zoho at the end of each day, through an API. This has worked perfectly sofar. But last Monday, all product codes and some other product data have been wiped during
    • Client Customer

      I purchased a customer user license, but we cannot see the project I added in the customer account. I would like to ask for support on what we should do.
    • Add Ability to Use Zoho Finance Tags

      For Zoho Finance (Books and Inventory), the current actions do not allow us to affect the tags associated with the entities in question (customers, vendors, items, etc.). Please consider adding this functionality into the actions.
    • Embeded Signing doesn't work on Safari Browser

      We have implemented Zoho Sign in our website by using embeded signing, It works perfectly on Chrome. But it fails on Safari, We get stuck on Zoho Sign Page during redirection from Zoho Sign to our website after signing the document, Please let us know
    • Dataprep Webhook Limits and Cannot update column with Dataprep

      I have two problems : 1 - I am using Airflow to trigger my pipeline, and when I tested it, it worked fine a couple of times. However, after that, I received an error: {"code":429,"message":"Request rate limited"}. I didn’t send too many requests — maybe
    • New in Zoho Forms: Google reCAPTCHA v3 for smarter spam protection

      Hello form builders, Spam submissions are one of the biggest challenges when you share your forms online. They not only clutter your data but can also waste valuable time. To help you combat this without making life harder for genuine respondents, we’re
    • Project Management Bulletin: August, 2025

      We’ve touched a grand 19 years since we started pioneering project management solutions with Zoho Projects. What started as a simple one-page interface is now a suite of products with Zoho BugTracker, Zoho Sprints, and our new debut Zoho Projects Plus,
    • Zoho Sign and Zoho Workdrive Integration

      Hello, there. I want to know if it's possible to save a signed document from Zoho Sign in an specific folder for each signer in Zoho Workdrive.  For example: If John Doe signs the document in Zoho Sign I want to save it automatically in a folder named
    • How do you list multiple contacts for a lead?

      My sales team wants to be able to add additional contacts for leads, how do we do that? Is there a different way we should be using the lead / contact functionality? Moderation update (9th September 2025): Our developers have built an extension to achieve
    • Modifying Three Dot Menu Options

      Is there a way to modify the three dot menu options that display in a Report header? They currently display: Show As (List, Calendar, Timeline), Print, Import, Export. I'd like to remove the Show As and Print options, since they aren't applicable for
    • Field Not Updating in FSM Script - Service and Parts module.

      Dear Team, I am reaching out regarding a script I have implemented in Zoho FSM to automate the calculation of the End of Service date based on the End of Sale date in the Service and Parts module. Overview of the script: Fetches the End_of_Sale__C and
    • Zadarma + Zoho CRM Integration – Missed Calls Saved as Contacts Instead of Leads

      Hello everyone, I’m looking for input from anyone with experience using the Zadarma + Zoho CRM integration. Currently, I’m seeing that missed calls are automatically being created as Contacts instead of Leads. From a CRM perspective, this doesn’t make
    • Zoho Books | Product updates | September 2025

      Hello users, We’ve rolled out new features and enhancements in Zoho Books. From PayNow payment method to applying journal credits to invoices and bills in other locations, explore the updates designed to enhance your bookkeeping experience. Integrate
    • How to update Multiple Users field in Quote Module from Deal Module

      Scenario : Deal Module having Multiple User Field (Presales Engineer) which having more than 1 User and through Deluge Script I need to get that Users Details and need to put into Multiple User Field (Presales Engineer) of Quote Module. Note: Both Module
    • Auto-sync field of lookup value

      This feature has been requested many times in the discussion Field of Lookup Announcement and this post aims to track it separately. At the moment the value of a 'field of lookup' is a snapshot but once the parent lookup field is updated the values diverge.
    • Next Page