Introduction

Modern software engineering extends far beyond writing application code. Software only becomes valuable when it can be reliably packaged, transferred, executed, and operated in an environment that closely resembles production.

This lab focused on deploying a packaged Spring Boot application to an Amazon EC2 instance running Ubuntu Linux. The deployment process included building an executable JAR with Gradle, securely transferring it to a remote server using SCP over SSH, executing the application with the Java Runtime Environment (JRE), exposing the application through an AWS Security Group, and verifying successful deployment through the EC2 instance's public IP address.

Although intentionally simple, this workflow introduces several core concepts that appear in nearly every modern software delivery pipeline. It demonstrates how application development, cloud infrastructure, operating systems, networking, and security interact to deliver a running service.

Rather than viewing deployment as a single command, engineers treat it as a coordinated process involving multiple interconnected systems.

The Engineering Problem

Writing software is only one stage of software delivery.

A program running successfully on a developer's laptop does not guarantee that it will execute correctly on another machine. Differences in operating systems, installed software, runtime libraries, environment variables, network configuration, permissions, and security policies frequently cause applications to behave differently across environments.

Without a standardized deployment process, organizations face problems such as:

Engineering teams therefore separate application development from application deployment.

Instead of copying source code to production servers, they package applications into deployable artifacts that can be executed consistently across multiple environments.

Software Is Delivered as Artifacts, Not Source Code

Source code is written for humans.

Artifacts are produced for computers.