---
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檔案 |
## 關掉排程

> 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

等它一下,接下來會在最後面出現這些資訊,裡面最重的就是有告訴你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] ------------------------------------------------------------------------
```

3. 我們要做的事情很簡單,就是把jar檔放入遠端主機的排程當中,為此我們需要cmder的協助
首先先連線,使用ssh的方式連線
他會要你輸入帳號密碼,輸入就對了
```
ssh mike@192.168.0.228
```

下面的事情可以在winscp當中做完,就不需要下達linux指令
將allie-google-optimize-performance-observe-1.0.0.jar 複製到對應的資料夾
把**GoogleDriveTokens** && **GoogleSheetsTokens** 此2個資料夾必須於local環境手動產生再copy至server端,原因是google oauth認證階段的callback 路徑因為是指定localhost 因此無法正常完成認證的步驟,因此先在local環境先行認證產生出該資料夾內所需的檔案後再手動上傳至server端即可(一次性設定)。

至此在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吧

## 部署切換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
```