---
# System prepended metadata

title: '部署本機端檔案到server '
tags: [system]

---

---
title: '部署本機端檔案到server '
disqus: hackmd
---
###### tags: `system` 
部署本機端檔案到server
===

[TOC]

## linux排程

crontab guru

https://crontab.guru/


## 筆記目的

了解如何部署本機端開發的應用程式到linux主機上

[何謂CICD](https://ithelp.ithome.com.tw/articles/10219083)

## 先備條件
先去下載這兩個工具

[winscp](https://winscp.net/eng/download.php)
[cmder](https://cmder.net/)不需要安裝

winscp 的目的在於幫你比較容易地去複製本機端檔案到遠端的server，或是檢視server端的檔案，把他想成一種檔案管理工具

cmder 讓你在windows環境下，可以簡易的去操作linux指令

## 總結步驟
1. 把必要的jar,token放到主機對應的folder裡面
2. 在主機的folder下 write sh
3. 該 sh 要能記錄 execution time,裡面也要有run jar 檔案的設定 service那些設定
4. 在cmder裡面可以用`crontab -e`來編輯排程方式，何時去run sh檔案 

## 會用到的指令

| 指令                 | 功能                  |
| -------------------- | --------------------- |
| `crontab -l`         | 查看排程              |
| `crontab -e`         | 編輯排程              |
| clear                | clear page            |
| `ps -ef \| grep jar` | 查看正在運行的jar檔案 |

## 關掉排程

![](https://i.imgur.com/5hCIKO4.png)

> sudo kill -9 45319(替換成第二欄編號)

## 如何馬上runrun看

1. 先 crontab -l
2. 之後複製看看 有sh 的那行指令

## 重要的步驟和概念

1. 要在Eclipse當中要先push最新專案到遠端的remote當中[如何使用可以看這篇](https://dotblogs.com.tw/CYLcode/2019/01/08/111851)
2. 對專案點右鍵，run as => Maven build...  Goal=package

![](https://i.imgur.com/fiqkW66.png)

等它一下，接下來會在最後面出現這些資訊，裡面最重的就是有告訴你build好的jar檔案路徑放在哪裡

``` java=
[INFO] Building jar: C:\Users\TDG_USER\git\allie-google-optimize-performance-observe\target\allie-google-optimize-performance-observe-1.0.0.jar
[INFO] 
[INFO] --- spring-boot-maven-plugin:2.5.3:repackage (repackage) @ allie-google-optimize-performance-observe ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  24.461 s
[INFO] Finished at: 2021-08-30T14:50:39+08:00
[INFO] ------------------------------------------------------------------------
```

![](https://i.imgur.com/LAoMHs9.png)

3. 我們要做的事情很簡單，就是把jar檔放入遠端主機的排程當中，為此我們需要cmder的協助

首先先連線，使用ssh的方式連線
他會要你輸入帳號密碼，輸入就對了
```
ssh mike@192.168.0.228
```

![](https://i.imgur.com/xJji2Ar.png)



下面的事情可以在winscp當中做完，就不需要下達linux指令
將allie-google-optimize-performance-observe-1.0.0.jar 複製到對應的資料夾

把**GoogleDriveTokens** && **GoogleSheetsTokens** 此2個資料夾必須於local環境手動產生再copy至server端,原因是google oauth認證階段的callback 路徑因為是指定localhost 因此無法正常完成認證的步驟,因此先在local環境先行認證產生出該資料夾內所需的檔案後再手動上傳至server端即可(一次性設定)。

![](https://i.imgur.com/1iCGgsE.png)

至此在server端，你已經有了所有需要的東西，一個jar檔案

接著就是想辦法去寫排程

排程的作業大概分成兩塊

4-1. 寫一個sh檔案，可以用記事本編輯，然後儲存成**sh檔案**內容為以下內容，這個檔案會先移動到放入jar檔的資料夾，之後紀錄啟動時間，最後編寫**如何運行**jar檔的參數

```bash
cd /Users/mike/AllieGoogleOptimizePerformanceObserve_Gap
date >> /Users/mike/AllieGoogleOptimizePerformanceObserve_Gap/execution.txt
echo 'run service' >> /Users/mike/AllieGoogleOptimizePerformanceObserve_Gap/execution.txt
java -jar -Dspring.profiles.active=prod -Dservice.properties.source=gap /Users/mike/AllieGoogleOptimizePerformanceObserve_Gap/allie-google-optimize-performance-observe-1.0.0.jar --SERVICE=AI_CAMPAIGN_UPDATE_SPREADSHEET_SERVICE

exit 0;
```

4-2. 在cmder的介面當中，下達如何排程的指令，何時，比如說幾小時，這裡我下達的指令會運行第一個步驟製造的sh檔案，並且告訴你**何時**運行該sh檔案

使用`crontab -e`便可以編輯它，之後要按鍵盤上的**insert按鍵才能真正的編輯**，想要離開或是**存檔**的時候就使用 `esc :wq`這樣就可以離開 write and quite

```bash=
#-------Backup crontab----------
29 * * * * crontab -l > /Users/mike/Crontab_Backup/crontab_setting_228.txt
#--------------------------------AI Support System-----------------------------------------
55 0-23/2 * * * sh /Users/mike/AllieGoogleOptimizePerformanceObserve/execute_allie-google-optimize-performance-observe-admin.sh
45 0-23/2 * * * sh /Users/mike/AllieGoogleOptimizePerformanceObserve_Gap/execute_allie-google-optimize-performance-observe-gap.sh
```

## 部署完成後

請記得一定要run run看，不是部署完了之後，人就跑了!要注意的事情是run的時候，要確保主機沒有剛好在排程的時候run

```shell
sh /Users/mike/AllieGoogleOptimizePerformanceObserve/execute_allie-google-optimize-performance-observe-admin.sh
```

> sh +檔案路徑
> 這樣就會直接執行我們編輯好的sh檔案


## 要注意的地方

兩個資料夾的sh不能一樣，因為一個是給gap看的，一個是給老師看的，sh裡面有不同的設定

## 一定要進去到最裡面才能去下指令測試

```
APOCde-Mac-mini:Google-Account-Budget-contract-Annual-Consumption-Statistics mike$ pwd
/Users/mike/Google-Account-Budget-contract-Annual-Consumption-Statistics
```

> 善用pwd指令來去看現在的目錄在哪裡，另外善用winscp的重新整理，確認目前資料夾的狀況

## 可能會有的bug

[No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?](https://blog.csdn.net/hjwang1/article/details/50085839)

解法很簡單 把運行環境改成jdk，這個錯誤的原因是因為預設我們在jre環境運行，但是打包的時候需要變成jdk，所以就一勞永逸的把它換成jdk吧

![](https://i.imgur.com/BANYSG4.png)


## 部署切換log4j的紀錄檔案路徑

```java=
#-----------------YahooGeminiSystem-----------------------------
50 02,08,14,17 * * * java -Dlogging.config=classpath:log4j2_AdvertiserInfo_AccountService.properties -jar /home/mike/YahooAdsAPICenter/YahooAdsApiClientLibraryCenterApplication.jar AdvertiserInfo_AccountService ALLCID
50 03,09,15,18 * * * java -Dlogging.config=classpath:log4j2_AdvertiserInfo_CampaignService.properties -jar /home/mike/YahooAdsAPICenter/YahooAdsApiClientLibraryCenterApplication.jar AdvertiserInfo_CampaignService ALLCID
00 06,15 * * * java -Dlogging.config=classpath:log4j2_Performance_Daily_AccountService.properties -jar /home/mike/YahooAdsAPICenter/YahooAdsApiClientLibraryCenterApplication.jar Performance_Daily_AccountService ALLCID
10 06,15 * * * java -Dlogging.config=classpath:log4j2_Performance_Daily_CampaignService.properties -jar /home/mike/YahooAdsAPICenter/YahooAdsApiClientLibraryCenterApplication.jar Performance_Daily_CampaignService ALLCID
20 06,15 * * * java -Dlogging.config=classpath:log4j2_Performance_Daily_AdGroupService.properties -jar /home/mike/YahooAdsAPICenter/YahooAdsApiClientLibraryCenterApplication.jar Performance_Daily_AdGroupService ALLCID
30 06 * * * java -Dlogging.config=classpath:log4j2_Performance_Daily_AdService.properties -jar /home/mike/YahooAdsAPICenter/YahooAdsApiClientLibraryCenterApplication.jar Performance_Daily_AdService ALLCID
30 07,16 * * * java -Dlogging.config=classpath:log4j2_ConversionRule_Daily_AccountService.properties -jar /home/mike/YahooAdsAPICenter/YahooAdsApiClientLibraryCenterApplication.jar ConversionRule_Daily_AccountService ALLCID
30 04 * * * java -Dlogging.config=classpath:log4j2_AdvertiserInfo_AdgroupService.properties -jar /home/mike/YahooAdsAPICenter/YahooAdsApiClientLibraryCenterApplication.jar AdvertiserInfo_AdgroupService ALLCID
20 03 * * * java -Dlogging.config=classpath:log4j2_AdvertiserInfo_AdService.properties -jar /home/mike/YahooAdsAPICenter/YahooAdsApiClientLibraryCenterApplication.jar AdvertiserInfo_AdService ALLCID
45 07 * * * java -Dlogging.config=classpath:log4j2_ConversionRule_Daily_AdgroupService.properties -jar /home/mike/YahooAdsAPICenter/YahooAdsApiClientLibraryCenterApplication.jar ConversionRule_Daily_AdgroupService ALLCID
```

log4j2.properties

```
name=PropertiesConfig
property.filename=logs
appenders=console, rolling

# rootLogger
rootLogger.level=info
rootLogger.appenderRef.stdout.ref=Stdout
rootLogger.appenderRef.rolling.ref=InfoRollingFile

# console
appender.console.type=Console
appender.console.name=Stdout
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%40.40c{1.}:%3L] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}

# rolling file
appender.rolling.type=RollingFile
appender.rolling.name=InfoRollingFile

#
spring.http.log-request-details=false

#Local
#appender.rolling.fileName=D://Local Develop Systems//GoogleAdsAPICenter//logs//GoogleAdsApiClientLibraryCenterApplication.log
#appender.rolling.filePattern=D://Local Develop Systems//GoogleAdsAPICenter//logs//GoogleAdsApiClientLibraryCenterApplication_%d{yyyy-MM-dd}_%i.log

#Production
appender.rolling.fileName=/home/mike/YahooAdsAPICenter/logs/YahooAdsApiClientLibraryCenterApplication.log
appender.rolling.filePattern=/home/mike/YahooAdsAPICenter/logs/YahooAdsApiClientLibraryCenterApplication_%d{yyyy-MM-dd}_%i.log


appender.rolling.layout.type=PatternLayout
appender.rolling.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%40.40c{1.}:%3L] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}
appender.rolling.policies.type=Policies
appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval=1
appender.rolling.policies.time.modulate=true
appender.rolling.policies.size.type=SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=60M
appender.rolling.strategy.type=DefaultRolloverStrategy
appender.rolling.strategy.max=100
```


log4j2_ConversionRule_Daily_AdgroupService.properties

```java=
name=PropertiesConfig
property.filename=logs
appenders=console, rolling

# rootLogger
rootLogger.level=info
rootLogger.appenderRef.stdout.ref=Stdout
rootLogger.appenderRef.rolling.ref=InfoRollingFile

# console
appender.console.type=Console
appender.console.name=Stdout
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%40.40c{1.}:%3L] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}

# rolling file
appender.rolling.type=RollingFile
appender.rolling.name=InfoRollingFile

#
spring.http.log-request-details=false


#Production
appender.rolling.fileName=/home/mike/YahooAdsAPICenter/logs/ConversionRule_Daily_AdgroupService.log
appender.rolling.filePattern=/home/mike/YahooAdsAPICenter/logs/ConversionRule_Daily_AdgroupService_%d{yyyy-MM-dd}_%i.log


appender.rolling.layout.type=PatternLayout
appender.rolling.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%40.40c{1.}:%3L] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}
appender.rolling.policies.type=Policies
appender.rolling.policies.time.type=TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval=1
appender.rolling.policies.time.modulate=true
appender.rolling.policies.size.type=SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=60M
appender.rolling.strategy.type=DefaultRolloverStrategy
appender.rolling.strategy.max=100
```







