---
# System prepended metadata

title: Release CI

---

# Release CI

整個產品由 4X 個專案購築而成，由於專案跑 Scrum，所以每隔兩周就會發版一次，由人工處理各專案的發版跟上線到各環境太慢也不穩定，所以開發腳本來自動執行。

## 產品專案類型

* Parent pom(2)
    管理 Maven 專案中，使用的第三方套件版本
    
* Domain package(2X)
    將 Java Service 中，共用的功能和業務獨立成 Package ，託管在 Nexus Server ，讓需要的服務引用，總共 2X 個。
    
* Spring Cloud (10)
    微服務的基礎架構共兩組，各別為官方網站和後台，有以下服務
    * Config Server
    * Eureka
    * API Gateway
    * Admin Server
    * Config Repository

* Java Service(8)
    由 Spring Boot 開發的服務，根據職責拆開成 8 個服務
    
* Nginx(2)
    作為前端的 Web Server 跟 API 的反向代理和負載均衡
    
* Angular
    後台前端專案
* Vue3
    前台前端專案


## 工作順序

一. 發布

依據專案類型使用不同的 docker image 進行下列行為

``` shellscript
bash release.sh
```

1. clone 指定的專案
2. 修改專案中 SNAPSHOT 為 RELEASE 並提交。(目前只有 Java 有用到)
3. 將目前 **master checkout** 為 **release/version** branch (version 為 versions 內定義的值)
4. build & publish 到 nexus server。(例如: jar)
5. 標記 tag
6. publish release branch
7. post release note to gitlab

二. 部屬

``` shellscript
bash deploy.sh
```

1. clone 指定的專案
2. checkout 指定 release branch 中最新的 tag
3. build
4. deploy 到指定的機器上
5. 啟動服務

* 如果 artefacts 已經存在指定專案的版號目錄，則不會重複執行

三. 

依據專案類型使用不同的 docker image 進行下列行為，基本上只有 Maven 專案有使用到

``` shellscript
bash snapshot.sh
```

1. checkout master 
2. 修改專案中 RELEASE 為下一個 SNAPSHOT 版號並提交。(目前只有 Java 有用到)
3. merge master to develop
4. deploy SNAPSHOT jar to nexus server 



