SpriteKitでのタブの実装方法

SKScene内に複数のSKNodeを配置し、タブをタップした際に、表示するノードを切り替える必要があります。以下は、SpriteKitでタブのような機能を実装するプログラム例です。

class TabScene: SKScene {

    // タブのボタン
    let tabButtons = [SKSpriteNode(imageNamed: "tab1"), SKSpriteNode(imageNamed: "tab2"), SKSpriteNode(imageNamed: "tab3")]

    // タブのコンテンツ
    let tabContents = [SKNode(), SKNode(), SKNode()]

    var currentTab = 0

    override func didMove(to view: SKView) {
        // タブボタンを配置する
        let tabButtonHeight: CGFloat = 50
        for (index, button) in tabButtons.enumerated() {
            button.position = CGPoint(x: size.width / 2 + (CGFloat(index) - 1) * button.size.width, y: size.height - tabButtonHeight / 2)
            addChild(button)
        }

        // 初期タブのコンテンツを表示する
        showTabContent()
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touch = touches.first else {
            return
        }

        let location = touch.location(in: self)

        // タブがタップされた場合、タブを切り替える
        for (index, button) in tabButtons.enumerated() {
            if button.contains(location) {
                currentTab = index
                showTabContent()
                break
            }
        }
    }

    func showTabContent() {
        // 現在のタブのコンテンツを削除する
        for node in children {
            node.removeFromParent()
        }

        // 現在のタブのコンテンツを表示する
        for (index, content) in tabContents.enumerated() {
            if index == currentTab {
                addChild(content)
                break
            }
        }
    }
}

上記の例では、TabSceneという名前のSKSceneを作成しています。SKScene内には、tabButtonsとtabContentsという2つの配列を定義しています。tabButtonsには、タブのボタンを格納しており、tabContentsには、タブのコンテンツを格納しています。currentTab変数は、現在表示しているタブを示しています。

didMove(to:)メソッド内では、タブボタンを配置しています。タブボタンをタップした際には、touchesBegan(_:with:)メソッドが呼ばれ、現在のタブを変更する処理が行われます。showTabContent()メソッドを呼び出すことで、現在のタブのコンテンツを表示します。

showTabContent()メソッド内では、現在のタブのコンテンツを表示する前に、すでに表示されているコンテンツをすべて削除しています。その後、現在のタブに対応するコンテンツを追加しています。

上記の例では、tabButtonsとtabContentsに、それぞれ3つの要素を設定しています。これは、タブの数とコンテンツの数を表しています。また、タブのボタンとコンテンツは、それぞれ配列のインデックスで対応付けられています。

各タブのコンテンツは、TabSceneクラスを継承した別のクラスで定義することができます。タブごとに表示するノードを追加して、タブのコンテンツを設定することができます。

以上のように、SKScene内に複数のノードを配置し、タブをタップした際に、表示するノードを切り替えることで、SpriteKitでタブのような機能を実装することができます。

以下は、TabSceneを使ったサンプルアプリの例です。

まずは、3つのタブに対応するコンテンツを用意します。ここでは、それぞれ、赤、緑、青の背景色を持つSKSpriteNodeを作成します。

