Skip to content

Commit

Permalink
Merge pull request #25 from matsubara0507/develop
Browse files Browse the repository at this point in the history
version 0.2.0
  • Loading branch information
matsubara0507 authored Apr 9, 2019
2 parents 57d583b + c781ee6 commit ea3cd65
Show file tree
Hide file tree
Showing 33 changed files with 1,121 additions and 361 deletions.
2 changes: 2 additions & 0 deletions .env.template
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ PORT=
WORK=
CONFIG=
DRONE_HOST=
DRONE_PORT=
DRONE_TOKEN=
GH_TOKEN=
GH_SECRET=
APP_SERVER=
30 changes: 30 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
sudo: required
services:
- docker
language: elm
cache:
timeout: 360
directories:
- "$HOME/.stack/"
- "$HOME/.local/bin/"
- ".stack-work/"
install:
- mkdir -p ~/.local/bin
- export PATH=$HOME/.local/bin:$PATH
- travis_retry curl -L https://www.stackage.org/stack/linux-x86_64 | tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'
- stack docker pull
jobs:
include:
- stage: build dependencies
script: stack --no-terminal --install-ghc test --bench --only-dependencies
- stage: run test
script: stack --no-terminal test --bench --no-run-benchmarks --no-haddock-deps --pedantic
- stage: push docker image
if: branch = master AND type = push
script:
- stack test
- stack --docker --no-terminal build -j 1 Cabal
- stack --docker image container
- docker build -t matsubara0507/git-plantation .
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- docker push matsubara0507/git-plantation
57 changes: 57 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,60 @@
# Changelog for git-plantation

## Unreleased changes

## v0.2.0

