Drone CI/CD 筆記

Drone CI/CD

  • Drone 是一套使用 GO 開發 CI/CD 的工具 使用 yaml 撰寫 pipeline 結合 docker 執行

  • 擁有許多 plugins 可以完成雲端的部署

  • Drone 支援 git service 也很完善

    • GitHub
    • GitLab
    • Gitea
    • Gogs
    • Bitbucket Cloud
    • Bitbucket Server
  • 在 > 1.0 之後 server 及 agent 已經合成一個 image 不需要額外 compose

  • 目前使用的 git server 是 gitea,依照官方文件 進行架設

  • Drone run 起來後,認證會直接吃 Gitea 設定的認證來源

  • 把 /etc/localtime:/etc/localtime:ro \ 掛進 volume 的原因是後來在流程中 gcloud 認證碰到時間錯誤的問題


	#!/usr/bin/env bash

	DRONE_GITEA_SERVER="https://gitea.tw"
	DRONE_GIT_ALWAYS_AUTH=false
	DRONE_RUNNER_CAPACITY=2
	DRONE_SERVER_PROTO=http
	DRONE_SERVER_HOST="127.0.0.1:8082"
	DRONE_TLS_AUTOCERT=false

	DRONE_GITEA_USERNAME="user"
	DRONE_GITEA_PASSWORD="password"
	PROXY_SERVER="http://proxy:1234"

	docker run \
			--volume=/var/run/docker.sock:/var/run/docker.sock \
			--volume=/etc/localtime:/etc/localtime:ro \
			--volume=/var/lib/drone:/data \
			--env=DRONE_GITEA_SERVER=$DRONE_GITEA_SERVER \
			--env=DRONE_GIT_ALWAYS_AUTH=true \
			--env=DRONE_RUNNER_CAPACITY=2 \
			--env=DRONE_SERVER_HOST=$DRONE_SERVER_HOST \
			--env=DRONE_SERVER_PROTO=$DRONE_SERVER_PROTO \
			--env=DRONE_TLS_AUTOCERT=false \
			--env=DRONE_KEEPALIVE_TIME=20s \
			--env=DRONE_KEEPALIVE_TIMEOUT=20s \
			--env=DRONE_KEEPALIVE_MIN_TIME=5s \
			--env=DRONE_LOGS_DEBUG=true \
			--env=DRONE_LOGS_COLOR=true \
			--env=DRONE_LOGS_PRETTY=true \
			--env=DRONE_GITEA_GIT_USERNAME=$DRONE_GITEA_USERNAME \
			--env=DRONE_GITEA_GIT_PASSWORD=$DRONE_GITEA_PASSWORD \
			--env=http_proxy=$PROXY_SERVER \
			--env=https_proxy=$PROXY_SERVER \
			--restart=always \
			--detach=true \
			--name=drone \
			-p 8082:80 \
			drone/drone:1.1.0

yaml 可以吃線上的 secrets,並放進 env 來使用 Drone 也有 CLI 可以在 local 測試,可以先在 local 測試 yaml (但 secrets 需要額外注入,無法使用線上設定)


  • 執行流程為: (專案為 PHP 部署在 GKE 上)

    • git push => gitea 設定 webhook => Drone 依照 pipeline yaml 執行
    • 預設設定會吃專案底下的 drone.yml
    • 流程為 composer install => phpunit => build image => push image => rolling update
  • composer 有遇到 private 套件問題,目前前是使用 composer http auth 暫解,把 key 打進 secrets 裡面

  • gcloud/sdk 在使用 ENV 的 GOOGLE_CREDENTIALS 轉成 json file 會有斷行問題,目前是轉成 base64 處理

example:


    kind: pipeline
    name: default

    steps:
        - name: backend-composer
          image: composer
          commands:
            - composer install
          when:
            branch:
            - drone

        - name: backend-test
          image: php:7
          commands:
            - cd src/
            - cp .env.example .env
            - ./vendor/bin/phpunit
          when:
            branch:
            - drone
            event:
            - push

        - name: push
          image: plugins/gcr
          settings:
            registry: asia.gcr.io
            repo: test/php7
            dockerfile: web.dockerfile
            tag: latest
            json_key:
              from_secret: GOOGLE_CREDENTIALS
          when:
            branch:
            - drone

        - name: rolling-update
          image: google/cloud-sdk:latest
          environment:
            PROJECT_ID: project_id
            COMPUTE_ZONE: asia-east
            CLUSTER_NAME: cluster_name
            GOOGLE_CREDENTIALS_BASE64:
              from_secret: GOOGLE_CREDENTIALS_BASE64
          commands:
              - gcloud config set project $PROJECT_ID
              - gcloud config set compute/zone $COMPUTE_ZONE
              - echo $GOOGLE_CREDENTIALS_BASE64 | base64 -d > staging_key.json
              - gcloud auth activate-service-account --key-file staging_key.json
              - gcloud container clusters get-credentials $CLUSTER_NAME
              - kubectl patch deployment web -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}"
          when:
            branch:
            - drone