class RedTabContent: SKSpriteNode {
    override init() {
        super.init(texture: nil, color: .red, size: CGSize(width: 100, height: 100))
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

class GreenTabContent: SKSpriteNode {
    override init() {
        super.init(texture: nil, color: .green, size: CGSize(width: 100, height: 100))
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

class BlueTabContent: SKSpriteNode {
    override init() {
        super.init(texture: nil, color: .blue, size: CGSize(width: 100, height: 100))
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

次に、これらのタブコンテンツをTabSceneに追加します。タブボタンには、画像ファイルを使用します。

class GameScene: SKScene {
    override func didMove(to view: SKView) {
        let tabScene = TabScene(size: size)

        let redTabContent = RedTabContent()
        let greenTabContent = GreenTabContent()
        let blueTabContent = BlueTabContent()

        tabScene.tabButtons[0].texture = SKTexture(imageNamed: "redTabButton")
        tabScene.tabContents[0] = redTabContent

        tabScene.tabButtons[1].texture = SKTexture(imageNamed: "greenTabButton")
        tabScene.tabContents[1] = greenTabContent

        tabScene.tabButtons[2].texture = SKTexture(imageNamed: "blueTabButton")
        tabScene.tabContents[2] = blueTabContent

        addChild(tabScene)
    }
}

上記の例では、GameScene内に、TabSceneを追加しています。また、赤、緑、青のタブコンテンツを作成して、TabSceneに追加しています。また、タブボタンには、画像ファイルを使用しています。

以上のように、SKScene内に複数のノードを配置し、タブをタップした際に、表示するノードを切り替えることで、SpriteKitでタブのような機能を実装することができます。この例では、TabSceneにタブボタンとタブコンテンツを追加しています。また、GameScene内にTabSceneを追加しています。

SKSpriteNodeを使用したボタンの実装例

SpriteKitでは、SKSpriteNodeを使用してボタンを作成することができます。以下は、SpriteKitでボタンを実装する例です。

class ButtonNode: SKSpriteNode {

    init(imageNamed: String) {
        let texture = SKTexture(imageNamed: imageNamed)
        super.init(texture: texture, color: .clear, size: texture.size())
        isUserInteractionEnabled = true
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        // ボタンがタップされた時の処理を実装する
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        // ボタンがタップされた後の処理を実装する
    }

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        // タッチがキャンセルされた場合の処理を実装する
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

上記の例では、ButtonNodeという名前のクラスを作成しています。SKSpriteNodeを継承しているため、SKTextureを使用してボタンの画像を読み込んでいます。

また、isUserInteractionEnabledプロパティをtrueに設定することで、SKSpriteNodeをタッチ可能にしています。touchesBegan、touchesEnded、touchesCancelledメソッドをオーバーライドすることで、タップされた際の処理を実装することができます。

ボタンの初期化時に、以下のようにButtonNodeクラスをインスタンス化して、SKSceneに追加することで、ボタンを表示することができます。

let button = ButtonNode(imageNamed: "buttonImageName")
button.position = CGPoint(x: self.size.width / 2, y: self.size.height / 2)
self.addChild(button)

上記の例では、ButtonNodeクラスのインスタンスを作成し、positionプロパティを使用して、ボタンの位置を調整しています。addChildメソッドを使用して、SKSceneにボタンを追加しています。

以上のように、SpriteKitではSKSpriteNodeを使用してボタンを作成することができます。タッチされた際の処理をオーバーライドすることで、ボタンをタップした際の動作を実装することができます。

SKsceneの切り替え方法について

SpriteKitでシーンの切り替え方法について記載します。

  1. SKView.presentScene(_:)メソッドを使用する

SKView.presentScene(_:)メソッドを使用することで、現在表示されているSKSceneを切り替えることができます。

let newScene = MyScene(size: self.size)
self.view?.presentScene(newScene)

上記の例では、MySceneクラスのインスタンスを作成し、presentSceneメソッドを使用して、現在表示されているSKSceneをMySceneに切り替えています。

  1. SKTransitionを使用する

SKTransitionを使用することで、SKSceneの切り替え時にアニメーションを追加することができます。

let newScene = MyScene(size: self.size)
let transition = SKTransition.fade(withDuration: 0.5)
self.view?.presentScene(newScene, transition: transition)

上記の例では、MySceneクラスのインスタンスを作成し、SKTransition.fadeを使用して、現在表示されているSKSceneをフェードアウトさせながらMySceneに切り替えています。

基本的には2を使用してViewの切り替えを行うことが一般的かと思います。ただ、アニメーション使うと少しうざったい可能性もあるので、時と場合によって変えていくんでしょうね。

Transitionの種類もたくさんありますので、何個か試してみて気に入ったものを使っていきましょう。切り替えアニメーションの時間が長くなると待ちが増えますので、それも注意が必要です。


以下は、複数のSKSceneがある場合の例です。

let newScene: SKScene

if someCondition {
    newScene = MyScene1(size: self.size)
} else {
    newScene = MyScene2(size: self.size)
}

self.view?.presentScene(newScene)

上記の例では、someConditionという条件に基づいて、新しいSKSceneを選択しています。someConditionがtrueの場合は、MyScene1を、falseの場合はMyScene2を選択しています。新しいSKSceneを選択した後に、SKView.presentScene(_:)メソッドを使用して、現在表示されているSKSceneを切り替えています。

また、SKTransitionを使用して、SKSceneの切り替えにアニメーションを追加することもできます。以下は、一例です。

let newScene: SKScene

if someCondition {
    newScene = MyScene1(size: self.size)
} else {
    newScene = MyScene2(size: self.size)
}

let transition = SKTransition.fade(withDuration: 0.5)
self.view?.presentScene(newScene, transition: transition)

上記の例では、SKTransition.fadeを使用して、フェードアウトしながらSKSceneを切り替えています。

以上のように、複数のSKSceneがある場合でも、SKView.presentScene(_:)メソッドを使用して、SKSceneの切り替えを行うことができます。切り替えるSKSceneを選択する前に、必要に応じて条件分岐などを行うことができます。また、SKTransitionを使用してアニメーションを追加することもできます。

gitlab-ce on alpine linux

gitlab-ce on alpine linux

https://github.com/toshi0123/gitlab-ce

Docker Repository on Quay

This image is under development.

This gitlab-ce container image is built from source files.
You can find the installation guide as follows.
https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md

This docker image contains

  1. gitlab-ce(postgres)
  2. gitlab-shell
  3. gitaly
  4. gitlab-workhorse
  5. nginx

Postgresql and redis are not contained in this image.
You have to set them up by yourself.

Quick start

First, you have to create a new network.

docker network create gitlab-network

And run redis. (At this time I use my own redis image.)
You can use library/redis or other redis container images.

docker run --name gitlab-redis \
  -d \
  --hostname gitlab-redis \
  --log-opt max-size=10m \
  --log-opt max-file=4 \
  -v $PWD/redis:/data \
  --network gitlab-network \
  quay.io/toshi0123/redis:latest

And run postgresql. (Rails 4 is not supported with Postgresql 10.)
You can use library/postgres:9.6.6-alpine or other postgresql container images.

docker run --name gitlab-postgres \
  -d \
  --hostname gitlab-postgres \
  -e 'POSTGRES_USER=gitlab' \
  -e 'POSTGRES_PASSWORD=gitlabpassword' \
  -e 'POSTGRES_DB=gitlabhq_production' \
  -e 'DB_EXTENSION=pg_trgm' \
  --log-opt max-size=10m \
  --log-opt max-file=4 \
  -v $PWD/postgres:/var/lib/postgresql/data:rw \
  --network gitlab-network \
  quay.io/toshi0123/postgres:9.6.10-r0

Then, run gitlab. (If you want to set it up with https, you have to read the HTTPS section before starting the gitlab container.)

docker run --name gitlab \
  -d \
  -p 80:80 \
  -p 443:443 \
  --hostname gitlab \
  -e 'GITLAB_SECRETS_DB_KEY_BASE=please-modify-by-yourself' \
  -e 'GITLAB_SECRETS_SECRET_KEY_BASE=please-modify-by-yourself' \
  -e 'GITLAB_SECRETS_OTP_KEY_BASE=please-modify-by-yourself' \
  --log-opt max-size=10m \
  --log-opt max-file=4 \
  -v $PWD/gitlab/etc:/etc/gitlab:rw \
  -v $PWD/gitlab/data:/home/git/data:rw \
  -v $PWD/gitlab/log:/var/log:rw \
  --network gitlab-network \
  quay.io/toshi0123/gitlab-ce:latest

Wait for gitlab to start up.

$ docker logs gitlab -f
...
The GitLab Unicorn web server with pid 132 is running.
The GitLab Sidekiq job dispatcher with pid 230 is running.
The GitLab Workhorse with pid 170 is running.
Gitaly with pid 178 is running.
GitLab and all its components are up and running.
+ /usr/sbin/crond -L /var/log/crond.log
+ set +x

And now you can access http://127.0.0.1 in your browser.
The first time you access the URL, you can change your root account's password. Then you can log in as root.

All data and config, log files are in $PWD/redis and $PWD/postgres and $PWD/gitlab directories.
Please maintain these carefully.

Environment variables

variables example values description
DB_HOST gitlab-postgres Postgresql host(default: gitlab-postgres)
DB_PORT 5432 Postgresql port(default: 5432)
DB_NAME gitlabhq_production Gitlab DB name(default: gitlabhq_production)
DB_USER gitlab Gitlab DB user's name(default: gitlab)
DB_PASS gitlabpassword Gitlab DB user's password(default: gitlabpassword)
REDIS_HOST gitlab-redis Redis-server host(default: gitlab-redis)
REDIS_PORT 6379 Redis-server port(default: 6379)
GITLAB_SECRETS_DB_KEY_BASE very-long-random-string Encryption key(default: default)
GITLAB_SECRETS_SECRET_KEY_BASE very-long-random-string Encryption key(default: default)
GITLAB_SECRETS_OTP_KEY_BASE very-long-random-string Encryption key(default: default)
GITLAB_HTTPS false HTTPS(default: false)

HTTPS

The GITLAB_HTTPS flag is available only during first run.
If you started GITLAB_HTTPS with false, you will have to modify $PWD/gitlab/etc/gitlab.conf by yourself.
A config example for https enabled in nginx is at /home/git/gitlab/lib/support/nginx/gitlab-ssl.
And also run cp -pf /home/git/gitlab/lib/support/nginx/gitlab-ssl /etc/gitlab/example/gitlab.conf.example and update gitlab.

Of course you have to prepare the key pair.
Before starting gitlab container, store the key pair in the $PWD/gitlab/etc directory.

$ mkdir -p ./gitlab/etc/
$ cp -pf private.key ./gitlab/etc/gitlab.key
$ cp -pf public.crt ./gitlab/etc/gitlab.crt

Custumize configuration files

You can modify some configuration files as preferred.
The files are stored in the $PWD/gitlab/etc directory.
You can edit with your editor normally, and then run docker restart gitlab.
These files are not modified by this container image except during the first run.
When you recreate the updated version of gitlab container image, the configuration files will be patched compared to the new one.
(If it cannot be patched due to conflict, the new container will not be started.)

Example of update conflict

The following logs shows an update conflict for database.yml. (v10.1.5 to v10.2.4)

patching file /home/git/data/config/database.yml
Hunk #1 FAILED at 9.
Hunk #2 FAILED at 23.
Hunk #3 FAILED at 33.
Hunk #4 FAILED at 48.
4 out of 4 hunks FAILED -- saving rejects to file /home/git/data/config/database.yml.rej
--- database.yml.example
+++ database.yml.example
@@ -9,4 +9,3 @@
-  # username: git
-  # password:
-  # host: localhost
-  # port: 5432
+  username: git
+  password: "secure password"
+  host: localhost
@@ -23,2 +22,2 @@
-  password:
-  # host: localhost
+  password: "secure password"
+  host: localhost
@@ -33,4 +32,4 @@
-  pool: 5
-  username: postgres
-  password:
-  # host: localhost
+  pool: 10
+  username: git
+  password: "secure password"
+  host: localhost
@@ -48 +47 @@
-  # host: localhost
+  host: localhost

You would have to verify $PWD/gitlab/etc/database.yml , and then remove the example file.

$ rm -f ./gitlab/config/example/database.yml.example
$ docker start gitlab

Login in gitlab container for debug

If you want to log into the gitlab container, run the follow command.

$ docker exec -it gitlab sh

Enjoy it!

alpine linuxベースのgitlab-ceを自作してみました

はじめに

ここで紹介する自作のDockerイメージは個人的に使用するために作成しております。
基本的には問題なく動作するように頑張っておりますが、万が一トラブル等でデータが消えてしまっても責任は負えません。バックアップ等はしっかりとお願い致します。

alpine linuxベースのgitlabのニーズがあまり無さそうなので単純にやってみました、っていうだけになりそうですが、誰かの参考になれば幸いです。
(この頃はomnibusパッケージがあるのでわざわざソースからやる必要ないんですよねぇ)

ところで alpine linux 楽しすぎです。マイブームです。

経緯

もともと私はgitlab 6.3.0-preのソースから初代gitlabを立ち上げ、数カ月後に6.7.3にアップデートしただけで、ずっとそのバージョンで4年1ヶ月ほど使用していました。
アップデート時のbundle installトラブルに懲りて触らぬ神に祟りなし状態・・・
構築したはいいけども、アップデートってすんなり出来ないもんですね。

そんな状態もDockerで構築すれば全て解決、と言うことでgitlabコンテナイメージを探して歩きました。

最初は皆さんも使うであろうgitlab/gitlab-ceやsameersbn/gitlabをもちろん使うわけですが、

  • なんかイメージサイズでけえ
  • なんだか痒いところに手が届かん
  • omnibusパッケージはイマイチ慣れないのでソースからのビルドがいい
  • なんかDockerfileや中のソースがごちゃごちゃしてて訳がわからん
  • 大体のイメージがThis image has vulnerabilitiescriticalがいっぱい出てる
  • gitlabはバージョンアップしてるけどdockerイメージがバージョンアップするの遅い

たくさんの不満が噴出してきました。
そこで、もういっそのこと自作することにしました。

方針

折角なので以下を頑張る。

  • alpine linux(edge)ベース
  • gitlabのソースからビルド(alpine linux用にomnibusパッケージがない)
  • イメージサイズを小さく抑える
  • セキュアなイメージにする(no vulnerabilities)
  • gitlabのアップデートに遅れを取らないようにする
  • なるべくシンプルでわかりやすくする
  • コンテナイメージ入れ替えによるgitlabのアップデートを簡単に出来る様にする
  • 無停止アップデートは諦めて確実なアップデートを出来る様にする

 構成

今回の構成コンポーネントは以下。

  1. gitlab (postgresql)
  2. gitlab-shell
  3. gitaly
  4. gitlab-workhorse
  5. nginx

ここにないredisとpostgresqlは別コンテナとして起動させる。
gitlab-pageとかは別途!まずは本体をどうにか動かす!

最終的にopenssh-serverもインストールしなかったですが使用用途がいまいちわからないので、どなたかご存知でしたら教えて頂きたいです。
git clone git@localhost:root/test.gitなどの使い方は想定できるのですがgitユーザのログインを禁止にしてたり、パスワードが・・・っていう問題がある気がしています。
ここで、ユーザ毎に登録するSSHキーが機能するってことでしょうか・・・
レポジトリのパスについても例で表示されている通りだとパスがずれててNot foundになる、などなんかうまく動いていない感。
それならいっそSSHアクセスをやめて「Only HTTP(S)」の方が良い気がします。

ソース

gitlab-ce on alpine linux
https://github.com/toshi0123/gitlab-ce

コンテナイメージ Docker Repository on Quay

https://quay.io/repository/toshi0123/gitlab-ce

repo.png

300MB前後に抑えれました!あとセキュリティスキャンも問題なく通ってます!

起動方法

※docker-composeは今回パス
最初にdocker networkを作成します。

docker network create gitlab-network

redisを立ち上げます. (今回は自分のredisイメージを使っています)
library/redisなどの他のコンテナイメージでも動作します。

docker run --name gitlab-redis \
  -d \
  --hostname gitlab-redis \
  --log-opt max-size=10m \
  --log-opt max-file=4 \
  -v $PWD/redis:/data \
  --network gitlab-network \
  quay.io/toshi0123/redis:latest

postgresqlを立ち上げます。(Rails 4はPostgresql 10をサポートしていないので、9.6を使います)
こちらもlibrary/postgres:9.6.6-alpineなどのほかのコンテナイメージでもいいです。

docker run --name gitlab-postgres \
  -d \
  --hostname gitlab-postgres \
  -e 'POSTGRES_USER=gitlab' \
  -e 'POSTGRES_PASSWORD=gitlabpassword' \
  -e 'POSTGRES_DB=gitlabhq_production' \
  -e 'DB_EXTENSION=pg_trgm' \
  --log-opt max-size=10m \
  --log-opt max-file=4 \
  -v $PWD/postgres:/var/lib/postgresql/data:rw \
  --network gitlab-network \
  quay.io/toshi0123/postgres:9.6.10-r0

最後にgitlabを起動させます。(HTTPSで立ち上げたい場合は、起動前にHTTPSセクションをご確認下さい)
※SECRETSは32文字以上のランダムな文字列を設定して下さい。

docker run --name gitlab \
  -d \
  -p 80:80 \
  -p 443:443 \
  --hostname gitlab \
  -e 'GITLAB_SECRETS_DB_KEY_BASE=please-modify-by-yourself' \
  -e 'GITLAB_SECRETS_SECRET_KEY_BASE=please-modify-by-yourself' \
  -e 'GITLAB_SECRETS_OTP_KEY_BASE=please-modify-by-yourself' \
  --log-opt max-size=10m \
  --log-opt max-file=4 \
  -v $PWD/gitlab/etc:/etc/gitlab:rw \
  -v $PWD/gitlab/data:/home/git/data:rw \
  -v $PWD/gitlab/log:/var/log:rw \
  --network gitlab-network \
  quay.io/toshi0123/gitlab-ce:latest

gitlabが起動するのを待ちます。

$ docker logs gitlab -f
...
The GitLab Unicorn web server with pid 132 is running.
The GitLab Sidekiq job dispatcher with pid 230 is running.
The GitLab Workhorse with pid 170 is running.
Gitaly with pid 178 is running.
GitLab and all its components are up and running.
+ /usr/sbin/crond -L /var/log/crond.log
+ set +x

起動後、ブラウザからhttp://127.0.0.1 にアクセスします。
初回アクセス時にパスワード変更が要求されます。変更後、アカウント名「root」でパスワードは先ほど変更済みのパスワードで管理者ログインが出来ます。

全データとコンフィグファイル、ログファイルは、$PWD/redis$PWD/postgres$PWD/gitlabディレクトリに格納されています。
これらのデータは消えない様にして下さい。

設定について

環境変数

変数名 説明
DB_HOST gitlab-postgres Postgresqlホスト名(default: gitlab-postgres)
DB_PORT 5432 Postgresqlポート(default: 5432)
DB_NAME gitlabhq_production Gitlab DB名(default: gitlabhq_production)
DB_USER gitlab Gitlab DBユーザ名(default: gitlab)
DB_PASS gitlabpassword Gitlab DBユーザパスワード(default: gitlabpassword)
REDIS_HOST gitlab-redis Redisサーバ名(default: gitlab-redis)
REDIS_PORT 6379 Redisサーバポート(default: 6379)
GITLAB_SECRETS_DB_KEY_BASE very-long-random-string 暗号キー(default: default)
GITLAB_SECRETS_SECRET_KEY_BASE very-long-random-string 暗号キー(default: default)
GITLAB_SECRETS_OTP_KEY_BASE very-long-random-string 暗号キー(default: default)
GITLAB_HTTPS false HTTPSを使用するか(default: false)

HTTPS

初回起動時にGITLAB_HTTPSフラグが有効です。
GITLAB_HTTPSfalseで起動しtrueに変更したい場合は、自身で$PWD/gitlab/etc/配下のコンフィグファイルを変更して下さい。
ssl用nginxのコンフィグファイルは/home/git/gitlab/lib/support/nginx/gitlab-sslにあります。
手動で変更した場合は今後gitlabのアップデートする際のためにcp -pf /home/git/gitlab/lib/support/nginx/gitlab-ssl /etc/gitlab/example/gitlab.conf.exampleを実施して下さい。

HTTPSにする際はサーバ証明書が必要です。
gitlabコンテナを起動する前に$PWD/gitlab/etcにサーバ証明書を格納して下さい。

$ mkdir -p ./gitlab/etc/
$ cp -pf private.key ./gitlab/etc/gitlab.key
$ cp -pf public.crt ./gitlab/etc/gitlab.crt

アップデート方法

アップデートする際はバックアップをして下さい。

$ docker exec -it gitlab sh
# cd /home/git/gitlab
# sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production

バックアップ後はコンテナを停止し、新しいコンテナイメージで起動すると自動的にDBマイグレーションが実施されます。

アップデート時トラブル対処方法

検証時に発生したトラブルについて簡単にまとめておきます。

v10.1系 → v10.2系 database.yml.postgresqlの記述変更

database.yml.postgresqlの記載がちょっとだけ変更になっているため、エラーとなり起動に失敗します。

patching file /home/git/data/config/database.yml
Hunk #1 FAILED at 9.
Hunk #2 FAILED at 23.
Hunk #3 FAILED at 33.
Hunk #4 FAILED at 48.
4 out of 4 hunks FAILED -- saving rejects to file /home/git/data/config/database.yml.rej
--- database.yml.example
+++ database.yml.example
@@ -9,4 +9,3 @@
-  # username: git
-  # password:
-  # host: localhost
-  # port: 5432
+  username: git
+  password: "secure password"
+  host: localhost
@@ -23,2 +22,2 @@
-  password:
-  # host: localhost
+  password: "secure password"
+  host: localhost
@@ -33,4 +32,4 @@
-  pool: 5
-  username: postgres
-  password:
-  # host: localhost
+  pool: 10
+  username: git
+  password: "secure password"
+  host: localhost
@@ -48 +47 @@
-  # host: localhost
+  host: localhost

このときは、まず$PWD/gitlab/etc/database.ymlの記載が正しいかを確認してください。
正しいことが確認できればexampleファイルを削除することで該当部分のチェックをスキップ出来ます。

$ rm -f ./gitlab/etc/example/database.yml.example
$ docker start gitlab

とすると今回エラーの出たdatabase.ymlの部分は通過し、起動できます。

Postgresql 10を使用する場合

10.0から10.1にアップデートする際にMigration 20170830131015が失敗します。
https://gitlab.com/gitlab-org/gitlab-ce/issues/38222

初回起動のタイミングで10.2系から使用する場合は問題なさそうですが、Rails4がPostgresql 10をサポートしてないので、9.6系を使用した方が良さそうです。

苦労した点

パッケージ不足

とりあえず実行!
あ、パッケージ足りない!
パッケージ追加!
とりあえず実行!
・・・
を繰り返しました。
alpine linuxはパッケージも細分化されてて嬉しいです。(皮肉では決してありません。)

bundle installエラー

やっぱりどうしてもbundle installには悩まされるんですね。
gpgmeというパッケージが全くインストール出来ず心が折れかけました。

busybox envバグ

busyboxのenvでは-uオプションが使用できずにエラーが起こります。
envの含まれるcoreutilsパッケージをインストールして回避しました。

busybox kill機能不足

busyboxのkillコマンドでは--の記述が出来ないため、gitlabのinitスクリプトでエラーが出ていました。
細かいところで機能不足があります。(busyboxで軽量化してるのでしょうがないですが)
今回はgitlabのinitスクリプト側を修正しました。

busybox pkill問題

-uオプションがないため、procpsを追加しましたが、なぜか機能しない。
PATHの設定上、busyboxさんのpkillが動作してしまいます。

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

busyboxのリンクは/usr/binに存在するのですが、procpsは/binに入ってしまう。
このため、手動でbusyboxのリンクを削除→/usr/binにprocpsのリンクを作成、と言う感じで回避しました。

ssh経由でのgitアクセス断念

adduserでアカウントのログインを無効にしてるのに、どうやってsshでpushできるんだろうか。
色々と試した結果、sshを断念しました。
repositoriesへのパスの問題もありつつイマイチピンと来ていないところ。

busybox patch不満

diff -U0の出力をそのまま使用できないと言う謎の制限があり、個人的には不満です。
前後1行を有効にすると少しでも違うとダメですし、柔軟ではなかったので、別途patchパッケージをインストールしました。

最後に

長々となってしまいました。ここまで読んで頂きありがとうございました。
今後もgitlabの愛用していきたいので最新機能を使いこなしていきたいです。