• 20220312:k8s如何搭建gogs+drone实现自动化部署cicd,yaml如何写?


    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 环境
    

    结果如下:
    在这里插入图片描述

  • 相关阅读:
    docker 安装redis , 让宿主机可以访问
    实用工具集锦(持续更新)
    @Component, @Repository, @Service的区别
    (转) 消息队列使用的四种场景介绍
    (转) 分布式-微服务-集群的区别
    (05) SpringBoot开发RESTFull?
    (04) springboot 下的springMVC和jsp和mybatis
    oracle中delete、truncate、drop的区别 (转载)
    (03) spring Boot 的配置
    windows下用nginx配置https服务器
  • 原文地址:https://www.cnblogs.com/waitmoon/p/15996856.html
Copyright © 2020-2023  润新知