Skip to main content

Command Palette

Search for a command to run...

java-docker-cicd

Published
2 min readView as Markdown
A

AWS Cloud & DevOps Engineer | Cloud Computing | Linux | Terraform & CloudFormation | AWS (EC2, S3, Lambda, API Gateway, DynamoDB, IAM) | Docker | Jenkins | CI/CD Pipelines | MySQL | Java | Jira | Postman | Git/GitHub

Project structure -

root@AmayJaiswal:~/java-bitbucket-cicd# cat ec2_key_base64.txt

LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBc25FMkd0NlNPaUZMdG9KTlRLQWNNRmYvdmU5S2huWUFDL0wrRi9ocnJoSjVEOUN2Ck81RXVkak96OVJXcjRvSmhXdGNGWXBjRnNPMXQyeTlobzlocGtydVBkUFcyK3lLbjRJMSsxRFpjblM1L0Fzcm4KTWtJQW5yWTNZVzJhS2dINlhacUgvWUE3T2N5MVhQV21pOHFiMWZsQ2ZuaTl6eUhsK2tldExacG5PU3lXVUtyawphbmJBNndkcjVDeXBTd20ybmxVVTFGR2hiUzdPejJGeE5GYzM0bGhTMkMvMnBiMTBVY3dQT0RaenE2M3JwaTBHCjVRNkY2WGV1ekNVV0xnLzk2Y1J2Wk9SRkxhaklHRjhVZE9lNHFITGdFRkpuM3NTWE83WDY4V0x3SlMrcTFYdXgKdEZmSzZ3L09QN3lWNEpDSVV1YnkzV0xMUUM2akpNTGRxZnhQclFJREFRQUJBb0lCQUMwVXR2T1EyV2FBTk8yVgorOHRwQTlZZTFVaDU1TjBWZ0t1RUp6ZU5Gajh6QVl6Q1R4TUFlYmw1RkhUTmxkQXkyaitsNVFGa1lCYXoxVFl6CndUb3dtWE50bVMrV1NEVW9LenRxNCtqZkZ3VEswMkcwT3phU1FDL1lueU1wR25LVWIxa29pa1M4R2JwZmdrNUsKN1ZtUnhVOEltd2p5bmhsdldmZWlGaGxZVWMyNmp0RDJOWHVjTkk0a054a2VpaS9Qdm5wQ0JReEpmUExIN3BmUwpQV0R2NVIrc0N6emxmOCs3MEJKUUExL2E2WWtsRDVRbVQ4dHpnUVNCUFdkaEx3dWFPcFdGUy8rK3Fic3FNamY3CkhEaGwxY2h0c2NTQkRCUUx6cnFNZlBuc0gxbXpOQng5N2hWczhQcVRmdTdzRHgybHl3ZUk1QURjTjZTYktYYXYKdUF4ME93RUNnWUVBNGhlbjNuUEZkQU9BSUFGdXJzZ3BCYzd5cUhoQ08wWDhpQ3h6cjlxQlZRU0NhZGc5NC9VbApoKzBWN0V1YXVzMnF2by9jVDVvS1l1K0N5enhjUExZMlZGOFlablNwdG5yK21UY1JjS3JMY0xjMHd4QW9FWjJVCnd2VTRNTm13VFJWL2RHYkZZOWdEQTlDeHVoVk9jNDg4OWpqTlFvVk5lQW8vVXMza0RHZTQxMjBDZ1lFQXlndncKd1pCUFRTVjh1M3U5MmFKWDZXSnk1cGhxSEFLSjJHM1IrNStjTHByV1dDK2lON2VTajZyY0xWajFzQjF4Vkc4ZApIdnV0WjR5UGtjNU5nUzlZamNxdmVZK2hCOHdCK0F6T3VndnFMcVNUY1k3Tmd0aEgzRGVaTGZRZWFxRHhXeGpTClQ5bUlQbDNwbVAyM0NScW50KzZIeUplSTdMZXhWNVBwRm81QThVRUNnWUVBaERjYk53NXl1SzVYWGVBWWp1T0UKZ2Q0TXI1SnNBT2VqanlxWG1JM3FOZ0tHRlVtY245TTdXR3EvK0VnYU93V014Uld4MjJjVWpkak1udmMwWlZpVgpHdS9sZi96WFJseFV5TnFZTzAvVjJwdDRvbDJ2WU9YTEdkdDNPYklEMUlBdTRhNDczbkJ6Q3VjZkY5ZmY0ZG93CjV6ZythSmsxdlc0WXE5NjFicisxSzEwQ2dZRUFqUEx0ZnFzRWwyWDZjUFF2Q2g4MXd1dGFDc0h5N0IxZE9tM0sKV2dZTHQzdHU0bEJBa3l2dUEybUhkZDhrYmpycjc2SWdKNWdkYlNwaWthM2c1YWs0MXBtNTlreWJZc3dQNTVKUAp1UHhNMzBNU1ZOcnhSVUZLU0RkRkZnakNHMUt4YlFLUTNRRjlDVDBNbEIwU3pqZ1pIcmc1WTFkTFB4QWFtR1RuCjYwTkx6TUVDZ1lFQXkybW9tOFB3NkRMT1V0ZHRTV0hsdW0xUkNpakpDODlELzBuamtHb3FkNnUrU3phTE82MDAKQUFzcU9GeVdobXNjdHZVSnVLaVhxNEErN1JMZTJsQWlaSWxvRTEzMWN2cnVjblVyU093eHdmaW85WlIwalRHUwpuU2Z2SnJsSDFaQktYTDJpMGRzanV4dSt6UWcvQXU5UFg5TXczS2FFeG5UMXJHcjdEckpZUUlBPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQ==

