docker?gitea?drone實現(xiàn)超輕量級CI?CD實戰(zhàn)詳解
環(huán)境安裝
需要如下環(huán)境
docker + docker-compose
drone + drone-runner gitea
安裝docker-ce及docker-compose
卸載舊版本docker,較舊版本的Docker被稱為docker或docker-engine。如果已安裝這些,請卸載它們以及相關(guān)的依賴項。
sudo yum -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
1、安裝所需的包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
2、使用以下命令設(shè)置穩(wěn)定存儲庫。
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3、安裝最新版本的Docker CE和containerd
sudo yum -y install docker-ce docker-ce-cli containerd.io
4、常用命令
systemctl start docker # 開啟docker systemctl stop docker # 關(guān)閉docker systemctl status docker # 檢查docker systemctl enable docker # 設(shè)置開機自啟動
docker 鏡像加速
對于使用systemctl的系統(tǒng),請在/etc/docker/daemon.json中寫入如下內(nèi)容
{"registry-mirrors":["https://registry.docker-cn.com"]}
之后重啟服務(wù):
$ sudo systemctl daemon-reload $ sudo systemctl restart docker
安裝docker-compose
1、在官方文檔對比docker版本下載合適的docker-compose包
https://docs.docker.com/compose/install/
https://github.com/docker/compose/releases
2、下載安裝包
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
將1.24.1換成你要安裝的版本,我安裝的是1.25.1,也可以選擇自己喜歡的版本
3、對二進制文件應(yīng)用可執(zhí)行權(quán)限
sudo chmod +x /usr/local/bin/docker-compose
4、測試安裝
docker-compose --version #成功時回顯示版本號。 docker-compose version 1.25.1, build a82fef07
安裝gitea
創(chuàng)建目錄 /home/docker/gitea,創(chuàng)建文件 docker-compose.yml 內(nèi)容如下
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:latest # 直接裝最新版就好了,沒啥好選的,隨意
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
networks:
- gitea
volumes:
- ./data:/data # /home/data可以替換成你想要的掛載目錄
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000" # 可以替換成你想要的端口
- "8222:22" # 8222可以替換成22
docker-compose操作方式
docker-compose up -d 后臺啟動 Gitea docker-compose down docker-compose logs docker-compose ps 將顯示 Gitea 是否正確啟動
訪問 Gitea
訪問:http://server-ip:3000 會進入初始化安裝界面,按實際情況配置即可,端口號不用變,URL換成宿主機地址或者域名
修改完后,點擊“立即安裝”,完成初始化
安裝drone+drone-runner
創(chuàng)建目錄 /home/docker/drone,創(chuàng)建文件 docker-compose.yml 內(nèi)容如下
version: '3'
services:
drone-server:
restart: always
image: drone/drone:2
ports:
- "9999:80"
volumes:
- ./:/var/lib/drone/
- ./data:/data/
environment:
- DRONE_GITEA_SERVER=http://xxxxxxxxx:3000/ # Gitea訪問地址
- DRONE_GITEA_CLIENT_ID=xxxxxxxxx # 應(yīng)用ID,下一步會獲取
- DRONE_GITEA_CLIENT_SECRET=xxxxxxxxx # 應(yīng)用密鑰,下一步會獲取
- DRONE_SERVER_HOST=xxxxxxxxx:9999
- DRONE_SERVER_PROTO=http # 支持http, https
- DRONE_RPC_SECRET=xxxxxxxxx # 通信密鑰,下一步會獲取
- DRONE_GIT_ALWAYS_AUTH=true
- DRONE_GIT_USERNAME=xxxxxxxxx # git用戶名
- DRONE_GIT_PASSWORD=xxxxxxxxx # git密碼
- DRONE_USER_CREATE=username:xxxxxxxxx,admin:true # 管理員用戶名,開啟管理員賬戶
drone-runner-docker:
restart: always
image: drone/drone-runner-docker:1
ports:
- "10000:3000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_PROTO=http # 支持http, https
- DRONE_RPC_HOST=drone-server
- DRONE_RPC_SECRET=xxxxxxxxx # 通信密鑰,下一步會獲取
- DRONE_RUNNER_NAME=drone-runner-docker
- DRONE_RUNNER_CAPACITY=2
創(chuàng)建文件好后,先不啟動,去Gitea配置獲取應(yīng)用ID和密鑰
配置應(yīng)用
進入Gitea,點擊頭像-設(shè)置-應(yīng)用
1、創(chuàng)建應(yīng)用
應(yīng)用名稱 drone
重定向 URI http://xxxxxxxxxx:9999/login 就是drone入口地址
創(chuàng)建好后,會獲取ClientID和ClientSecret
2、生成新的令牌
令牌名稱 drone
創(chuàng)建好后,會獲取令牌
3、修改剛剛 /home/docker/drone下的 docker-compose.yml
應(yīng)用ID、應(yīng)用密鑰 修改為剛剛獲取的 ClientID和ClientSecret
通信密鑰 修改為剛剛獲取的 令牌
4、啟動
進入 /home/docker/drone 執(zhí)行 docker-compose up -d
實戰(zhàn)
這是一個springboot的例子
在項目pom.xml同級目錄下添加如下文件
Dockerfile
#指定基礎(chǔ)鏡像(一般指定程序所依賴的環(huán)境) #本例子是構(gòu)建SpringBoot所以我指定的jdk環(huán)境變量 FROM openjdk:8 #添加維護者信息 MAINTAINER author:leizk MAINTAINER mail:appler1998@qq.com #將./hello-world.jar添加到容器的/opt目錄中 COPY ./game.jar /opt #指定dockerfile的命令在哪個目錄下執(zhí)行 WORKDIR /opt #指定容器和外界交互的端口 EXPOSE 8080 #容器運行后執(zhí)行的命令(該命令在WORKDIR指定的工作目錄下執(zhí)行) #注意:多個CMD指令只有最后一個會生效 CMD java -jar game.jar #在構(gòu)建鏡像時執(zhí)行的命令 #我這邊用它來打印java的環(huán)境變量 RUN java -version #添加該鏡像的元數(shù)據(jù) LABEL version="1.0" description="這是一個Web服務(wù)器" by="edc"
.drone.yml
kind: pipeline
type: docker
name: game
steps:
- name: build-jar # 流水線名稱
image: maven:3.8.5-openjdk-8 # 定義創(chuàng)建容器的Docker鏡像
volumes: # 將容器內(nèi)目錄掛載到宿主機,倉庫需要開啟Trusted設(shè)置
- name: maven-cache
path: /root/.m2 # 將maven下載依賴的目錄掛載出來,防止重復(fù)下載
- name: maven-build
path: /app/build # 將應(yīng)用打包好的Jar和執(zhí)行腳本掛載出來
commands: # 定義在Docker容器中執(zhí)行的shell命令
- mvn clean package -DskipTests=true # 應(yīng)用打包命
- cp target/game.jar /app/build/game.jar
- cp Dockerfile /app/build/
- cp run.sh /app/build/
- name: build-docker # 流水線名稱
image: plugins/docker
volumes: # 將容器內(nèi)目錄掛載到宿主機,倉庫需要開啟Trusted設(shè)置
- name: maven-build
path: /app/build # 將應(yīng)用打包好的Jar和執(zhí)行腳本掛載出來
- name: docker
path: /var/run/docker.sock # 掛載宿主機的docker
settings:
dockerfile: /app/build/Dockerfile
commands: # 定義在Docker容器中執(zhí)行的shell命令
- cd /app/build
- chmod +x run.sh
- sh run.sh
- docker ps
volumes: # 定義流水線掛載目錄,用于共享數(shù)據(jù)
- name: maven-build
host:
path: /home/docker/drone/maven/build # 從宿主機中掛載的目錄
- name: maven-cache
host:
path: /home/docker/drone/maven/cache
- name: docker
host:
path: /var/run/docker.sock
run.sh
#!/bin/sh
# 定義應(yīng)用組名
group_name='nnzmr'
# 定義應(yīng)用名稱
app_name='game'
# 定義應(yīng)用版本
app_version='latest'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包編譯docker鏡像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 8080:8080 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'
這是一個vue項目的例子
.drone.yml
這里有個小bug,我想把npm install的依賴保存下來,下次用,但是好像沒有成功,我再弄弄看
kind: pipeline
type: docker
name: search
steps:
- name: prepare # 流水線名稱
image: node:14-alpine # 定義創(chuàng)建容器的Docker鏡像
volumes: # 將容器內(nèi)目錄掛載到宿主機,倉庫需要開啟Trusted設(shè)置
- name: node-model
path: /app/model # 將maven下載依賴的目錄掛載出來,防止重復(fù)下載
- name: node-cache
path: /app/cache # 將maven下載依賴的目錄掛載出來,防止重復(fù)下載
- name: node-build
path: /app/build # 將應(yīng)用打包好的Jar和執(zhí)行腳本掛載出來
commands: # 定義在Docker容器中執(zhí)行的shell命令
- npm config set prefix "/app/model"
npm config set cache "/app/cache"
- npm config set registry https://registry.npm.taobao.org
- npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass
- npm install
- npm run build
- cp -r dist /app/build/
- cp Dockerfile /app/build/
- cp default.conf /app/build/
- cp run.sh /app/build/
- name: build # 流水線名稱
image: plugins/docker
volumes: # 將容器內(nèi)目錄掛載到宿主機,倉庫需要開啟Trusted設(shè)置
- name: node-build
path: /app/build # 將應(yīng)用打包好的Jar和執(zhí)行腳本掛載出來
- name: docker
path: /var/run/docker.sock # 掛載宿主機的docker
settings:
dockerfile: /app/build/Dockerfile
commands: # 定義在Docker容器中執(zhí)行的shell命令
- cd /app/build
- chmod +x run.sh
- sh run.sh
- docker ps
volumes: # 定義流水線掛載目錄,用于共享數(shù)據(jù)
- name: node-build
host:
path: /home/docker/drone/node/build # 從宿主機中掛載的目錄
- name: node-model
host:
path: /home/docker/drone/node/model
- name: node-cache
host:
path: /home/docker/drone/node/cache
- name: docker
host:
path: /var/run/docker.sock
Dockerfile
# 設(shè)置基礎(chǔ)鏡像 FROM nginx #設(shè)置CTS時區(qū) RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone # 將dist文件中的內(nèi)容復(fù)制到 /usr/share/nginx/html/ 這個目錄下面 COPY ./dist /usr/share/nginx/html/ #用本地的 default.conf 配置來替換nginx鏡像里的默認配置 COPY default.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["nginx","-g","daemon off;"]
run.sh
#!/bin/sh
# 定義應(yīng)用組名
group_name='nnzmr'
# 定義應(yīng)用名稱
app_name='search'
# 定義應(yīng)用版本
app_version='latest'
echo '----copy jar----'
docker stop ${app_name}
echo '----stop container----'
docker rm ${app_name}
echo '----rm container----'
docker rmi ${group_name}/${app_name}:${app_version}
echo '----rm image----'
# 打包編譯docker鏡像
docker build -t ${group_name}/${app_name}:${app_version} .
echo '----build image----'
docker run -p 8081:80 --name ${app_name} \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-d ${group_name}/${app_name}:${app_version}
echo '----start container----'
default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
成果展示
貼幾張在用的圖片
構(gòu)建流程根據(jù)你定義的pipline執(zhí)行
可以結(jié)合portainer來管理你的容器
以上就是docker gitea drone實現(xiàn)超輕量級CI CD實戰(zhàn)詳解的詳細內(nèi)容,更多關(guān)于docker gitea drone輕量級CI CD的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
docker nginx + https 子域名配置詳細教程
這篇文章主要介紹了docker nginx + https 子域名配置詳細教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
Docker創(chuàng)建一個mysql容器并保存為本地鏡像
本篇文章主要介紹了Docker創(chuàng)建一個mysql容器并保存為本地鏡像 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
Prometheus 整合 AlertManager的教程詳解
Alertmanager 主要用于接收 Prometheus 發(fā)送的告警信息,它很容易做到告警信息的去重,降噪,分組,策略路由,是一款前衛(wèi)的告警通知系統(tǒng)。這篇文章主要介紹了Prometheus 整合 AlertManager的教程 ,需要的朋友可以參考下2019-07-07
Docker容器遷移之導(dǎo)入和導(dǎo)出容器方式
這篇文章主要介紹了Docker容器遷移之導(dǎo)入和導(dǎo)出容器方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05
使用Docker部署Dashdot服務(wù)器儀表盤的步驟
Dashdot是一款簡單、實用的開源服務(wù)器儀表盤,設(shè)計時考慮到了玻璃形態(tài),它旨在用于較小的?VPS?和私人服務(wù)器,這篇文章主要介紹了使用Docker部署Dashdot服務(wù)器儀表盤,需要的朋友可以參考下2022-12-12

