Close Menu
    DevStackTipsDevStackTips
    • Home
    • News & Updates
      1. Tech & Work
      2. View All

      Error’d: Pickup Sticklers

      September 27, 2025

      From Prompt To Partner: Designing Your Custom AI Assistant

      September 27, 2025

      Microsoft unveils reimagined Marketplace for cloud solutions, AI apps, and more

      September 27, 2025

      Design Dialects: Breaking the Rules, Not the System

      September 27, 2025

      Building personal apps with open source and AI

      September 12, 2025

      What Can We Actually Do With corner-shape?

      September 12, 2025

      Craft, Clarity, and Care: The Story and Work of Mengchu Yao

      September 12, 2025

      Cailabs secures €57M to accelerate growth and industrial scale-up

      September 12, 2025
    • Development
      1. Algorithms & Data Structures
      2. Artificial Intelligence
      3. Back-End Development
      4. Databases
      5. Front-End Development
      6. Libraries & Frameworks
      7. Machine Learning
      8. Security
      9. Software Engineering
      10. Tools & IDEs
      11. Web Design
      12. Web Development
      13. Web Security
      14. Programming Languages
        • PHP
        • JavaScript
      Featured

      Using phpinfo() to Debug Common and Not-so-Common PHP Errors and Warnings

      September 28, 2025
      Recent

      Using phpinfo() to Debug Common and Not-so-Common PHP Errors and Warnings

      September 28, 2025

      Mastering PHP File Uploads: A Guide to php.ini Settings and Code Examples

      September 28, 2025

      The first browser with JavaScript landed 30 years ago

      September 27, 2025
    • Operating Systems
      1. Windows
      2. Linux
      3. macOS
      Featured
      Recent
    • Learning Resources
      • Books
      • Cheatsheets
      • Tutorials & Guides
    Home»News & Updates»CodeSOD: Back Up for a Moment

    CodeSOD: Back Up for a Moment

    July 14, 2025

    James‘s team has a pretty complicated deployment process implemented as a series of bash scripts. The deployment is complicated, the scripts doing the deployment are complicated, and failures mid-deployment are common. That means they need to gracefully roll back, and they way they do that is by making backup copies of the modified files.

    This is how they do that.

    DATE=`<span class="hljs-built_in">date</span> <span class="hljs-string">'+%Y%m%d'</span>`
    BACKUPDIR=`<span class="hljs-built_in">dirname</span> <span class="hljs-variable">${DESTINATION}</span>`/backup
    <span class="hljs-keyword">if</span> [ ! -d <span class="hljs-variable">$BACKUPDIR</span> ]
    <span class="hljs-keyword">then</span>
            <span class="hljs-built_in">echo</span> <span class="hljs-string">"Creating backup directory ..."</span>
            <span class="hljs-built_in">mkdir</span> -p <span class="hljs-variable">$BACKUPDIR</span>
    <span class="hljs-keyword">fi</span>
    FILENAME=`<span class="hljs-built_in">basename</span> <span class="hljs-variable">${DESTINATION}</span>`
    BACKUPFILETYPE=<span class="hljs-variable">${BACKUPDIR}</span>/<span class="hljs-variable">${FILENAME}</span>.<span class="hljs-variable">${DATE}</span>
    BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-1
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-2 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-3 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-4 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-5 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-6 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-7 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-8 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-9 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span>
    <span class="hljs-built_in">cat</span> <<<span class="hljs-string">EOF
    You have already had 9 rates releases in one day.
    
    ${BACKUPFILE} already exists, do it manually !!!
    EOF</span>
    <span class="hljs-built_in">exit</span> 2
    <span class="hljs-keyword">fi</span>
    

    Look, I know that loops in bash can be annoying, but they’re not that annoying.

    This code creates a backup directory (if it doesn’t already exist), and then creates a file name for the file we’re about to backup, in the form OriginalName.Ymd-n.gz. It tests to see if this file exists, and if it does, it increments n by one. It does this until either it finds a file name that doesn’t exist, or it hits 9, at which point it gives you a delightfully passive aggressive message:

    You have already had 9 rates releases in one day.
    ${BACKUPFILE} already exists, do it manually !!!

    Yeah, do it manually. Now, admittedly, I don’t think a lot of folks want to do more than 9 releases in a given day, but there’s no reason why they couldn’t just keep trying until they find a good filename. Or even better, require each release to have an identifier (like the commit or build number or whatever) and then use that for the filenames.

    Of course, just fixing this copy doesn’t address the real WTF, because we laid out the real WTF in the first paragraph: deployment is a series of complicated bash scripts doing complicated steps that can fail all the time. I’ve worked in places like that, and it’s always a nightmare. There are better tools! Our very own Alex has his product, of course, but there are a million ways to get your builds repeatable and reliable that don’t involve BuildMaster but also don’t involve fragile scripts. Please, please use one of those.

    [Advertisement] Plan Your .NET 9 Migration with Confidence
    Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. Download Free Guide Now!

    Source: Read More 

    Facebook Twitter Reddit Email Copy Link
    Previous ArticleCritical Vulnerability in Anthropic’s MCP Exposes Developer Machines to Remote Exploits
    Next Article Equipment Reassignment Checklist (Free Download)

    Related Posts

    News & Updates

    Building personal apps with open source and AI

    September 12, 2025
    News & Updates

    What Can We Actually Do With corner-shape?

    September 12, 2025
    Leave A Reply Cancel Reply

    For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.

    Continue Reading

    Multiple QNAP Vulnerabilities Let Remote Attacker Gains Access to a User Account

    Security

    CVE-2025-21479 and 27038 Actively Exploited, Google Issues Emergency Android Patches

    Development

    CodeSOD: I Am Not 200

    News & Updates

    Upcoming Kotlin language features teased at KotlinConf 2025

    Tech & Work

    Highlights

    Development

    New Win-DDoS Flaws Let Attackers Turn Public Domain Controllers into DDoS Botnet via RPC, LDAP

    August 10, 2025

    A novel attack technique could be weaponized to rope thousands of public domain controllers (DCs)…

    New ‘CitrixBleed 2’ NetScaler flaw let hackers hijack sessions

    June 25, 2025

    Deconstructing the Request Lifecycle in Sitecore Headless (with a JSS + Next.js Deep Dive)

    July 31, 2025

    Apple’s App Store shaken: Court ends ‘Apple tax’ on external purchases

    June 7, 2025
    © DevStackTips 2025. All rights reserved.
    • Contact
    • Privacy Policy

    Type above and press Enter to search. Press Esc to cancel.