Bitbucket Repo to clone - git clone https://heyamay-admin@bitbucket.org/heyamay/java-docker-cicd.git

bitbucket-pipelines.yml

image: docker:19.03.12

pipelines:
  default:
    - step:
        name: Build & Deploy to EC2
        services:
          - docker
        caches:
          - docker
        script:
          - mkdir -p ~/.ssh
          - echo $EC2_SSH_KEY | base64 -d > ~/.ssh/ec2_key
          - chmod 600 ~/.ssh/ec2_key
          - ssh-keyscan -H $EC2_HOST >> ~/.ssh/known_hosts

          - echo $DOCKERHUB_TOKEN | docker login -u $DOCKERHUB_USERNAME --password-stdin
          - docker build -t $DOCKERHUB_USERNAME/java-bitbucket-cicd .
          - docker push $DOCKERHUB_USERNAME/java-bitbucket-cicd

          - ssh -i ~/.ssh/ec2_key  $EC2_USER@$EC2_HOST << EOF
              docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_TOKEN
              docker pull $DOCKERHUB_USERNAME/java-bitbucket-cicd
              docker stop java-app || true && docker rm java-app || true
              docker run -d --name java-app -p 80:8080 $DOCKERHUB_USERNAME/java-bitbucket-cicd
            EOF

src/App.java

import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import java.io.OutputStream;

public class App {
    public static void main(String[] args) throws Exception {
        HttpServer server = HttpServer.create(new java.net.InetSocketAddress(8080), 0);
        server.createContext("/", new MyHandler());
        server.setExecutor(null);
        server.start();
        System.out.println("Server started on port 8080");
    }

    static class MyHandler implements HttpHandler {
        public void handle(HttpExchange t) throws java.io.IOException {
            String response = "🚀 Hello from Java Bitbucket CI/CD Pipeline!";
            t.sendResponseHeaders(200, response.length());
            OutputStream os = t.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }
}

.dockerignore

*.class
*.log
target/
*.pem
ec2_key_base64.txt

Dockerfile

# Step 1: Use base image
FROM openjdk:17-slim

# Step 2: Set working directory
WORKDIR /app

# Step 3: Copy source code
COPY src/ /app/src/

# Step 4: Compile Java code
RUN javac src/App.java

# Step 5: Run the compiled app
CMD ["java", "src.App"]

.gitignore

# These are some examples of commonly ignored file patterns.
# You should customize this list as applicable to your project.
# Learn more about .gitignore:
#     https://www.atlassian.com/git/tutorials/saving-changes/gitignore

# Node artifact files
node_modules/
dist/

# Compiled Java class files
*.class

# Compiled Python bytecode
*.py[cod]

# Log files
*.log

# Package files
*.jar

# Maven
target/
dist/

# JetBrains IDE
.idea/

# Unit test reports
TEST*.xml

# Generated by MacOS
.DS_Store

# Generated by Windows
Thumbs.db

# Applications
*.app
*.exe
*.war

# Large media files
*.mp4
*.tiff
*.avi
*.flv
*.mov
*.wmv

*.pem
ec2_key_base64.txt