Gitea, DroneCI 및 Portainer

10386 단어 devopsgitcicdpython

소개



당신은 빌드 환경을 만드는 일을 맡고 있으며 비교적 쉽고 반복 가능한 것을 원합니다.

위의 작업을 수행하기 위한 여정에서 많은 훌륭한 솔루션을 발견했습니다. Gitlab 및 Github와 같은 올인원 솔루션이 있지만 오픈 소스이고 무료이며 쉬운 솔루션을 원했습니다.

기테아



Gitea
Gitea는 배포하기 쉽고 훌륭한 온프레미스 리포지토리를 만드는 Github와 같은 것의 오픈 소스 버전입니다. 추가 이점은 선택한 이벤트에서 웹 후크를 트리거하도록 구성할 수 있는 Drone과의 기본 통합이 있다는 것입니다.

무인 비행기



Drone
Drone은 yaml 형식의 간단한 명령을 받아 파이프라인으로 실행하는 오픈 소스 CI 도구입니다. 그들은 모든 작업을 수행하는 주자의 개념을 가지고 있습니다. Docker, Kubernetes 또는 호스트에 필요한 러너를 설치하면 작업을 수신합니다.

러너:



도커
쿠버네티스
집행관
SSH
VM

포터테이너



Portainer
Portainer는 클라우드에서 컨테이너를 관리하고 여러 컨테이너 플랫폼(Kubernetes, Docker, Docker Swarm 및 Nomad)을 관리할 수 있는 컨테이너 관리 플랫폼입니다.

해결책:



도커 이미지로 캡슐화될 작은 Python 웹 서버를 만든 내 IDE로 VSCode를 사용하고 있습니다. 그런 다음 Docker 이미지가 생성되어 리포지토리로 전송된 다음 Kubernetes 배포에서 사용됩니다. 배포가 트리거되고 배포됩니다.

다음과 같이 표시됩니다.

[VSCode] -> [기테아] -> [드론] -> [포테이너] -> [배포]

Gitea 설치:



쿠버네티스:

helm install gitea gitea-charts/gitea -n gitea --values ./gitea_values.yml


gitea-values.yml(변경 사항)

ingress:
  enabled: true
  # className: nginx
  className:
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: git.chenetz.net
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: git-chenetz-tls
      hosts:
        - git.chenetz.net


드론 설치:



쿠버네티스:

helm upgrade my-drone drone/drone -n drone --values ./drone-values.yaml


drone-values.yaml(변경 사항)

ingress:
  enabled: true
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: drone.chenetz.net
      paths:
        - path: /
          pathType: Prefix
  tls: 
   - secretName: chenetz-drone-tls
     hosts:
       - drone.chenetz.net
nv:
  DRONE_WEBHOOK_SKIP_VERIFY: true
  ## REQUIRED: Set the user-visible Drone hostname, sans protocol.
  ## Ref: https://docs.drone.io/installation/reference/drone-server-host/
  ##
  DRONE_SERVER_HOST: drone.chenetz.net
  ## The protocol to pair with the value in DRONE_SERVER_HOST (http or https).
  ## Ref: https://docs.drone.io/installation/reference/drone-server-proto/
  ##
  DRONE_SERVER_PROTO: https

  ## REQUIRED: Set the secret secret token that the Drone server and its Runners will use
  ## to authenticate. This is commented out in order to leave you the ability to set the
  ## key via a separately provisioned secret (see existingSecretName above).
  ## Ref: https://docs.drone.io/installation/reference/drone-rpc-secret/
  ##
  DRONE_RPC_SECRET: drone-runner

  ## If you'd like to use a DB other than SQLite (the default), set a driver + DSN here.
  ## Ref: https://docs.drone.io/installation/storage/database/
  ##
  # DRONE_DATABASE_DRIVER:
  # DRONE_DATABASE_DATASOURCE:

  ## If you are going to store build secrets in the Drone database, it is suggested that
  ## you set a database encryption secret. This must be set before any secrets are stored
  ## in the database.
  ## Ref: https://docs.drone.io/installation/storage/encryption/
  ##
  # DRONE_DATABASE_SECRET:

  ## If you are using self-hosted GitHub or GitLab, you'll need to set this to true.
  ## Ref: https://docs.drone.io/installation/reference/drone-git-always-auth/
  ##
  # DRONE_GIT_ALWAYS_AUTH: false

  ## ===================================================================================
  ##                         Provider Directives (select ONE)
  ## -----------------------------------------------------------------------------------
  ## Select one provider (and only one). Refer to the corresponding documentation link
  ## before filling the values in. Also note that you can use the 'secretMounts' value
  ## if you'd rather not have secrets in Kubernetes Secret instead of a ConfigMap.
  ## ===================================================================================

  ## GitHub-specific variables. See the provider docs here:
  ## Ref: https://docs.drone.io/installation/providers/github/
  ##
  # DRONE_GITHUB_CLIENT_ID:
  # DRONE_GITHUB_CLIENT_SECRET:

  ## GitLab-specific variables. See the provider docs here:
  ## Ref: https://docs.drone.io/installation/providers/gitlab/
  ##
  # DRONE_GITLAB_CLIENT_ID:
  # DRONE_GITLAB_CLIENT_SECRET:
  # DRONE_GITLAB_SERVER:

  ## Bitbucket Cloud-specific variables. See the provider docs here:
  ## Ref: https://docs.drone.io/installation/providers/bitbucket-cloud/
  ##
  # DRONE_BITBUCKET_CLIENT_ID:
  # DRONE_BITBUCKET_CLIENT_SECRET:

  ## Bitbucket-specific variables. See the provider docs here:
  ## Ref: https://docs.drone.io/installation/providers/bitbucket-server/
  ##
  # DRONE_GIT_USERNAME:
  # DRONE_GIT_PASSWORD:
  # DRONE_STASH_CONSUMER_KEY:
  # DRONE_STASH_PRIVATE_KEY:
  # DRONE_STASH_SERVER:

  ## Gitea-specific variables. See the provider docs here:
  ## Ref: https://docs.drone.io/installation/providers/gitea/
  ##
  DRONE_GITEA_CLIENT_ID: [client id]
  DRONE_GITEA_CLIENT_SECRET: [secret]
  DRONE_GITEA_SERVER: https://git.chenetz.net


