Help us understand the problem. What is going on with this article?

GitLab CI RunnerをMac上に構築する

はじめに

iOSアプリのCIを実現する手段としてはCircleCIやTravisCIなどのSaaSビルドツールを使う他に、JenkinsやGitLab CIのAgentとして自前のMacを使う方法があります。

本記事ではGitLab CI RunnerをMac端末上にインストールして動作させる手順をまとめます。
基本的にはドキュメントの手順通りにやるだけですが、ところどころ詰まったところをメモとして補足します。

前提

GitLab CI Runner on Macはgitlab.comでも自前構築のgitlab ceでも実現可能です。

GitLab CI RunnerをMacにインストールする

GitLab CI Runnerのバイナリファイルをダウンロードします。

# Install gitlab-runner
$ sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-amd64

デフォルトのコマンドだとlatestのバージョンがダウンロードされます。GitLabのバージョンと整合性をあわせるために、メジャーバージョンがそろったものを入れたい場合は、latestのところをダウンロードしたいバージョンのタグに置き換えるとよいでしょう。

# Install gitlab-runner
$ sudo curl --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/v11.11.4/binaries/gitlab-runner-darwin-amd64

タグの一覧はこちらから確認ができます。

次にダウンロードしたバイナリに実行権限を付与します。

# set permission
$ sudo chmod +x /usr/local/bin/gitlab-runner

# check gitlab-runner command
$ gitlab-runner --version
Version:      12.0.2
Git revision: d0b76032
Git branch:   
GO version:   go1.8.7
Built:        2019-07-07T00:39:54+0000
OS/Arch:      darwin/amd64

GitLab CI RunnerをGitLabに登録する

次にGitLab CI Runnerを対象のGitLabに登録します。

このとき順番にインタラクティブに以下が聞かれるので、事前に準備しておきましょう。

  • GitLabのホスト名(coordinator URL)
  • GitLab CIの連携用のトークン(token)
  • GitLab CI Runnerの名前(description)
  • GitLab Runnerのタグ名(tag)
  • 実行形態(executor)

tokenはGitLabのサイト上で確認することができます。以下のRunnerの種類によってtokenが異なるので、用途にあったものを確認しておきましょう。

  • Shared Runners
    • RunnerをGitLabホスト内で共有する。
  • Group Runners
    • 特定のGitLab Group内のプロジェクト専用のRunnerにする
  • Specific Runners
    • 特定のレポジトリ専用のRunnerにする

トークンはそれぞれSettings->CI/CD->Runnersの中で確認することができます。また管理権限のユーザがアクセスできるadmin areaでも確認ができます。

次に上記の情報をもとにRunnerを登録してきます。Macでビルドする場合は実行形態はshellを選択します。

# Register GitLab
$ gitlab-runner register

# GitLabのホスト名を入力
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.com/ 

# 連携用tokenをを入力
Please enter the gitlab-ci token for this runner:
xxxxxxxxx

# GitLab CI Runnerの名前を入力
Please enter the gitlab-ci description for this runner:
yyyyyyyyyy.local: takami228-mac-gitlab-runner

# タグ名を入力
Please enter the gitlab-ci tags for this runner (comma separated):
mac-ci-runner 

Registering runner... succeeded                     runner=zzzzzz

# 実行形態を入力
Please enter the executor: ssh, virtualbox, docker+machine, docker-ssh+machine, parallels, shell, kubernetes, docker, docker-ssh:
shell

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 

実行が完了すると、homeディレクトリのroot配下に.gitlab-runner/config.tomlが出来上がります。

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "takami228-mac-gitlab-runner"
  url = "https://gitlab.com/"
  token = "xxxxxxxxxx"
  executor = "shell"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]

GitLab Runnerを起動する

以下のコマンドでGitLab Runnerを起動します。

$ gitlab-runner install
Runtime platform arch=amd64 os=darwin pid=17304 revision=d0b76032 version=12.0.2

$ gitlab-runner start
Runtime platform arch=amd64 os=darwin pid=17318 revision=d0b76032 version=12.0.2

$ gitlab-runner status
Runtime platform arch=amd64 os=darwin pid=17337 revision=d0b76032 version=12.0.2
gitlab-runner: Service is running!

上記を実行したら、Runnersの設定画面のRunners activated for this projectの英数文字列の横が緑色になることを確認します。

またlauchctlコマンドでgitlab-runnerがlaunchdに登録されていることがわかります。

$ launchctl list | grep "gitlab"
xxxx    0    gitlab-runner

実行結果を確認する。

テストレポジトリを作成し、以下の.gitlab-ci.ymlを作成し正しく動作していることを確認します。tagsのところでGitLab CI Runnerのtagsを指定することで特定のRunner上で実行させることができます。

build:
  stage: build
  tags:
    - mac-ci-runner 
  script:
    - uname -n
    - echo "hello"

テストレポジトリのCI/CDのところのPipelinesのところでRun Pipelinesを実行するとジョブが実行されます。
無事以下のような結果が得られ、Mac上でshellコマンドが実行されていることが確認できました。

Running with gitlab-runner 12.0.2 (d0b76032)
  on test zzzzzzz
  Using Shell executor...

  Running on takami228noMac-mini.local...

  Fetching changes with git depth set to 50...
  Initialized empty Git repository in /Users/takami228/builds/xxxx/0/takami228/gitlab-ci-test/.git/
  Created fresh repository.
  From https://gitlab.com/takami228/gitlab-ci-test
   * [new branch]      master     -> origin/master
  Checking out 251869d7 as master...
  Skipping Git submodules setup

  $ uname -n
  yyyyyyyyyyyyyy.local
  $ echo "hello"
  hello

Job succeeded

あとはRunnerのMac上にXcodeやPod、SwiftLint等の実行させたいコマンドをインストールし、.gitlab-ci.ymlswiftlintxcodebuildなどのコマンドを記載すればiOSのCI/CDを実現することができます。

ハマったところ

公式のドキュメントの上部ではGNU/Linuxの手順が紹介されており、そこではsudo権限で設定する手順になっています。

sudo権限でgitlab-runner registerを実行するとroot権限でconfig.tomlが作成され、root権限でしアクセスできない場所に置かれます。

そのためgitlab-runnerの実行もsudo権限が必要になります。

iOSではライブラリの依存関係解決にPodを使うのですが、このPodはroot権限では実行できないというエラーに遭遇し、手順に間違えていることに気づきました。インストール時の権限設定には注意してください。

$ sudo pod install
/usr/local/Cellar/cocoapods/1.6.1/libexec/gems/claide-1.0.2/lib/claide/command.rb:439:in `help!': [!] You cannot run CocoaPods as root. (CLAide::Help)

おまけ

GitLab CEに内包されているMattermostも利用している場合は、通知連携することでGitLab CIの実行結果を毎回Mattermostへ通知させることができます。連携についてはこちらを参考にしてください。

参考文献

takamii228
ITエンジニアLv.0b110🖥CI/CDパイプラインの話でご飯3杯食べれる人。AWS SAA、CSM、CSPO🏉AtlassianとGitLabが好き。Jenkinsも少し。AWS、Java(SpringBoot)、PHP(Laravel)やって今はFlutter。Goも少し。お金の話が好き💰人生迷走中💩
https://takamiii.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした