Gitea Actionsをdocker環境で試してみた

## Gitea Actionsをトライしてみる

Giteaのv1.19.0でGitea Actionsがリリースされたので、試してみました。
気軽にテストしたかったので、全てdocker-composeの環境です。

https://github.com/go-gitea/gitea/releases/tag/v1.19.0

ランナーは`act_runner`のリポジトリに入っているようで、
Dockerファイルもあるだろうし、いけるだろうと判断しました。

https://gitea.com/gitea/act_runner

ちなみにブログにはこう記載してあったので普通に行けそう

> Currently, the only way to install act runner is by compiling it yourself, or by using one of the pre-built binaries. There is no Docker image or other type of package management yet. At the moment, act runner should be run from the command line. Of course, you can also wrap this binary in something like a system service, supervisord, or Docker container.

https://blog.gitea.io/2023/03/hacking-on-gitea-actions/

## Let's try!

### とりあえずGiteaのセットアップから

デフォルトでは無効化されているので、アクティベートをしていきます

https://blog.gitea.io/2023/03/hacking-on-gitea-actions/#set-up-gitea

```yaml:compose.yml
services:
  gitea:
    image: gitea/gitea
    restart: always
    container_name: gitea
    volumes:
      - ./gitea/data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 3000:3000
      # - 2222:22 # pushはhttp経由でいいやと思ったのでコメントアウト
    environment:
      GITEA__database__DB_TYPE: postgres
      GITEA__database__HOST: db:5432
      GITEA__database__NAME: gitea
      GITEA__database__USER: gitea
      GITEA__database__PASSWD: gitea
    depends_on:
      - db
  db:
    image: postgres:14
    container_name: postgres
    restart: always
    environment:
      POSTGRES_USER: gitea
      POSTGRES_PASSWORD: gitea
      POSTGRES_DB: gitea
    volumes:
      - ./gitea/postgres:/var/lib/postgresql/data
```

上記ファイルが出来上がったら、コンテナで立ち上げて、DBとかアカウントを作る

```bash:shell
docker compose up -d
```

終わったら、一旦閉じる

```bash:shell
docker compose down
```

Actionsを有効化していきます
下記設定を追加して、再度コンテナを立ち上げる

```diff_ini:~/gotea/data/gitea/conf/app.ini
+ [actions]
+ ENABLED = true
```

```bash:shell
docker compose up -d
```

