playdata/daily

16주차 : Day 1 (10/21)

soojin1 2024. 10. 21. 22:31

Jenkins

 

Jenkins는 소프트웨어 개발 시 CI/CD(Continuous Integration/Continuous Delivery) 파이프라인을 자동화하는 오픈 소스 도구입니다. 주로 개발자가 코드를 커밋할 때마다 자동으로 빌드하고 테스트하며, 배포 작업까지 관리해주는 역할을 합니다. Jenkins는 다양한 플러그인을 통해 빌드, 테스트, 배포 환경을 쉽게 확장할 수 있으며, 코드 변경 사항을 지속적으로 통합하고 이를 빠르게 배포하는 데 중요한 역할을 합니다.

 

$ wget https://get.jenkins.io/war-stable/2.462.3/jenkins.war
$ java -jar jenkins.war --httpPort=8765

 

- localhost:8765 접속

- 초기 로그인 정보 설정

 

- id : admin

- pw : 0000

 

To Do

1 접속 및 ec2 java 설치
2 scp 로 jar, start.sh, stop.sh 복사
3 ssh ec2 접속하여 start & stop 테스트
4 jenkins 에서 jar 생성 및 jar, start & stop.sh 복사
5 jenkins 에서 원격 ec2 stop.sh start.sh 테스트

 

1단계

$ sudo apt install openjdk-17-jre-headless

 

2단계

-start.sh

#!/bin/bash

# Start the application
nohup java \
    -jar build/libs/greeting-0.1.0-SNAPSHOT.jar &

echo "> Application started with PID $!"

 

-stop.sh

#!/bin/bash

JAR_FILE_NAME=greeting-0.1.0-SNAPSHOT.jar

# Get the PID from the file
PID=$(pgrep -f $JAR_FILE_NAME)

if [ -z "$PID" ]; then
    echo "> 현재구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
    echo "> kill -9 $PID"
    kill -9 $PID
    echo "> 실행중인 애플리케이션을 종료하고 있습니다..."
    sleep 10
fi
$ scp -i ~/key/samdulko.pem build/libs/greeting-0.0.1-SNAPSHOT.jar ubuntu@3.34.199.0:/home/ub
untu/app/
$ scp -i ~/key/samdulko.pem start.sh ubuntu@3.34.199.0:/home/ubuntu/app/
$ scp -i ~/key/samdulko.pem stop.sh ubuntu@3.34.199.0:/home/ubuntu/app/

 

3단계

$ ./start.sh
$ ./stop.sh

 

4단계, 5단계


도커로 실행해보기

 

-Dockerfile

FROM openjdk:17-jdk-alpine

ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

 

-start.sh 수정

SERVER_NAME=greeting
SERVER_VER=0.1.1
DOCKER_ID=sooj1n

# 도커 컨테이너가 실행중인지 확인
if [ $(docker ps -q -f name=$SERVER_NAME) ]; then

  # 실행 중인 컨테이너가 있을 경우, 컨테이너 종료
  # 도커 컨테이너 삭제
  echo "기존 도커 컨테이너의 실행을 종료합니다."
  echo "기존 도커 컨테이너를 삭제합니다."
  docker stop $SERVER_NAME; docker rm $SERVER_NAME

  # 도커 이미지 삭제
  echo "기존 도커 이미지를 삭제합니다."
  docker rmi $DOCKER_ID/$SERVER_NAME:$SERVER_VER
fi

# 도커 이미지 빌드
echo "새로운 도커 이미지를 빌드 합니다."
docker build -t $DOCKER_ID/$SERVER_NAME:$SERVER_VER .

# 도커 컨테이너 실행
echo "새로운 도커 컨테이너를 실행합니다."
docker run -d -p 7070:8080 --name $SERVER_NAME $DOCKER_ID/$SERVER_NAME:$SERVER_VER

# 정상적으로 컨테이너가 동작을 하는지 검사
echo "도커 컨테이너의 상태를 검사합니다."
if [ $(docker inspect -f '{{.State.Running}}' $SERVER_NAME) = "true" ]; then
  echo "컨테이너가 성공적으로 실행 중입니다."
else
  echo "컨테이너 실행에 실패했습니다."
fi

 

$ ./gradlew clean bootJar

