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!


    • Recent Topics

    • Exporting record notes in bulk

      Hi team, Is it possible to bulk export the notes attached to a record? i.e to a CSV file or otherwise. Our use case is exporting all notes for our lead/account/Deal records. We have another system we'd like to import these notes to but I can't seem to
    • Field customization

      Hi Team Good day! I am a commission agent who sell and purchase goods from vendors, while in purchasing invoices I am not able to deduct the expenses such as commission and other expenses on actual amount. Kindly help me to customize the invoice based
    • vendors / customers with 2 different address and gst no

      Why can't we have option for more than one address and depending on the state option for more than 1 GST no. ? We have customers / vendors PAN india with different addresses and GST no. for different states.
    • Error: Invalid Element gst_no, Invalid Element gst_treatment, Invalid Element place_of_contact

      so i am creating a new contact post request and i want add gst infomation when amount is above 50000 and if pass gst info in request body then i get this errors > Error: Invalid Element gst_no, Invalid Element gst_treatment, Invalid Element place_of_contact
    • Add multiple Billing Addresses under one GST number

      My client owns multiple businesses in various locations but they all come under one GST. Is there a way to add multiple billing addresses for the same GST? Managing this by adding multiple Shipping addresses is not an option. The client wants the GST
    • Zoho Mail API - Upload Attachment

      https://www.zoho.com/mail/help/api/post-upload-attachments.html I followed the steps from the API documentation and wrote a backend in JavaScript to send emails. Normal emails are sent without any problems. However, I can’t send emails with attachments.
    • Unable to create custom fields for shipment order

      I'm unable to create custom fields for shipment orders, even though the custom fields are set up correctly. A request to the following endpoint: https://www.zohoapis.com/inventory/v1/settings/preferences/customfields?organization_id=${ZOHO_ORGANIZATION_ID}&entity=shipment_order
    • Kaizen #202 - Answering Your Questions | Testing and Using REST APIs in Widgets

      Hello Developers! Welcome back to a fresh week of Kaizen! Thank you for your active participation in sharing feedback and queries for the 200th milestone. This week, we will look at the following queries related to widget: Widget Testing Using REST API
    • Introducing the 'Send as Email' option on the Zoho Desk iOS mobile app

      Hello everyone! In the latest version(v2.10.2) of the Zoho Desk iOS app, we have brought in support for the 'Send as Email' option while creating a ticket. This feature enables you to reach out to the customers by sending outbound emails. The emails are
    • Zoho Forms Not Loading on Website – DNS Resolution Error

      Dear Zoho Support Team, User ID : 20069458731 We are experiencing an issue with the Zoho Form embedded on our website (https://vitel.com.tr/satis-destek-formu/). The form is not loading, and the following error message appears in the browser: “forms.zohopublic.eu
    • Data backup retention question/

      My zohocrm subscription gives me 2 full data backups per month. I have a scheduled backup configured to run twice a month. I just went to download my backup and i can't find it, it ran about 9 days ago... From what i can tell with google zoho only keeps
    • Basic Apple Watch App

      Sometimes I leave my phone behind. I will get push notifications that tickets are updated etc.. It would be nice to at least view them and do a few basic functions. reassign. public reply. private comment.
    • Look and Feel Uniformity

      Someone needs to go through the mobile app and match the look and feel of the web version. For example, it is global standard to highlight private notes as yellow background hue. Desk does that on web, but not on mobile. Mobile also has an odd blue icon
    • Managing two books in Zoho Books

      is it possible to effectively manage two separate books within Zoho Books? My organization is considering handling accounting for two distinct subsidiaries, and we would like to understand the best way to achieve this within the Zoho Books.
    • Display All Custom Buttons Without Dropdown on Record Page

      In my org's workflow we usually want to do some kind of quick action off of an individual record - i.e. of an individual contact, or individual deal. What we have always found a hindrance is the location of all custom buttons being in the drop down on
    • Zoho Sales Team - Extremely Slow Response Times

      Hi everyone, Has anyone else experienced unusually slow response times from Zoho’s sales team? I sent an email last night, and it’s been nearly 24 hours with no reply. While I understand delays can happen, this seems longer than expected for a sales inquiry.
    • Yodlee Bank Feeds

      I'm well aware of the many bank feed issues out there that haven't been resolved, but I'm looking for information on Rules in relation to bank feeds. U.S based, Bank of America user and prior to Yodlee all of my banking feeds and Rules worked seamlessly.
    • Unable to create custom function

      Unable to create custom function - Please check the screenshot for the details HERE IS THE FUNCTION!! try { // 1. Fetch the details of the approved Bill using its ID billDetails = zoho.books.getRecordById("Bills", organization.get("organization_id"),
    • Need a feature which can validate PAN from Income Tax Portal

      Hello Zoho, We need a feature which can help us validate PAN which is being entered in AR/AP Profiles to check if it is valid and display the name as per Income Tax so as to get rid of incorrect PAN into the systems. Please do the needful Thanks
    • PAN - Aadhar Link Status

      Can Zohobooks also get latest PAN-Aadhar Linking Status from Income Tax Portal ?
    • Canvas translation

      We want to offer our CRM system to our users in English and Dutch. However, it seems that text in our deal Canvas isn't available for translation through the translation file. The same applies to the field tooltips. They don't appear in the translation
    • Are Cadences visible to anyone with Cadence permission?

      When setting up a new Cadence is it possible to restrict its use to a specific user? How can I prevent users from making modifications to existing Cadences?
    • Super Admin Logging in as another User

      How can a Super Admin login as another user. For example, I have a sales rep that is having issues with their Accounts and I want to view their Zoho Account with out having to do a GTM and sharing screens. Moderation Update (8th Aug 2025): We are working
    • Show my cost or profit while creating estimate

      Hi, While creating estimate it becomes very important to know exact profit or purchased price of the products at one side just for our reference so we can decide whether we can offer better disc or not .
    • Issue on Upload API and href image URL

      Here is my Full API Code , URL : URL: https://desk.zoho.com/api/v1/uploads/659563000000193003/content Headers* Authorization: 'Zoho-oauthtoken 1000.ed5ce2836bf5ba9b946f5ec9************88e73ff4883a3e9c58ffeb7870' orgId: 7586***** RESPONSE{ "errorCode":
    • Issue when downloading a Mail Merged Zoho Writer Document as .docx

      Hi, We are using within Zoho CRM mailmerge to create documents. This results in a Zoho Writer document. When we try to download as a Microsoft Docx file we get following error: "Word experienced an error trying to open the file. Try these suggestions.
    • 【Zoho CRM】ケイデンス機能のアップデート

      ユーザーの皆さま、こんにちは。コミュニティチームの中野です。 今回は「Zoho CRM アップデート情報」の中から、ケイデンス機能のアップデートをご紹介します。 ケイデンス機能の2つの強化されたことで、適用と解除のタイミングをより柔軟に管理できるようになり、 よりタイムリーで的確なコミュニケーションが実現できるようになりました。 目次: 1. ケイデンスの再開/最初からのやり直し 2. ケイデンスからのデータ解除タイミングの設定 1. ケイデンスの再開/最初からのやり直し 手動削除、完了、または適用解除条件が満たされた場合など、以前に適用解除されたデータをケイデンスに再適用できるようになりました。
    • Rescheduled US meetups: Zoho Desk user meetups are coming to seven U.S. cities in October and November, 2025

      Hello to our Zoho Desk users in the United States, We're excited to share the revised dates for the upcoming Zoho User Groups happening across the US this summer. Our product experts are heading to seven cities throughout the country, and for the first
    • Anyone get the OpenAI API to work in Zoho Meeting?

      Has anyone been able to get the OpenAI API to work in generating meeting summaries? I have been trying, but I get an error that says "OpenAI key notes request rate exceeded. Please try again later or upgrade your open AI account." I contacted Zoho support
    • Push Notifications Customization

      There is no way to customize the notifications we get. I would like to be able to get notifications based on if they are assigned directly to me, my team, my department, or perhaps tickets that match a specific criteria (a contact or account is a VIP
    • Announcing Early Access to the next generation of Zoho Desk UI

      Customer service is one of the categories where efficiency and quality of service have to run in parallel, and your team's experience with their helpdesk goes a long way ensuring these aspects are uncompromised. Introducing DOT Design for Zoho Desk -
    • Editing the record in report

      I have a use-case as below- User creates a assessment record by filling some fields. User assigns that record to portal user by using Assigned To dropdown (Assigned To is Users field in form with choices as customers). I have set the record owner of form
    • Unified WhatsApp Number Management in Zoho Desk and SalesIQ

      Dear Zoho Desk Support Team, We are currently utilizing both Zoho Desk and Zoho SalesIQ for our customer support operations. While both platforms offer WhatsApp integration, we are facing challenges due to the requirement of separate WhatsApp numbers
    • Can we have Bills of Material Module ?

      Can we have Bills of Material Module ?
    • Main Ticket Page Customization

      We do not love the ticket list page (right after clicking Tickets menu item) would like options to customize it.
    • Communicating with emojis

      On July 17, we celebrate World Emoji Day! We're a bit late 😐 sharing insights about this day. But we just couldn't let it pass without a mention 😊 because emojis have a meaningful connection with customer service 💬 🤝. We do not want to miss out on
    • Agent Collision Missing from Mobile App

      Please add Agent Collision capabilities to the mobile app.
    • Zia Sentiment and Functionality on Mobile

      Please add Zia sentiment and generative responses to the mobile app. It would be nice to see the ticket sentiment and generate a response back to a user using Zia on my iPhone
    • View Account Attachments on iOS

      Please allow us to view account attachments on the mobile iOS app!
    • How do I run a PnL by Sales Person?

      I am trying to run a PnL by sales person but am not seeing the option do so. All I need to know (per salesperson) is revenue, cost of goods, gross profit.
    • Next Page