pipeline {
    agent any
    
    stages {
        stage('Clone') {
            steps{
                git branch: '{변경 감지 할 브랜치}', credentialsId: '{credential 아이디}', url: '{web-hook 보내는 git 리포지토리 주소 ex) ~~.git}'           
                sh "sed -i 's/{docker-compose.yml에서 암호화된 JASYPT_KEY}/{암호화 전 키}/g' docker-compose.yml"
                sh "cat docker-compose.yml"
            }
            
        }
        stage('Build'){
            steps{
                dir('backend/farmyo') {
                    sh "chmod +x gradlew"
                    sh "./gradlew clean build"
                }
            }
            
        }
        stage('Deploy') {
            steps{
                // 이전에 실행된 컨테이너를 중지하고 삭제합니다.
                sh "docker stop farmyo-backend || true"
                sh "docker rm farmyo-backend || true"
            
                sh "docker stop farmyo-frontend || true"
                sh "docker rm farmyo-frontend || true"
            
                // 이전에 빌드된 이미지를 삭제합니다.
                sh "docker rmi farmyo_pipeline-farmyo-frontend || true"
                sh "docker rmi farmyo_pipeline-farmyo-backend || true"
                
                sh "docker ps -a || true"
                sh "docker images || true"
                
                sh "docker compose build --no-cache"
                sh "docker compose up -d"
            }
        }
    }
    post {
        success {
            script {
                def Author_ID = sh(script: "git show -s --pretty=%an", returnStdout: true).trim()
                def Author_Name = sh(script: "git show -s --pretty=%ae", returnStdout: true).trim()
                mattermostSend (color: 'good', 
                message: "빌드 성공 ^_^ v : ${env.JOB_NAME} #${env.BUILD_NUMBER} by ${Author_ID}(${Author_Name})\\n(<${env.BUILD_URL}|Details>)", 
                endpoint: '{deploy 알림을 받을 Mattermost 채널 주소}', 
                channel: '{알림 받을 채널 명}'
                )
            }
        }
        failure {
            script {
                def Author_ID = sh(script: "git show -s --pretty=%an", returnStdout: true).trim()
                def Author_Name = sh(script: "git show -s --pretty=%ae", returnStdout: true).trim()
                mattermostSend (color: 'danger', 
                message: "빌드 실패 ㅜ_ㅜ : ${env.JOB_NAME} #${env.BUILD_NUMBER} by ${Author_ID}(${Author_Name})\\n(<${env.BUILD_URL}|Details>)", 
                endpoint: '{deploy 알림을 받을 Mattermost 채널 주소}', 
                channel: '{알림 받을 채널 명}'
                )
            }
        }
    }
}
version: '3.8'                      
services:                           
  farmyo-frontend:                         
    container_name: farmyo-frontend      
    build:                          
      context: ./frontend/farmyo          
      dockerfile: Dockerfile        
    ports:                          
      - "80:80"                     
      - "443:443"
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
      - /var/lib/letsencrypt:/var/lib/letsencrypt
      - /home/ubuntu/conf:/etc/nginx/conf.d
    networks:
      - farmyo_network

  farmyo-backend:
    container_name: farmyo-backend
    build:
      context: ./backend/farmyo
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:                    
      JASYPT_KEY: {암호화 된 JASYPT_KEY}
    networks:
      - farmyo_network

networks:
  farmyo_network:
    driver: bridge
FROM node:lts-alpine as build-stage
WORKDIR /homepage
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

FROM nginx:stable-alpine as production-stage
COPY --from=build-stage ./homepage/build /usr/share/nginx/html/
CMD ["nginx", "-g", "daemon off;"]