드론 도커 러너 설치:



쿠버네티스:

helm install my-drone-runner-docker drone/drone-runner-docker -n drone --values ./drone-runner-docker.yml


drone-runner-docker.yml(변경 사항)

env:
  ## The docker host to be used by the drone-runner-docker when connecting
  ## to the docker daemon, defaults to the dind(sidecar) docker daemon
  DOCKER_HOST: "tcp://localhost:2375"
  ## REQUIRED: Set the secret secret token that the Docker runner will use
  ## to authenticate. This is commented out in order to leave you the ability to set the
  ## key via a separately provisioned secret (see extraSecretNamesForEnvFrom above).
  ## Ref: https://docs.drone.io/runner/docker/configuration/reference/drone-rpc-secret/
  ##
  DRONE_RPC_SECRET: drone-runner

  ## The hostname/IP (and optionally the port) for your Kubernetes runner. Defaults to the "drone"
  ## service that the drone server Chart creates by default.
  ## Ref: https://docs.drone.io/runner/docker/configuration/reference/drone-rpc-host/
  ##
  DRONE_RPC_HOST: drone.chenetz.net

  ## The protocol to use for communication with Drone server.
  ## Ref: https://docs.drone.io/runner/docker/configuration/reference/drone-rpc-proto/
  ##
  DRONE_RPC_PROTO: https
  DRONE_NAMESPACE_DEFAULT: drone


구성:



기테아:







무인 비행기



모든 것을 준비하고 통신한 후 .values.yml 파일을 내 저장소에 추가했습니다. 다음 드론 파이프라인 파일은 Gitea에서 푸시 또는 풀에서 트리거를 받은 후 도커 이미지를 생성합니다. 두 번째 단계는 리포지토리에서 manifest.yml의 배포를 트리거하도록 Portainer에서 구성된 웹후크를 트리거합니다.

kind: pipeline
name: default
type: docker 
steps:
- name: docker  
  image: plugins/docker
  settings:
    username:
      from_secret: docker-username
    password:
      from_secret: docker-password
    repo: mchenetz/test
    tags:
    - latest

---
kind: pipeline
name: exec
type: exec
steps:
- name: deploy
  commands:
  - curl -X POST "https://192.168.10.12:9443/api/stacks/webhooks/"


도커파일




FROM python:latest
WORKDIR /src

COPY . .

CMD [ "python", "./test.py"]


소스(test.py)




from http.server import BaseHTTPRequestHandler, HTTPServer
import time

hostName = "localhost"
serverPort = 80

class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>https://portainer.io</title></head>", "utf-8"))
        self.wfile.write(bytes("<p>Request: %s</p>" % self.path, "utf-8"))
        self.wfile.write(bytes("<body>", "utf-8"))
        self.wfile.write(bytes("<p>This is an example web server on k8s.</p>", "utf-8"))
        self.wfile.write(bytes("</body></html>", "utf-8"))

if __name__ == "__main__":        
    webServer = HTTPServer((hostName, serverPort), MyServer)
    print("Server started http://%s:%s" % (hostName, serverPort))

    try:
        webServer.serve_forever()
    except KeyboardInterrupt:
        pass

    webServer.server_close()
    print("Server stopped.")


푸시 시 자동 트리거의 예:



도커 저장소:



포터이너 트리거:



결론:



하루가 끝나면... 설정하는 데 몇 단계가 필요한 것처럼 들릴 수 있지만 이제 코딩 파이프라인을 위한 완전한 환경이 있으며 모든 변경 사항이 자동으로 이미지를 빌드하고 배포합니다. 항상 원하는 것이 아닐 수 있으며 파이프라인을 수정하여 승인을 위해 중지를 삽입하고 더 일반적인 끌어오기로 변경할 수 있습니다.

좋은 웹페이지 즐겨찾기