[Java][Spring Cloud]DevOps

閱讀時間約 12 分鐘

這篇的DevOps發佈系統是以Spring Cloud微服務(微服務)為背景;由GitLab、Harbor與Kubernetes組成。


環境建置


建立專案

spring:
application:
name: xxx
profiles:
active: debug
cloud:
consul:
discovery:
preferIpAddress: true
instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}:@project.version@
healthCheckPath: /actuator/health
server:
port: xxx​


  • 在pom.xml增加Maven設定
  • 建立Spring Cloud微服務main,如下範例:
package xxx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class DevopsDemoApplication {
public static void main(String[] args) {
SpringApplication.run(DevopsDemoApplication.class, args);
}
}


打包設定

  • 於pom.xml設定打包Docker image
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--指定Dockerfile檔案位置-->
<dockerfile>docker/Dockerfile</dockerfile>
<repository>${docker.repository}/springcloud-action/${app.name}</repository>
<!--<tag>${project.version}</tag>-->
<buildArgs>
<!--傳遞參數給Dockerfile-->
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>


  • 建立Dockerfile
FROM openjdk:8u191-jre-alpine3.9
ENTRYPOINT ["/usr/bin/java", "-jar", "/app.jar"]
ARG JAR_FILE
ADD ${JAR_FILE} /app.jar
EXPOSE 8080


  • 於pom.xml設定存放Docker image
<properties>
<docker.repository>xxx​</docker.repository>
<app.name>devops-demo</app.name>
</properties>


部署設定

  • 在GitLab CI/CD server安裝kubectl
snap install kubectl -classic


  • 將Kubernetes Master設定檔複製到GitLab CI/CD server
scp root@網址:$HOME/.kube/config​ $HOME/.kube​


  • 建立檔案deploy.yaml,用於發佈
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: __APP_NAME__
spec:
replicas: __REPLICAS__
selector:
matchLabels:
app: __APP_NAME__
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: __APP_NAME__
spec:
imagePullSecrets:
- name: xxx
containers:
- name: __APP_NAME__
image: __IMAGE__
resources:
requests:
memory: "1000M"
limits:
memory: "1000M"
volumeMounts:
- name: time-zone
mountPath: /etc/localtime
- name: java-logs
mountPath: /opt/logs
ports:
- containerPort: __PORT__
env:
- name: SPRING_PROFILES_ACTIVE
value: __PROFILE__
- name: JAVA_OPTS
value: -Xms1G -Xmx1G -Dapp.home=/opt/
volumes:
- name: time-zone
hostPath:
path: /etc/localtime
- name: java-logs
hostPath:
path: /data/app/deployment/logs


  • 建立.gitlab-ci.yml,設定流程
#環境資訊
variables:
#Docker image倉庫地址和帳號密碼訊息
DOCKER_REPO_URL: "xxx"
DOCKER_REPO_USERNAME: admin
DOCKER_REPO_PASSWORD: admin
#Kubernetes配置
K8S_NAMESPACE: "xxx"
PORT: "xxx"

#定義CI/CD
stages:
- test
- build
- push
- deploy

#執行單元測試
maven-test:
stage: test
script:
- mvn clean test

#程式碼編譯打包image
maven-build:
stage: build
script:
- mvn clean package -DskipTests

#將打包好的Docker image上傳至私有image倉庫
docker-push:
stage: push
script:
#對打包的image進行tag
- docker tag $DOCKER_REPO_URL/$CI_PROJECT_PATH $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8}
#登入私有image倉庫
- docker login $DOCKER_REPO_URL -u $DOCKER_REPO_USERNAME -p $DOCKER_REPO_PASSWORD
#上傳應用程式image至image倉庫
- docker push $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8}
- docker rmi $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8}
- docker rmi $DOCKER_REPO_URL/$CI_PROJECT_PATH

#將應用程式發佈至Kubernetes測試叢集
deploy-test:
stage: deploy
when: manual
script:
- kubectl config use-context kubernetes-admin@kubernetes
- sed -e "s/__REPLICAS__/1/; s/__PORT__/$PORT/; s/__APP_NAME__/$CI_PROJECT_NAME/; s/__PROFILE__/test/; s/__IMAGE__/$DOCKER_REPO_URL\/${CI_PROJECT_PPf/ATH/ /\\/}\/${CI_BUILD_REF_NAME//\//\\/}:${CI_COMMIT_SHA:0:8}/" kubernetes/deploy.yaml | kubectl -n ${K8S_NAMESPACE} apply -f -


  • 部署Consul服務
docker run --name consul -p xxxx:xxxx -v /tmp/consul/conf/:/consul/conf/ -v /tmp/consul/data/:/consul/data/ -d consul