そしたら、[http://localhost:3000](http://localhost:3000)を開いて
アカウント > サイト管理 に移動して、ランナーのタブへ移動

直接移動用
http://localhost:3000/admin/runners

![スクリーンショット 2023-04-27 0.38.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/b840586c-fbd5-fab5-e7f7-b16645eab3aa.png)

新しいランナーを作成ボタンを押して`Registration Token`をコピーしておく

![Registration Tokenのコピー画面](https://blog.gitea.io/demos/hacking-actions/register-runner.png)

### Runnerを立てる
ローカルで立ち上げても良いのですが、面倒だしすぐ消したいしなってことで、
こっちもコンテナで立ち上げます

`act_runner`をローカルにクローン

https://gitea.com/gitea/act_runner

```bash
git clone https://gitea.com/gitea/act_runner
```

今のフォルダ構成
```text
.
├── act_runner
│   └── いっぱい
├── compose.yml
└── gitea
    ├── data
    └── postgres
```

`compose.yml`にrunnerを立てる
```diff_yaml:compose.yml
# さっきの設定はそのまま
+   runner:
+     build:
+       context: ./act_runner
+       dockerfile: Dockerfile
+     container_name: runner
+     restart: always
+     environment:
+       GITEA_INSTANCE_URL: http://gitea:3000
+       GITEA_RUNNER_REGISTRATION_TOKEN: <ここにさっきコピーしたトークンを貼り付ける>
+       GITEA_RUNNER_NAME: test-runner
+       GITEA_RUNNER_LABELS: ubuntu-latest,ubuntu-22.04,ubuntu-20.04,ubuntu-18.04
```

`act_runner`のDockerファイルで、setup.shが動くようになっていたので、
setup.shを見たら、環境変数で登録しておけば問題なさそうでした。

https://gitea.com/gitea/act_runner/src/commit/293926f5d5c1325c829c21183bdb640941520b7b/run.sh#L25

:::note

ただし、登録の手順にはname, labelsは空白で問題ないと出ていたのですが、
labelsを空白にすると、runner側がdocker sockと通信できていなかったので、
初期値をそのまま追加しています
`setup.sh`を書き換えてlabelsのオプションを無くせば動くようになるのだろうか...?

> Runner name, you can just leave it blank;
> Runner labels, you can just leave it blank.

https://gitea.com/gitea/act_runner/src/branch/main/README.md#register

ラベルはここ見て追加しました。（compose上でラベルを設定しなかったら全てこの値が入るようになっている）

https://blog.gitea.io/2023/03/hacking-on-gitea-actions/#what-are-the-labels-for-runners-used-for

:::

コンテナを立ち上げて、Giteaのランナーページをリロードして表示されていればok

```bash
docker compose up -d
```

![スクリーンショット 2023-04-27 0.59.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/6a52073f-2c3a-e2c9-0a89-ad60874e8308.png)

### 稼働させてみる

デモ用のgitリポジトリの作成

Gitea側でリポジトリを作ります
リポジトリ毎にActionsを有効かする必要があるので注意

`demo/demo-runner`リポを作って、
設定 > リポジトリ に移動

![スクリーンショット 2023-04-27 1.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/6b1e58d0-8962-9c2e-e4d7-efa8317a7204.png)

下にスクロールしてActionsのチェックボックスを有効化します

![スクリーンショット 2023-04-27 1.08.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/db0e4b28-eebd-8b65-8a44-045200936a5c.png)


設定を保存すると、イシューとパッケージの間にActionsタブが増えます。
![スクリーンショット 2023-04-27 1.10.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/b964ef0b-7d88-7bee-6261-4e64dc66f761.png)

次はローカル側の作成

```shell
mkdir demo-runner
cd demo-runner
git init
git branch -m main
```

ワークフローファイルを作る
```shell
mkdir -p .gitea/workflows/
touch .gitea/workflows/demo.yml
```

```yaml:demo.yml
# .gitea/workflows/build.yaml
name: Gitea Actions Demo
run-name: ${{ github.actor }} is testing out Gitea Actions 🚀
on: [push]
jobs:
  Explore-Gitea-Actions:
    runs-on: ubuntu-latest
    steps:
      - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
      - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!"
      - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v3
      - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
      - run: echo "🖥️ The workflow is now ready to test your code on the runner."
      - name: List files in the repository
        run: |
          ls ${{ github.workspace }}
      - run: echo "🍏 This job's status is ${{ job.status }}."
```

コードは下記の4から持ってきています

https://blog.gitea.io/2022/12/feature-preview-gitea-actions/#try-it-on-local-machine

pushします
**Actionsは失敗します**

リポジトリの設定は自分のものにしてください
私は面倒だったので、http経由で...
```shell
git remote add origin http://localhost:3000/demo/demo-runner.git
```

```shell
git add .
git commit -m "create workflows"
git push -u origin main
```

Actionsのクローズを開くと失敗しています。。。。

![スクリーンショット 2023-04-27 1.13.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/8aa4b635-7400-1679-59fd-6029a6007492.png)

ログを見ると、nodeがないぞと言われてます。
それもそのはず、使ったDockerfileはalpineベースだったので、、、

![スクリーンショット 2023-04-27 1.14.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/6e506de9-10a3-18d5-3263-7cebe0a3f78f.png)

### 解決方法(力技)

今回は面倒なので、runnerに直接インストールしちゃいます

```shell
docker compose exec -it runner /bin/ash
```

runner上で、nodejsをインストール

```shell
apk add --no-cache nodejs
```

OKが出ればok

再実行のボタンがあるのでそちらをクリック

![スクリーンショット 2023-04-27 1.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/0f8ea753-9215-4ab4-253e-089a30ecde01.png)

画面が再度読み込まれて成功します

![スクリーンショット 2023-04-27 1.18.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565925/e5aba174-0fcb-35bc-e1cc-d098bff9c831.png)

## まとめ

案外簡単に実行させてくれました。
act_runnerのDockerファイルを直接使ったので、一部エラーは出ましたが解決できるレベルだったのでよかった。
当然ながらDockerfileも綺麗に作ってくれているので、自分が作成する環境で動くように修正すればすぐにでも使えるレベルかなと思います。(今回はcheckoutで失敗してしまったので)

ちなみにまだ問題点は残っておりまして、
- 利用したい環境でのDockerファイルの構築(Dockerで利用するなら)
    - 多分必要なもの
        - Docker in Dockerの環境
        - checkoutするためにnode環境
        - gitを使うためのgit環境
        - +α 利用したい言語の環境
- runnerの再起動時にトークンは使用済みのメッセージが表示される
    - ↑のメッセージ的にトークンの有効期限は一回限りっぽいので、どこのデータを持って起きておけば動くのかを考える必要がありそう

パッと思いついただけですが、後者は特に調べないと行けなさそうなので、
まだまだcomposeで利用するにはまだまだ遠いかも?(再起動を考えなければ問題ないですが)


#### memo
`/data/.runner`に設定ファイルと思われるjsonファイルがあった