1 前言
DevOps想要更好的理解,自己搭建一套CICD流水線體驗后就清晰明了了,在網(wǎng)上大多數(shù)案例的演示環(huán)境過于龐大,如:
- gitlab + gitlab-runner/jenkins + harbor + server
- k8s + kubesphere (集成DevOps基于jenkins)
- k3s + rancher(基于jenkins)
這些基礎(chǔ)環(huán)境就讓人望而止步,我使用6核32G黑蘋果搭建了三個晚上,被坑得頭破血流。
本文的CICD,僅需一臺1核2G最低配服務(wù)器,并依賴公有的資源完成CICD的演示和練習(xí)。
- github + github actions + dockerhub + aliyunECS(1核2G)
2 準備條件
- github賬號
- dockerhub賬號
- 1臺可以被公網(wǎng)訪問的服務(wù)器(我這里使用的aliyun最低配1核2G,ContOS7系統(tǒng))
3 dockerhub配置
dockerhub配置簡單,先處理
- Create Repository:輸入項目名,這里產(chǎn)生的是:dockerhubUserName/projectName,設(shè)置public(本次演示為公有倉庫)
4 github配置
- 新建倉庫,輸入項目名projectName

image-20210325111250444.png
- 點擊Actions -> set up a workflow yourself

image-20210325111413207.png
修改main.yml為actions-ci.yml(這步非必須)
提交到主分支,這時候主分支會多出.github/workflows文件夾,里面有剛創(chuàng)建的actions-ci.yml
重點在于CI文件理解,建議先看10分鐘actions官方文檔
配置secrets,避免明文暴露dockerhub以及服務(wù)器的相關(guān)賬戶密碼

image-20210325112056752.png
- 需要設(shè)置6個密鑰

image-20210325112258314.png
- dockerhub相關(guān)密鑰,這里為了將Dockerfile打的鏡像push到之前創(chuàng)建好的dockerhub倉庫
- DOCKER_PASSWORD:123456
- DOCKER_REGISTRY:projectName
- DOCKER_USERNAME:zhangsan
- 服務(wù)器相關(guān)密鑰,這里為了將部署腳本通過scp傳輸?shù)椒?wù)器,再使用ssh遠程命令服務(wù)器去拉dockerhub鏡像并運行
SERVER_HOST:106.xx.xx.199
SERVER_PASS:123456
SERVER_USER:root
-
更改actions-ci.yml文件
name: Jave8 CICD with Actions # 觸發(fā)條件,當指定分支push代碼時觸發(fā) on: push: branches: - develop # 環(huán)境變量 env: IMAGE_NAME: projectName APP_JAR_DIR: target/projectName-0.0.1-SNAPSHOT.jar # 任務(wù)列表,測試步驟暫時空缺 jobs: # 自動化單元測試 test: runs-on: ubuntu-latest steps: - run: echo "測試成功" # maven編譯打包,和Dockerfile制作鏡像,push到dockerhub倉庫 compile-build: needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: actions/setup-java@v1 with: java-version: 1.8 - run: |- mvn package -U -Dcodegen.skip -Dmaven.test.skip=true mv $APP_JAR_DIR app.jar docker build -f Dockerfile -t $IMAGE_NAME . - uses: elgohr/Publish-Docker-Github-Action@master with: name: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REGISTRY }} username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tags: "latest,${{ env.STATE_RELEASE_VERSION }}" # 將deploy.sh通過scp傳輸?shù)椒?wù)器,并使用ssh遠程操作進行部署 deploy: needs: compile-build runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: garygrossgarten/github-action-scp@release with: local: deploy.sh remote: deploy.sh host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} password: ${{ secrets.SERVER_PASS }} - uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} password: ${{ secrets.SERVER_PASS }} port: 22 script: |- chmod +x deploy.sh sh deploy.sh rm -rf deploy.sh2個現(xiàn)有工具的使用
- scp: https://github.com/garygrossgarten/github-action-scp
- ssh: https://github.com/appleboy/ssh-action
Dockerflie:
FROM java:8 ADD app.jar app.jar CMD ["java","-jar","app.jar"]deploy.sh:
#! bin/bash # 外部傳給內(nèi)部的變量腳本 app_name="projectName" port="8888" docker_username="zhangsan" echo "對容器存活進行判斷" if test -n "$(docker ps -a |grep $app_name)" ; then echo "停止并且刪除容器和上版本鏡像" docker stop $app_name docker rm $app_name docker rmi $docker_username/$app_name:latest else echo "未檢查到$app_name容器運行" fi echo "獲取最新的鏡像" docker pull $docker_username/$app_name:latest echo "啟動服務(wù)" # 有需要添加的環(huán)境變量隨時添加 docker run -itd\ -e TZ="Asia/Shanghai"\ -e SERVER_PORT=$port\ -p $port:$port\ --name $app_name $docker_username/$app_name:latest
5 演示
使用IDE拉取項目代碼,創(chuàng)建develop分支,并修改push
查看github actions的實時可視化CICD步驟和日志

image-20210325115427181.png
CICD平均時長為2分30秒左右,個人項目的使用以及算很快了
訪問服務(wù)

image-20210325120202895.png
-
項目倉庫完整基礎(chǔ)文件
image.png
參考:
