2022-03-12:k8s如何搭建gogs+drone实现自动化部署cicd,yaml如何写?
答案2022-03-12:
需要安装docker和k3s,见 docker和k3s,k3s不需要依赖docker,但是drone-run-docker依赖docker,所以一定要安装docker。
第一种方法:
yaml如下,需要把192.168.204.13替换成自己电脑的ip:
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: mysql
name: mysql
namespace: droneci
data:
initdb.sql: |
create database if not exists gogs;
create database if not exists drone;
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mysql
name: mysql
namespace: droneci
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORD
value: '123456'
- name: TZ
value: Asia/Shanghai
image: 'mysql:8.0'
imagePullPolicy: IfNotPresent
name: mysql
volumeMounts:
- mountPath: /var/lib/mysql
name: volv
- mountPath: /docker-entrypoint-initdb.d
name: volv2
volumes:
- hostPath:
path: /root/k8s/droneci/mysql/var/lib/mysql
type: DirectoryOrCreate
name: volv
- configMap:
name: mysql
name: volv2
---
apiVersion: v1
kind: Service
metadata:
labels:
app: mysql
name: mysql
namespace: droneci
spec:
ports:
- port: 3306
protocol: TCP
targetPort: 3306
nodePort: 10040
selector:
app: mysql
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: registry
name: registry
namespace: droneci
spec:
replicas: 1
selector:
matchLabels:
app: registry
template:
metadata:
labels:
app: registry
spec:
containers:
- image: 'registry'
imagePullPolicy: IfNotPresent
name: registry
volumeMounts:
- mountPath: /var/lib/registry
name: volv
volumes:
- hostPath:
path: /root/k8s/droneci/registry/var/lib/registry
type: DirectoryOrCreate
name: volv
---
apiVersion: v1
kind: Service
metadata:
labels:
app: registry
name: registry
namespace: droneci
spec:
ports:
- port: 5000
nodePort: 50000
protocol: TCP
targetPort: 5000
selector:
app: registry
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: phpmyadmin
name: phpmyadmin
namespace: droneci
spec:
replicas: 1
selector:
matchLabels:
app: phpmyadmin
template:
metadata:
labels:
app: phpmyadmin
spec:
containers:
- env:
- name: PMA_HOST
value: mysql
- name: PMA_PORT
value: '3306'
- name: PMA_USER
value: root
- name: PMA_PASSWORD
value: '123456'
image: phpmyadmin/phpmyadmin
imagePullPolicy: IfNotPresent
name: phpmyadmin
---
apiVersion: v1
kind: Service
metadata:
labels:
app: phpmyadmin
name: phpmyadmin
namespace: droneci
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
nodePort: 10050
selector:
app: phpmyadmin
type: NodePort
---
apiVersion: v1
kind: Service
metadata:
labels:
app: gogs
name: gogs
namespace: droneci
spec:
ports:
- name: 3000-3000
port: 3000
protocol: TCP
targetPort: 3000
nodePort: 10080
- name: 22-22
port: 22
protocol: TCP
targetPort: 22
nodePort: 10022
selector:
app: gogs
type: NodePort
---
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: gogs
name: gogs
namespace: droneci
data:
appini: |
BRAND_NAME = Gogs
RUN_USER = git
RUN_MODE = prod
[database]
TYPE = mysql
HOST = mysql:3306
NAME = gogs
SCHEMA = public
USER = root
PASSWORD = 123456
SSL_MODE = disable
PATH = /app/gogs/data/gogs.db
[repository]
ROOT = /data/git/gogs-repositories
[server]
DOMAIN = gogs
HTTP_PORT = 3000
EXTERNAL_URL = http://192.168.204.13:10080/ # 192.168.204.13需要修改成自己电脑的ip
DISABLE_SSH = false
SSH_PORT = 10022
START_SSH_SERVER = false
OFFLINE_MODE = false
[mailer]
ENABLED = false
[auth]
REQUIRE_EMAIL_CONFIRMATION = false
DISABLE_REGISTRATION = false
ENABLE_REGISTRATION_CAPTCHA = true
REQUIRE_SIGNIN_VIEW = false
[user]
ENABLE_EMAIL_NOTIFICATION = false
[picture]
DISABLE_GRAVATAR = false
ENABLE_FEDERATED_AVATAR = false
[session]
PROVIDER = file
[log]
MODE = file
LEVEL = Info
ROOT_PATH = /app/gogs/log
[security]
INSTALL_LOCK = true
SECRET_KEY = ToSeZnPToSyWt9r
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: gogs
name: gogs
namespace: droneci
spec:
replicas: 1
selector:
matchLabels:
app: gogs
template:
metadata:
creationTimestamp: null
labels:
app: gogs
spec:
containers:
- env:
- name: TZ
value: Asia/Shanghai
image: gogs/gogs
imagePullPolicy: IfNotPresent
name: gogs
volumeMounts:
- mountPath: /data/gogs/conf/app.ini
subPath: appini
name: config
- mountPath: /data
name: volv
volumes:
- configMap:
name: gogs
name: config
- hostPath:
path: /root/k8s/droneci/gogs/data
type: DirectoryOrCreate
name: volv
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: drone
name: drone
namespace: droneci
spec:
replicas: 1
selector:
matchLabels:
app: drone
template:
metadata:
labels:
app: drone
spec:
containers:
- env:
- name: DRONE_OPEN
- name: DRONE_GOGS
- name: DRONE_PROVIDER
value: gogs
- name: DRONE_GOGS_SERVER
value: 'http://gogs:3000'
- name: DRONE_SERVER_HOST
value: drone
- name: DRONE_RPC_SECRET
value: hh
- name: DRONE_SERVER_PROTO
value: http
- name: DRONE_USER_CREATE
value: 'username:moonfdd,admin:true'
- name: DRONE_DATABASE_DRIVER
value: mysql
- name: DRONE_DATABASE_DATASOURCE
value: 'root:123456@tcp(mysql:3306)/drone?parseTime=true'
image: 'drone/drone:1'
imagePullPolicy: IfNotPresent
name: drone
volumeMounts:
- mountPath: /data
name: volv
volumes:
- hostPath:
path: /root/k8s/droneci/drone/data
type: DirectoryOrCreate
name: volv
---
apiVersion: v1
kind: Service
metadata:
labels:
app: drone
name: drone
namespace: droneci
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
nodePort: 10010
selector:
app: drone
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: drone-runner-ssh
name: drone-runner-ssh
namespace: droneci
spec:
replicas: 1
selector:
matchLabels:
app: drone-runner-ssh
template:
metadata:
labels:
app: drone-runner-ssh
spec:
containers:
- env:
- name: DRONE_RPC_SECRET
value: hh
- name: DRONE_RPC_HOST
value: drone
- name: DRONE_RPC_PROTO
value: http
image: 'drone/drone-runner-ssh'
imagePullPolicy: IfNotPresent
name: drone-runner-ssh
---
apiVersion: v1
kind: Service
metadata:
labels:
app: drone-runner-ssh
name: drone-runner-ssh
namespace: droneci
spec:
ports:
- port: 3000
protocol: TCP
targetPort: 3000
nodePort: 10025
selector:
app: drone-runner-ssh
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: drone-runner-docker
name: drone-runner-docker
namespace: droneci
spec:
replicas: 1
selector:
matchLabels:
app: drone-runner-docker
template:
metadata:
labels:
app: drone-runner-docker
spec:
containers:
- env:
- name: DRONE_RPC_SECRET
value: hh
- name: DRONE_RPC_HOST
value: drone
- name: DRONE_RPC_PROTO
value: http
- name: DRONE_RUNNER_CAPACITY
value: '1'
- name: DRONE_RUNNER_NAME
value: runner-docker
image: 'drone/drone-runner-docker:1'
imagePullPolicy: IfNotPresent
name: drone-runner-docker
volumeMounts:
- mountPath: /var/run/docker.sock
name: volv
volumes:
- hostPath:
path: /var/run/docker.sock
type: Socket
name: volv
---
apiVersion: v1
kind: Service
metadata:
labels:
app: drone-runner-docker
name: drone-runner-docker
namespace: droneci
spec:
ports:
- port: 3000
protocol: TCP
targetPort: 3000
nodePort: 10020
selector:
app: drone-runner-docker
type: NodePort
访问http://192.168.204.13:10080/,创建账号,创建项目。然后git clone http://192.168.204.13:10080/moonfddgroup/testdemo.git。
写好.drone.yml文件,然后push上去。.drone.yml文件内容如下:
kind: pipeline
type: docker
name: dev
steps:
- name: build
image: golang
pull: if-not-exists
environment:
GOPROXY: https://goproxy.cn,direct
CGO_ENABLED: 0
GO111MODULE: on
GOOS: linux
GOARCH: amd64
commands:
- go env
trigger:
branch:
- master
push上去,drone里的结果如下:
第二种方法:
1.先copy项目
git clone https://gitee.com/moonfdd/k8syaml.git
cd k8syaml/droneci
2.修改Makefile文件,把192.168.204.13 改成自己电脑IP:
.PHONY: all
all: build
build:
k3s kubectl apply -f mysql.yaml
k3s kubectl apply -f registry.yaml
k3s kubectl apply -f phpmyadmin.yaml
cp gogs.yaml gogs2.yaml
sed -i "s/moonfddmyip/192.168.204.13/g" gogs2.yaml # 192.168.204.13 需要替换成宿主机IP
k3s kubectl apply -f gogs2.yaml
rm -rf gogs2.yaml
k3s kubectl apply -f drone.yaml
k3s kubectl apply -f drone-runner-ssh.yaml
k3s kubectl apply -f drone-runner-docker.yaml
test:
pwd
clean:
k3s kubectl delete -f mysql.yaml
k3s kubectl delete -f registry.yaml
k3s kubectl delete -f phpmyadmin.yaml
k3s kubectl delete -f gogs.yaml
k3s kubectl delete -f drone.yaml
k3s kubectl delete -f drone-runner-ssh.yaml
k3s kubectl delete -f drone-runner-docker.yaml
然后make build。
make build # 搭建 ci/cd 环境
make clean # 卸载 ci/cd 环境
结果如下: