- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2020-08-24T00:01:30+00:00","","")
#mynavi()
#setlinebreak(on);
#html(){{
<style>
.images div { vertical-align: top; margin-right: 20px; }
.images img { border: 1px solid #333; }
</style>
}}
* 目次 [#i76ca42b]
#contents
- 関連
-- [[Gitea&Drone&リバースプロキシ]]
- 参考
-- 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_USER_CREATE: "username:sample,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}"
server=`cat .env | grep DRONE_HOST | awk -F= '{print $2}'`
port=`cat .env | grep DRONE_PORT | awk -F= '{print $2}'`
echo "Drone Server: http://${server}:${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(){{
git clone http://GireaのIP:ポート/sample/sample-repo.git
}}
#html(</div>)
** テストを作成する [#c118b34b]
#html(<div class="pl10">)
git clone したディレクトリに移動して以下の通り作成する。
#html(<div class="ib border pr20"><div class="ib pr20">)
┗ .done.yml
┗ .gitignore
┗ requirements.txt
┗ tests
┗ test_sample1.py
#html(</div><div class="ib">)
・・・ 後述
・・・ https://github.com/pytest-dev/pytest/blob/master/.gitignore 辺りから
・・・ サンプルのテストコード
#html(</div></div>)
requirements.txt
#mycode2(){{
pytest
}}
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>)
** .drone.yml の作成 [#g7dabd5f]
#html(<div class="pl10">)
.drone.yml にパイプライン定義する。
※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
}}
#html(</div>)
** 作成したファイルを git push [#ne24a688]
#html(<div class="pl10">)
#myterm2(){{
git add . && git commit -m "add test code" && git push
}}
Droneで結果を確認
#html(<div class="images"><div class="ib">)
&ref(drone_result01.png,nolink);
#html(</div><div class="ib">)
&ref(drone_result02.png,nolink);
#html(</div><div class="ib">)
&ref(drone_result03.png,nolink);
#html(</div></div>)
#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">)
dockerHub で公開されているものや、ローカルリポジトリからDockerイメージをプルする場合は特に気にする必要はないが、
認証が必要なプライベートリポジトリからイメージをプルする場合、一手間必要になる模様。
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"
}}
#html(</div>)
** Docker API のバージョンが新しすぎると怒られる [#w3ea13de]
#html(<div class="pl10">)
#mycode3(){{
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>)