* org アカウント以外で config 設定 (#10)
* dotenv ファイルが使えるようになる (#10)
* `/score` エンドポイントで drone から取得できなくても空リストを返す (#10)
* `fail` の代わりに例外処理を追加 (#11)
* JSON 形式のログを追加(#11)
* 回答リポジトリの生成の各ステップコマンドを追加(#13)
* GitHub に空リポジトリを作成
* リポジトリを初期化(問題リポジトリを参照して)
* 回答のためCIを問題リポジトリに設定
* メンバーを回答リポジトリに招待する(#13)
* 回答リポジトリのリセット(#13)
* コマンドの追加と変更(#14)
* `verify` : 設定ファイルの検査
* `delete_repo` : 回答リポジトリとCIの設定の削除
* private リポジトリを生成できるように変更
* org アカウント以外でもちゃんと動作するように修正
* 設定周りの更新(#14)
* `Problem` と 回答リポジトリの対応関係を `id` にした
* `provate` 設定の追加
* `org``owner` を明示的に指定するように変更
* 解答リポジトリの生成時に GitHub Webhook の設定をする(#15)
* GitHub Webhook の設定をするコマンドを追加(#15)
* Webhook API の修正(#15)
* 問題の検索周りの処理が間違っていた
* Docker イメージの修正(#15)
* `static` ディレクトリの追加
* git コマンドの設定を追加
* `.env` ファイルがなくても動作するように修正(#15)
* app の base image を変更(#16)
* `invite_member` コマンドの修正(#17)
* 変数の指定間違い
* 失敗時にエラーを返すように(`github` パッケージから修正)
* `setup_webhook` コマンドの GitHub Webhook の設定の仕方を修正(#17)
* `APP_HOST``APP_PORT``APP_SERVER` 環境変数に変更して URL を修正
* Secret を追加 (`GH_SECRET`)
* 各コマンドで `git checkout` の前に `git pull` をするように修正(#17)
* リポジトリ系のコマンドの `--repo` 引数を `problem.id` に変更(#17)
* work space をチームごとに区切るように修正(#17)
* 別々のチームから同じ問題に対し同時にプッシュが来ても問題ないようになった
* 同じチームから同じ問題で別々のブランチなどに対し同時にプッシュが来たらおそらくまずい
* webhook の時に `ci` ブランチにプッシュするのを `answer_branch` だけに限定(#17)
* これで「同じチームから同じ問題で別々のブランチなどに対し同時にプッシュ」も平気
* 一つのブランチでしか動作しないので
* スコアボードに「採点中」を追加(#19)
* `invite_member` コマンドを修正(#20)
* 201 が返ってくる(`github` 側から修正)
* リポジトリ系コマンドの修正・変更(#20)
* work directory の cd 先が間違っていたのを修正
* `--repos` で複数問題を指定できるように変更
* スコアボードのスコアの総和の仕方が間違っていたのを修正(#20)
* スコアボードで回答リポジトリに飛べるようにした(#20)
* `new_repo` コマンドで任意の処理をスキップできるように変更(#21)
* スコアボードの更新間隔を設定ファイルから指定できるように変更(#21)
* 参加者をリポジトリからキックするコマンドを追加(#24)
6 changes: 1 addition & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
FROM git-plantation-bin
RUN apt-get update && apt-get install -y \
ca-certificates \
git \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /work
COPY script /usr/local/bin/
COPY static /work/static

CMD ["run-app.sh"]
60 changes: 39 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# git-plantation

[![Build Status](https://travis-ci.org/matsubara0507/git-plantation.svg?branch=master)](https://travis-ci.org/matsubara0507/git-plantation)
[![](https://images.microbadger.com/badges/image/matsubara0507/git-plantation.svg)](https://microbadger.com/images/matsubara0507/git-plantation "Get your own image badge on microbadger.com")

![](./image/scoreboard.png)

## Requirement
Expand All @@ -11,48 +14,63 @@

## Usage

### 1. Write config file
### 0. Drone の起動

ref. `example/config.yaml`
もしローカルで起動する場合は:

### 2. Create problem repository in team
1. ngrok などで外への通信を開ける(`ngrok http 8000`)
2. Drone の GitHub App を作成し `Authorization callback URL``https://{ngrok's url}/login` を追加
2. `drone/.env` を設定する(ref. `drone/.env.template`)
- `DRONE_HOST` に ngrok の URL を設定する
- `DRONE_GITHUB_CLIENT``DRONE_GITHUB_SECRET` に GitHub App のものを設定
- `DRONE_SECRET` には適当な文字列を設定
4. `drone` ディレクトリで `docker-compose up`

using `git-plantation-tool`:
これで ngrok の生成した URL にアクセスすると Drone CI にアクセスできる

```
$ GH_TOKEN=XXX stack exec -- git-plantation-tool -c example/config.yaml --work .temp new_repo sample
```
### 1. git-plantation の設定を記述

### 3. Run app and drone
ref. `config/.git-plantation.yaml`

run app:
### 2. 環境変数を設定する

```
$ GH_TOKEN=XXX GH_SECRET=YYY stack exec -- git-plantation-app --port 8080 --work ".temp" --verbose example/config.yaml
```
ref. `.env.template`

run drone ci:
- `PORT` は app のポート (app を docker で起動する場合)
- `WORK` は git コマンドを実行するワークディレクトリ (app を docker で起動する場合)
- `CONFIG` は git-plantation の設定のパス (app を docker で起動する場合)
- `DRONE_HOST` は Drone CI の URL
- `DRONE_PORT` は Drone CI のポート
- `DRONE_TOKEN` は Drone CI のトークン
- `GH_TOKEN` は GitHub のトークン
- `GH_SECRET` は GitHub Webhook のシークレットキー
- `APP_SERVER``git-plantation-app` が動作してる URL (例: `https://example.com`)

### 3. Create team's repository in team

using `git-plantation-tool`:

```
$ cd drone
$ docker-compose up
$ stack exec -- git-plantation-tool -c .git-plantation.yaml --work .temp new_repo sample
```

run ngrok:
### 4. Run app

run app:

```
$ ngrok start --config ngrok/config.yml app drone
$ stack exec -- git-plantation-app --port 8080 --work ".temp" --verbose .git-plantation.yaml
```

setting ngrok URL in GitHub Webhook.

## Build with Docker

Define environment to `.env` from `.env.template`.

```
$ stack test # ganerate elm code
$ stack docker pull
$ stack build --docker
$ stack --docker --no-terminal build -j 1 Cabal # if `out of memory`
$ stack --docker image container
$ docker build -t git-plantation .
$ docker run --rm -it -v `pwd`:/work -p 8080:8080 --env-file .env git-plantation
$ docker run --rm -it -v `pwd`/config.yaml:/work/config.yaml -p 8080:8080 --env-file .env git-plantation
```
39 changes: 31 additions & 8 deletions config/.git-plantation.yaml
Original file line number Diff line number Diff line change
@@ -1,33 +1,56 @@
scoreboard:
interval: 60000

problems:
- problem_name: tutorial
repo_name: matsubara0507/git-challenge-tutorial
- id: 1
name: tutorial
repo: matsubara0507/git-challenge-tutorial
difficulty: 1
challenge_branches:
- readme
- master
- task-1
- task-2
answer_branch: master
ci_branch: ci

- problem_name: is-order-an-adding
repo_name: matsubara0507/git-challenge-is-order-an-adding
- id: 2
name: is-order-an-adding
repo: matsubara0507/git-challenge-is-order-an-adding
difficulty: 1
challenge_branches:
- readme
- master
answer_branch: master
ci_branch: ci

- problem_name: minesweeper
repo_name: matsubara0507/git-challenge-minesweeper
- id: 3
name: minesweeper
repo: matsubara0507/git-challenge-minesweeper
difficulty: 1
challenge_branches:
- readme
- master
- checker
answer_branch: master
ci_branch: ci

teams:
- name: sample
github: sample-hige
id: alpha
member:
- matsubara0507
- name: MATSUBARA Nobutada
github: matsubara0507
repos:
- name: git-challenge-tutorial
org: sample-hige
problem: 1
private: false
- name: git-challenge-is-order-an-adding
org: sample-hige
problem: 2
private: false
- name: git-challenge-minesweeper
org: sample-hige
problem: 3
private: false
1 change: 1 addition & 0 deletions drone/.env.template
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ DRONE_HOST=
DRONE_GITHUB_CLIENT=
DRONE_GITHUB_SECRET=
DRONE_SECRET=
HOSTNAME=
40 changes: 21 additions & 19 deletions drone/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,32 +1,34 @@
version: '2'

services:
drone-server:
image: drone/drone:0.8

drone:
image: drone/drone:1
ports:
- 8000:8000
- 9000
- 8000:80
- 443:443
volumes:
- .:/var/lib/drone/
- /var/run/docker.sock:/var/run/docker.sock
- .:/data
restart: always
environment:
- DRONE_OPEN=true
- DRONE_HOST=${DRONE_HOST}
- DRONE_GITHUB=true
- DRONE_GITHUB_CLIENT=${DRONE_GITHUB_CLIENT}
- DRONE_GITHUB_SECRET=${DRONE_GITHUB_SECRET}
- DRONE_SECRET=${DRONE_SECRET}

drone-agent:
image: drone/agent:0.8
- DRONE_GITHUB_SERVER=https://github.com
- DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT}
- DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_SECRET}
- DRONE_AGENTS_ENABLED=true
- DRONE_RPC_SECRET=${DRONE_SECRET}
- DRONE_SERVER_HOST=${DRONE_HOST}
- DRONE_SERVER_PROTO=https
- DRONE_TLS_AUTOCERT=true

command: agent
agent:
image: drone/agent:1
restart: always
depends_on:
- drone-server
- drone
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_SERVER=drone-server:9000
- DRONE_SECRET=${DRONE_SECRET}
- DRONE_RPC_SERVER=http://drone
- DRONE_RPC_SECRET=${DRONE_SECRET}
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=${HOSTNAME}
Loading

0 comments on commit ea3cd65

Please sign in to comment.