#author("2020-08-22T13:33:26+00:00","","") #mynavi() #setlinebreak(on); #html(){{ <style> .images div { vertical-align: top; margin-right: 20px; } .images img { border: 1px solid #333; } </style> }} * 目次 [#i76ca42b] #contents - 参考 -- https://docs.drone.io/ * 概要 [#eab37da8] #html(<div class="pl10">) #TODO #html(</div>) * 環境構築 [#m4bce085] #html(<div class="pl10">) #html(){{ <div id="tabs1"> <ul> <li><a href="#tabs1-1">.env</a></li> <li><a href="#tabs1-2">docker-compose.yml</a></li> </ul> }} // START tabs1-1 #html(<div id="tabs1-1">) XXX.XXX.XXX.XXX は対象マシンのIP .env #mycode2(){{ GITEA_HOST=XXX.XXX.XXX.XXX GITEA_HTTP_PORT=13000 GITEA_SSH_PORT=10022 GITEA_USER_GID=1000 GITEA_USER_UID=1000 GITEA_DB_HOST=gitea-db:5432 GITEA_DB_NAME=gitea GITEA_DB_PASSWD=gitea GITEA_DB_PASSWORD=gitea GITEA_DB_USER=gitea DRONE_HOST=XXX.XXX.XXX.XXX DRONE_PORT=8000 DRONE_GITEA_CLIENT_ID= DRONE_GITEA_CLIENT_SECRET= DRONE_RPC_SECRET=secret DRONE_RUNNER_CAPACITY=2 REGISTRY_PORT=15000 }} #html(</div>) // END tabs1-1 // START tabs1-2 #html(<div id="tabs1-2">) docker-compose.yml #mycode2(){{ version: "3" services: gitea-app: image: gitea/gitea:latest hostname: gitea-app container_name: gitea-app environment: USER_UID: "${GITEA_USER_UID}" USER_GID: "${GITEA_USER_GID}" DOMAIN: "${GITEA_HOST}" HTTP_PORT: "${GITEA_HTTP_PORT}" ROOT_URL: "http://${GITEA_HOST}:${GITEA_HTTP_PORT}" DB_TYPE: "postgres" DB_HOST: "${GITEA_DB_HOST}" DB_NAME: "${GITEA_DB_NAME}" DB_USER: "${GITEA_DB_USER}" DB_PASSWD: "${GITEA_DB_PASSWD}" SSH_DOMAIN: "${GITEA_HOST}" SSH_PORT: "${GITEA_SSH_PORT}" SKIP_TLS_VERIFY: "true" TZ: "Japan" ports: - "${GITEA_HTTP_PORT}:${GITEA_HTTP_PORT}" #- "${GITEA_SSH_PORT}:${GITEA_SSH_PORT}" volumes: - ./volumes/gitea-app:/data #- /etc/timezone:/etc/timezone:ro #- :/etc/localtime:ro links: - gitea-db gitea-db: image: postgres:latest hostname: gitea-db container_name: gitea-db volumes: - ./volumes/gitea-db:/var/lib/postgresql/data environment: POSTGRES_DB: "${GITEA_DB_NAME}" POSTGRES_USER: "${GITEA_DB_USER}" POSTGRES_PASSWORD: "${GITEA_DB_PASSWD}" drone-app: image: drone/drone:latest hostname: drone-app container_name: drone-app environment: links: - gitea-app depends_on: - gitea-app environment: DOCKER_API_VERSION: "1.39" DRONE_AGENT_ENABLED: "true" DRONE_GITEA_SERVER: "http://${GITEA_HOST}:${GITEA_HTTP_PORT}" DRONE_GITEA_CLIENT_ID: "${DRONE_GITEA_CLIENT_ID}" DRONE_GITEA_CLIENT_SECRET: "${DRONE_GITEA_CLIENT_SECRET}" DRONE_RPC_SECRET: "${DRONE_RPC_SECRET}" DRONE_SERVER_HOST: "${DRONE_HOST}:${DRONE_PORT}" DRONE_SERVER_PROTO: "http" DRONE_USER_CREATE: "username:droneadmin,admin:true" DRONE_GITEA_SKIP_VERIFY: "true" DRONE_GITEA_ALWAYS_AUTH: "false" DRONE_TLS_AUTOCERT: "false" ports: - "${DRONE_PORT}:80" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./volumes/drone-app:/var/lib/drone drone-runner: image: drone/drone-runner-docker:latest hostname: drone-runner container_name: drone-runner links: - drone-app - gitea-app volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./.env:/etc/drone.env:ro environment: DOCKER_API_VERSION: "1.39" DRONE_RPC_PROTO: "http" DRONE_RPC_HOST: "${DRONE_HOST}:${DRONE_PORT}" DRONE_RPC_SECRET: "${DRONE_RPC_SECRET}" DRONE_RUNNER_CAPACITY: "${DRONE_RUNNER_CAPACITY}" DRONE_RUNNER_NAME: "drone-runner" DRONE_RUNNER_ENV_FILE: "/etc/drone.env" DRONE_TRACE: "true" DRONE_RPC_DUMP_HTTP: "true" DRONE_RPC_DUMP_HTTP_BODY: "true" local-registry: image: registry:2 hostname: local-registry container_name: local-registry ports: - "${REGISTRY_PORT}:5000" volumes: - ./volumes/local-registry:/var/lib/registry }} #html(</div>) // END tabs1-2 #html(</div>) // END tabs1 #html(<script>$(function() { $("#tabs1").tabs(); });</script>) ** Gitea環境構築 [#s097d3c2] #html(<div class="pl10">) ** コンテナ作成 [#o99686f8] #html(<div class="pl10">) コンテナ名を指定して Gitea だけ作成する。 #myterm2(){{ docker-compose up gitea-app gitea-db -d server=`cat .env | grep GITEA_HOST | awk -F= '{print $2}'` port=`cat .env | grep GITEA_HTTP_PORT | awk -F= '{print $2}'` echo "Gitea Server: http://${server}:${port}" }} #html(</div>) ** ユーザ作成 及び OAuthアプリケーション登録 [#zf9f5c8d] #html(<div class="pl10">) *** 表示されたURLにアクセスしてインストール [#g1b3921e] #html(<div class="pl10">) #html(<div class="images">) #html(<div class="ib">) [登録] 押下。 &ref(gitea_setup01.png,nolink); #html(</div>) #html(<div class="ib">) 入力項目は環境変数で指定した値にあったいる筈なのでどのまま [Giteaをインストール] を押下。 &ref(gitea_setup02.png,nolink); #html(</div></div>) #html(</div">) *** ユーザ登録 [#z6fe3991] #html(<div class="pl10">) #html(<div class="images">) #html(<div class="ib">) &ref(gitea_setup03.png,nolink); #html(</div>) #html(<div class="ib">) &ref(gitea_setup04.png,nolink); #html(</div></div>) #html(</div">) *** OAuthアプリケーションを登録 [#efa14677] #html(<div class="pl10">) #html(<div class="images"><div class="ib">) [設定] → [アプリケーション] から OAuth アプリケーションを登録。 &ref(gitea_setup05.png,nolink); #html(</div><div class="ib">) クライアントIDとシークレットを確認する。 &ref(gitea_setup06.png,nolink); #html(</div><div class="ib">) 確認した値を .env に記述しておく。 #mycode2(){{ DRONE_GITEA_CLIENT_ID=XXXXXXXXXXXXXXXXXXXXXXXXX DRONE_GITEA_CLIENT_SECRET=XXXXXXXXXXXXXXXXXXXXXXXXXX }} #html(</div></div>) #html(</div">) *** レポジトリ作成 [#d17ca390] #html(<div class="pl10">) #html(<div class="images"><div class="ib">) &ref(gitea_setup07.png,nolink); #html(</div></div>) #html(</div>) *** レポジトリ設定 [#c523cad5] #html(<div class="pl10">) 今回のサンプルでは Weboook とイベントが被って処理が2重に走ってしまうので、デフォルトのGitフックを無効にしておく。 #html(<div class="images"><div class="ib">) リポジトリの [設定] → Gitフック から update の 編集ボタンを押下。 &ref(gitea_setup08.png,nolink); #html(</div><div class="ib">) 内容を空にして [フックを更新] &ref(gitea_setup09.png,nolink); #html(</div></div>) #html(</div>) #html(</div>) #html(</div>) ** Drone環境構築 [#ea3c206b] #html(<div class="pl10">) ** Drone コンテナ作成 [#febdcbb8] #html(<div class="pl10">) 残りのコンテナも作成。 ※いったん Gitea は止める。( 削除Gitフックが反映されない事があるので ) #myterm2(){{ docker-compose stop docker-compose up -d source .env && echo "http://${DRONE_HOST}:${DRONE_PORT}" }} 再起動後はセッションが切れているので、再度 http://giteaのIP:13000 にアクセスしてログインし直しておく。 #html(</div>) ** AOuth許可 及び Activate [#xdb9d209] #html(<div class="pl10">) #html(<div class="images"><div class="ib">) &ref(gitea_setup10.png,nolink); #html(</div><div class="ib">) &ref(gitea_setup11.png,nolink); #html(</div><div class="ib">) &ref(gitea_setup12.png,nolink); #html(</div><div class="ib">) &ref(gitea_setup13.png,nolink); #html(</div></div>) #html(</div>) #html(</div>) #html(</div>) * 動作確認 [#p5b63121] #html(<div class="pl10">) ** リポジトリをcloneする [#a3578db5] #html(<div class="pl10">) #myterm2(){{ http://GireaのIP:ポート/sample/sample-repo.git }} #html(</div>) ** テストを作成する [#c118b34b] #html(<div class="pl10">) 以下の通り作成する。 #html(<div class="ib border">) ┗ .done.yml (後述) ┗ requirements.txt ┗ tests ┗ test_sample1.py #html(</div>) #html(){{ <div id="tabs2"> <ul> <li><a href="#tabs2-1">requirements.txt</a></li> <li><a href="#tabs2-2">tests/test_sample1.py</a></li> </ul> }} // START tabs2-1 #html(<div id="tabs2-1">) requirements.txt #mycode2(){{ pytest }} #html(</div>) // START tabs2-1 #html(<div id="tabs2-2">) tests/test_sample1.py #mycode2(){{ import pytest import subprocess def test_main(): print("これはテストのサンプルです") print("## 変更されたファイル ##") #result = subprocess.getoutput("git diff HEAD~ --name-only") result = subprocess.check_output(['git', 'diff HEAD~', '--name-only') print(result.decode()) }} #html(</div>) #html(</div>) // END tabs2 #html(<script>$(function() { $("#tabs2").tabs(); });</script>) #html(</div>) ** .drone.yml の作成 [#g7dabd5f] #html(<div class="pl10">) 参考: https://docs.drone.io/pipeline/docker/overview/ #mycode2(){{ kind: pipeline type: docker name: default steps: - name: test1 image: python commands: - "echo sample test1" - "pip install -r requirements.txt" - "pytest -v -s" when: branch: - master environment: DOCKER_API_VERSION: "1.39" }} #html(</div>) #html(</div>) * Tips [#y666f9bf] #html(<div class="pl10">) ** Drone docker runner に環境変数を渡す [#z4b11ab7] #html(<div class="pl10">) 環境変数を記述したファイルを定義し、環境変数に DRONE_RUNNER_ENV_FILE 指定する事で、 runner に 環境変数を渡す事ができる。 https://docker-runner.docs.drone.io/installation/reference/drone-runner-env-file/ 例) .env #mycode2(){{ MY_VAR1=sample1 MY_VAR2=sample2 }} docker-compose.yml #mycode2(){{ drone-runner: image: drone/drone-runner-docker:latest : volumes: # 環境変数ファイルをマウントしておく - ./.env:/etc/drone.env:ro environment: # 以下の環境変数で環境変数を定義したファイルのPATHを指定しておく DRONE_RUNNER_ENV_FILE: "/etc/drone.env" }} 以上で、 runner から起動されたコンテナでも .env で定義した環境変数を利用する事ができる。 #html(</div>) ** プライベートレジストリからイメージをプルする [#ve737e0a] #html(<div class="pl10">) #TODO https://discourse.drone.io/t/how-to-pull-private-images-with-1-0/3155 #html(</div>) ** Mac の時 [#g8567fb3] #html(<div class="pl10">) Mac の場合、/etc/localtime をそのままマウントしようとすると以下のエラーになる。 #myterm2(){{ ERROR: for gitea-app Cannot start service gitea-app: Mounts denied: The paths /etc/timezone and /etc/localtime are not shared from OS X and are not known to Docker. You can configure shared paths from Docker -> Preferences... -> File Sharing. See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info. . }} 環境変数で指定して回避。 #mycode2(){{ environment: TZ: "Japan" }} ** Docker API のバージョンが新しすぎると怒られる [#w3ea13de] #html(</div>) #mycode2(){{ default: Error response from daemon: client version 1.40 is too new. Maximum supported API version is 1.39 }} docker-compose .yml で Docker API バージョンを指定する #mycode2(){{ drone-app: : environment: DOCKER_API_VERSION: "1.39" : drone-runner: : environment: DOCKER_API_VERSION: "1.39" : }} #html(</div>) #html(</div>) #html(</div>)