7會員
112內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
發表第一個留言支持創作者!
小黑與程式的邂逅 的其他內容
[Docker]Harbor架設
閱讀時間約 2 分鐘
[Spring]安裝Maven與Docker
閱讀時間約 1 分鐘
[Go]環境架設
閱讀時間約 1 分鐘
[Java][Spring Boot]建立專案
閱讀時間約 6 分鐘
[Java]Spring Boot變Spring Cloud
閱讀時間約 6 分鐘
你可能也想看
迎新活動「方格新手村」:新格友註冊加入方格子,知名日料吃到飽餐券送給你! 👉 還不是 vocus 的會員嗎?點此註冊,參與新手村活動 👈 近期站上也出現了不少新格友,為了歡迎各位的加入,「方格新手村」隨之登場! 即日起,只要是新註冊帳號於活動期間內發佈 3 則文章,就有機會抽獎獲得知名日料吃到飽餐券。原格友也可以一起同樂,我們準備了小任
Thumbnail
2024-06-21
閱讀心得:展現自我的生活態度|成熟大人的說話課我們每天都在說話,但說出的話合適嗎? Sunny最近讀完一本有關溝通的書籍。 這是由世紀奧美公關的創辦人「丁菱娟」所寫的書,書的全名《丁菱娟的成熟大人說話課:如何說,才能得體又不傷人?反擊時,如何堅定又有力量?任何情境都可用的38個溝通之道》。 會找這本書來看,主要是因為Sunny 近期發
Thumbnail
2024-07-10
防曬產品係數測試報告彙整(2024年)從2014年起,自己對於市售防曬產品的效能產生了濃厚的興趣。因為當時候發現不少產品的防曬係數其實標示是有問題的,像是原本應該是人體測試的SPF與PA數值,實際上沒有做,只用機器測試的數據來充當,但這兩者卻有很大的差異。像是防曬係數其實有強度、廣度與平均度三個面向需要一起判斷,但多數廠商並沒有完整標示
Thumbnail
Java 8 初探 - Lazy Evaluation & Parallel StreamLazy evaluation 的效益必須是在 pipe 的組合上有最佳化過的,若組合的不好反而更糟糕,且在 I/O 上幫助似乎也不大。parallel stream 要能發揮效果必須看資料的來源類型,不過要注意的是 parallel stream 也會使記憶體的使用量增加,使用上也要小心。
Thumbnail
2024-04-26
Java 8 初探 - Stream老實說,看到 Java Sream API 讓我感到相當親切,這應該跟我研究所多年的研究題目是 visual dataflow language 有關,Java Stream API 把迴圈給內化了,每個 operation 的重點是要做什麼,大大提高了程式的抽象化程度和可讀性。
Thumbnail
2024-04-25
Java 8 初探 - Closure最後,Java 8 雖然支援 Lambda,但我覺得 Closure 某種程度上還不稱不上是 Java 的第一級居民,我還是比較喜歡寫一些小而易測的 class,而不是使用 Lambda,至於捕捉變數,透過建構子將變數帶入物件也是一種方式。
Thumbnail
2024-04-25
Java 8 初探 - LambdaJava 8 終於在 2014 的 3 月 18 日正式釋出了,不過自從用 Objective C 開發 iOS App後,我已經有好一陣子沒碰 Java,期間曾經有短暫寫一點點,但卻沒有時間去用 beta 版的 Java 8,直到最近才又開始玩一下。
Thumbnail
2024-04-25
【Java】SpringBoot 專案初始建置學習Spring Boot是Java工程師必備技能,文章分享瞭如何自學並快速上手Spring Boot開發,包括架構、開發工具、專案建立以及實作過程。
Thumbnail
2024-03-24
JAVA 呼叫 LINE NOTIFY 發訊息給群組本文章將介紹如何在LINE Notify上設定及使用權杖(access token)來進行通知功能。透過此API,可以使用curl或JAVA CODE來讓結果顯示在Line上面,達到及時的通知效果。
Thumbnail
Java 不支持multi-inheritanceJava不能同時多重繼承 但是可以多層繼承
Java寫一次,到處執行WORA, Write Once Run Anywhere Java 不依賴於任何平台,Java可以在任何平台上執行,前提是那平台上要有安裝JVM Java的執行流程
Thumbnail
Java Development Kit (JDK)下載完JDK之後,在本機的環境變數中加入此JDK的bin路徑以便系統能識別使用 javac 是java compiler
Thumbnail
【Java】建立Maven專案使用第三方套件 相信很多初學者學python的原因,不外乎語法簡單、好上手、重點是有很多現成的套件可以玩。那麼,Java呢?有!當然有!而且還多到你不知道該選哪個好! 今天的文章主要示範如何在vscode新建立Java 的maven專案,並且透過maven安裝這些額外的套件(依賴)
Thumbnail
2023-09-02