$ sudo docker build \
> --build-arg JAR_FILE=build/libs/\*.jar \
> -t sooj1n/greeting:0.1.0 .

$ sudo docker run --name g011 \
-p 8010:8080 \
-d sooj1n/greeting:0.1.0

$ docker push sooj1n/greeting:0.1.0

 

- sudo 없이 도커 실행

$ sudo usermod -aG docker $(whoami)
$ newgrp docker

 


rest

https://github.com/sooj1n/rest

 

GitHub - sooj1n/rest

Contribute to sooj1n/rest development by creating an account on GitHub.

github.com

$ mkdir ~/app/jsonserv
$ cd ~/app/jsonserv
$ npm install json-server

$ vi data.json
{
  "person": [
    {"id":1,"firstName":"John","lastName":"Doe"},
    {"id":2,"firstName":"Jane","lastName":"Smith"},
    {"id":3,"firstName":"Michael","lastName":"Johnson"},
    {"id":4,"firstName":"Emily","lastName":"Brown"},
    {"id":5,"firstName":"David","lastName":"Lee"},
    {"id":6,"firstName":"Olivia","lastName":"Taylor"},
    {"id":7,"firstName":"Daniel","lastName":"Wilson"},
    {"id":8,"firstName":"Sophia","lastName":"Anderson"},
    {"id":9,"firstName":"Matthew","lastName":"White"},
    {"id":10,"firstName":"Ava","lastName":"Martinez"}
  ]
}

$ npx json-server data.json

 

-GET / POST / PUT / FETCH

$ curl -X GET http://localhost:3000/person
[
  {
    "id": "1",
    "firstName": "John",
    "lastName": "Doe"
  },
  {
    "id": "2",
    "firstName": "Jane",
    "lastName": "Smith"
  },
  .
  .
  .
  .
 
# 데이터 삭제
$ curl -X DELETE http://localhost:3000/person/1
{
  "id": "1",
  "firstName": "John",
  "lastName": "Doe"
}%

# 결과
$ curl -X GET http://localhost:3000/person/1
Not Found%

# 데이터 추가
$ curl -X POST -d '{"firstName" : "M", "lastName":"GG"}' http://localhost:3000/person
{
  "id": "281f",
  "firstName": "M",
  "lastName": "GG"
}%

# 데이터 업데이트
$ curl -X PUT -d '{"firstName" : "UPDATE M", "lastName"
:"UP GG"}' http://localhost:3000/person/281f
{
  "firstName": "UPDATE M",
  "lastName": "UP GG",
  "id": "281f"
}%

# 결과
$  curl -X GET http://localhost:3000/person/281f
{
  "firstName": "UPDATE M",
  "lastName": "UP GG",
  "id": "281f"
}%


$ curl -X FETCH  ~~~~

 

새 프로젝트 생성

 

-Person.java

package shop.samdul.rest;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Person {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private long id;
    private String firstName;
    private String lastName;
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

-PersonRepository.java

package shop.samdul.rest;

public class PersonRepository {
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
@RepositoryRestResource(collectionResourceRel = "people", path="people")
public interface PersonRepository extends
        PagingAndSortingRepository<Person, Long>, CrudRepository<Person, Long> {
}

 

# INSERT
$ curl -X POST -H "Content-Type:application/json" \
-d '{"firstName": "Frodo", "lastName": "Baggins"}' \
http://localhost:8080/people

# SELECT
$ curl -X GET http://localhost:8080/people/1

# DELETE
$ curl -X DELETE http://localhost:8080/people/1

# UPDATE
$ curl -X PUT -H "Content-Type:application/json" \
-d '{"firstName": "P Frodo", "lastName": "P Baggins"}' \
http://localhost:8080/people/2

$ curl -X PATCH -H "Content-Type:application/json" \
-d '{"firstName": "PATCH Frodo"}' \
http://localhost:8080/people/2

'playdata > daily' 카테고리의 다른 글

12주차 : Day 5 (9/27)  (1) 2024.09.30
12주차 : Day 4 (9/26)  (0) 2024.09.30
12주차 : Day 3 (9/25)  (1) 2024.09.30
12주차 : Day 2 (9/24)  (0) 2024.09.30
12주차 : Day 1 (9/23)  (2) 2024.09.24