Slide 1

Slide 1 text

GitLabでCI/CDを 動かしてみよう ⽇本仮想化技術株式会社 ⼤内 明(技術部) VirtualTech.jp 2025年6⽉26⽇ 1

Slide 2

Slide 2 text

⾃⼰紹介 • ⼤内 明(おおうち あきら) • 技術部所属 • 主に、物理サーバー・ネットワーク、VMwareの仮想基盤の 構築運⽤保守などを⻑く担当 • 個⼈的には、Raspberry Piを使ったシステムや⼯作の作成で 遊んでいる 2

Slide 3

Slide 3 text

本⽇の内容 • GitLabの機能に含まれている、CI/CD機能をさわる • Dockerを使⽤したCI⽤のランナーの構成例の紹介 • CI/CDの実際の利⽤⽅法を解説 3

Slide 4

Slide 4 text

GitLab • GitLab Inc.が開発したウェブ型のGitリポジトリマネージャ • オープンソースで開発 • 商⽤版とコミュニティ版がある • GitHubみたいなサービスを⾃分で運⽤できる(※) • Issue管理 • プルリクエスト(Gitlabではマージリクエスト) • Wiki • CI/CD • ※GitLab⾃⾝がGitHubのようにサービスとしても提供 4

Slide 5

Slide 5 text

CI/CDとは • 以下の略称 • Continuous Integration(継続的インテグレーション) • Continuous Delivery(継続的デリバリー) • もしくはContinuous Deploy(継続的デプロイ) • アプリケーションの構築・テスト・展開を ⾃動化していくうえでの⼿法 5

Slide 6

Slide 6 text

CI(継続的インテグレーション) • 開発中の作業内容を、定期的にメインラインにマージして、 ビルドとテストを⾃動実⾏する⼿法 • ビルドとテストをプルリクエスト時などをトリガーに実⾏することも • マージする・マージした変更内容を常にテストできるように 整備することで、変更によってアプリケーションなどが破損 する可能性を減らす • コードの品質向上につながる 6

Slide 7

Slide 7 text

CIのようす 7 リポジトリ の メインライン ビルド テスト (4)マージ (1)作業ブラ ンチ作成 (2)開発もしくはテスト 結果に応じた修正 (3)プッシュ ビルド テスト ビルド テスト ビルド/テスト 定期実⾏もアリ レビュー PullRequest (MergeRequest)の ようにレビューを 挟むこともある

Slide 8

Slide 8 text

CD(継続的デリバリー) • CIでビルド・テストされた結果をいつでも確実にリリース できるように、成果物を⾃動で準備する⼿法 • 継続的デリバリーは、リリースは⼿動で⾏う • (Continuous Delivery) • 継続的デプロイは、リリースまでふくめて⾃動で⾏う • (Continuous Deploy) 8

Slide 9

Slide 9 text

GitLabにおけるCI/CD • GitLab CI/CDという機能が提供されている • GitLabにRunnerと呼ばれるCI/CD実⾏⽤の環境を登録 • Windows・Mac・Linuxに対応 • Runnerのインストール⽅法も、パッケージインストールやDockerや k8sなどに対応 • プロジェクトのリポジトリに、.gitlab-ci.ymlファイルという 構成ファイルを配置して、実⾏内容を記述する 9

Slide 10

Slide 10 text

GitLabのCI/CD環境の整備 10

Slide 11

Slide 11 text

やること • お試し環境として、Ubuntu ServerとDocker Engineを構築 • Dockerは、公式のセットアップ⼿順に従う • https://docs.docker.com/engine/install/ubuntu/ • GitLabをDockerコンテナでセットアップ • 今回はHTTPSではなくHTTPアクセスで⽤意 • GitLab Runnerをコンテナでセットアップ • それぞれ、Docker Composeの例を後述 11

Slide 12

Slide 12 text

GitLabのセットアップ • gitlabディレクトリを作成して、その中にcompose.ymlを作成 • 設定やデータなどのボリュームもこのディレクトリに保存 • 私の好みの問題 12 akkie@m75q-2:~$ mkdir gitlab akkie@m75q-2:~$ cd gitlab akkie@m75q-2:~/gitlab$ vi compose.yml (次のページの内容を参考に記述) akkie@m75q-2:~/gitlab$ docker compose up -d

Slide 13

Slide 13 text

GitLabコンテナのcompose.ymlの例 13 services: gitlab: image: 'gitlab/gitlab-ce:latest' restart: always environment: GITLAB_OMNIBUS_CONFIG: | external_url 'http://192.168.29.75:8081' ※8081の部分はお好みで gitlab_rails['gitlab_shell_ssh_port'] = 2222 nginx['listen_port'] = 80 nginx['listen_https'] = false ports: - '8081:80' ※8081の部分はお好みで - '2222:22' volumes: - /etc/localtime:/etc/localtime:ro - './config:/etc/gitlab' - './logs:/var/log/gitlab' - './data:/var/opt/gitlab'

Slide 14

Slide 14 text

GitLab管理者のパスワード取得 • コンテナが起動したら、rootパスワードを取得する • 表⽰されたパスワードを使⽤して、rootユーザーでログイン • パスワードを変更 14 akkie@m75q-2:~/gitlab$ docker compose exec gitlab bash (コンテナ内で)# cat /etc/gitlab/initial_root_password

Slide 15

Slide 15 text

GitLab CI/CD Runnerの登録準備 • GitLabの管理者エリアの「CI/CD」→「Runner」を開く • 「Create instance runner」をクリック • 「タグのないジョブの実⾏」にチェックを⼊れる • 「Runnerを作成」をクリック • ステップ1の「Runner認証トークン」をコピーしてメモする 15

Slide 16

Slide 16 text

GitLab CI/CD Runnerのセットアップ • gitlab-runnerディレクトリを作成して、その中にcompose.yml を作成 • gitlabとは別に作る • まだ起動はしない 16 akkie@m75q-2:~$ mkdir gitlab-runner akkie@m75q-2:~$ cd gitlab-runner akkie@m75q-2:~/gitlab-runner$ vi compose.yml (次のページの内容を参考に記述)

Slide 17

Slide 17 text

GitLab Runnerコンテナの構成 • compose.ymlの例 • 以下のコマンドで登録作業(次のページに設定項⽬を記載) • 設定後にコンテナを起動 17 services: gitlab-runner: image: gitlab/gitlab-runner restart: always volumes: - ./config:/etc/gitlab-runner - /var/run/docker.sock:/var/run/docker.sock akkie@m75q-2:~/gitlab-runner$ docker compose run --rm gitlab-runner register

Slide 18

Slide 18 text

registerコマンドの設定内容 • 「URL」→GitLabのURLを⼊⼒ • http://192.168.29.75:8081/ のように、GitLabのURL • 「registration token」→P.17でメモしたトークンを⼊⼒ • 「Enter a name for the runner」→Runnerの名前を⼊⼒ • そのままEnterを押すとランダムな⽂字列で登録 • 「Enter an executor」→「docker」を指定 • 「Enter the default Docker image」→お好みで • 何もなければubuntu:24.04など 18

Slide 19

Slide 19 text

Runnerの登録後のようす 19 • 設定後にdocker compose up ‒dでコンテナを起動 • Runnerのページに戻り、登録したRunnerがオンラインになっ ていることを確認

Slide 20

Slide 20 text

演習環境 20

Slide 21

Slide 21 text

dnsmasqのhostsファイル管理 • 弊社内で使⽤中のものをベースに解説 • dnsmasq(DNSサーバー)で使⽤されるhostsファイルを Gitで管理 • GitLabに配置することで、Web UIでDNSレコードの編集が可能に • ものぐさな運⽤! • GitLabでCI/CDを設定することで、⾃動デプロイを可能に • 書式エラーチェックのようなCIのテスト的な要素はない • Ansibleを使⽤してhostsファイルを配布 • CDの部分が主な使い⽅かも 21

Slide 22

Slide 22 text

⼿順 • テスト⽤dnsmasqサーバーの⽤意 • VMを⽤意 • リポジトリの作成 • hostsファイル • Ansible Playbook • .gitlab-ci.yml • GitLabのCI/CDの設定 • 実⾏テスト 22

Slide 23

Slide 23 text

テスト⽤dnsmasqサーバーの⽤意 • Ubuntu ServerのVMを⽤意 • Ansible向けに、⼀般ユーザーからパスワードレスでsudo できるよう にしておく • dnsmasqをインストール • sudo apt install dnsmasq ‒y • /etc/dnsmasq.confを記述 • 最低限の設定(右) • SSH鍵を作成する • 秘密鍵はGitLabで使⽤するためメモする • 公開鍵の内容を~/.ssh/authorized_keysに追記する 23 strict-order interface=enp1s0 bind-interfaces

Slide 24

Slide 24 text

リポジトリの作成 • ホーム画⾯で右上の「新しいプロジェクト」を選択 • 空のプロジェクトの作成 • プロジェクト名・URLなどを設定 • READMEの作成はしない 24

Slide 25

Slide 25 text

hostsファイルの⽤意 • VMの/etc/hostsの中⾝を単純にコピー • あとでCI/CDが出来上がってから、レコードを追加して 名前引きのテストとかをすると良い 25 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00:: ip6-localnet ff00:: ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 192.168.29.76 dnsmasq

Slide 26

Slide 26 text

Ansible Playbookの⽤意 • リポジトリにansibleディレクトリを作成して、その中に Playbookとインベントリ⽤のhostsファイルを配置 • Playbookは、単にファイルを配布して、dnsmasqサービスを reloadする 26

Slide 27

Slide 27 text

.gitlab-ci.ymlの⽤意(1/2) • stages • ステージの定義 • 上から順に実⾏される • 今回はシンプルにテストと デプロイの2つ • before_script • CI実⾏前に実⾏するスクリプト • 必要なツールのインストール などに使⽤ • 今回はAnsibleとOpenSSHを インストール 27 --- stages: - test - deploy before_script: - apt-get update -y && apt-get install ansible-core -y - 'command -v ssh-agent >/dev/null || ( apt-get install openssh-client -y )' - eval $(ssh-agent -s) - chmod 400 "$SSH_PRIVATE_KEY" - ssh-add "$SSH_PRIVATE_KEY" - mkdir -p ~/.ssh - chmod 700 ~/.ssh - cp "$SSH_KNOWN_HOSTS" ~/.ssh/known_hosts - chmod 644 ~/.ssh/known_hosts - cp "$ANSIBLE_HOSTS" ansible/hosts

Slide 28

Slide 28 text

.gitlab-ci.ymlの⽤意(2/2) • test • CI⽤のステージ • stage: testがstagesとの紐づけ • グローバルキーワードのtestは無関 係 • Ansibleのチェックモードを実⾏ • deploy • CD⽤のステージ • mainブランチに変更があった場合 のみ実⾏ • stagesは上からすべて実⾏する ため、この制限がないとテストの 段階でこれも実⾏されてしまう 28 test: stage: test image: ubuntu:24.04 script: - ansible-playbook -i ansible/hosts ansible/update-hosts.yml -DC deploy: stage: deploy only: refs: - main image: ubuntu:24.04 script: - ansible-playbook -i ansible/hosts ansible/update-hosts.yml -D

Slide 29

Slide 29 text

GitLabプロジェクトのCI/CD設定(1/2) • 設定→CI/CD→変数 • 3つの変数を作成する • いずれもファイルタイプで作成 • SSH_PRIVATE_KEY • dnsmasqサーバーで⽣成したSSH秘密鍵 • 最後に空⾏を含めること! 29

Slide 30

Slide 30 text

GitLabプロジェクトのCI/CD設定(2/2) • SSH_KNOWN_HOSTS • dnsmasqサーバーの ホスト公開鍵 • ssh-keyscanコマンドで取得 • ANSIBLE_HOSTS • Ansibleのhostsファイル 30 [dnsmasq] 192.168.29.76 ansible_ssh_user=ubuntu (コマンド実⾏例) $ ssh-keyscan 192.168.29.76 (中略) 192.168.29.76 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICNqjQrAIPLW4S4d5FKEH rX05E4K2BfgOa7ThLgLTjHo

Slide 31

Slide 31 text

• 最終的な中⾝ • 作成した演習⽤リポジトリをGitLabにpush • ビルド→パイプラインを開くと、パイプラインの実⾏状況が 確認できる リポジトリをGitLabにpush 31 /Users/ouchi/Projects/ci-hosts |--.git |--.gitignore (※Macで作業している都合で.DS_Storeを記述) |--.gitlab-ci.yml |--ansible | |--update-hosts.yml |--hosts |--README.md

Slide 32

Slide 32 text

ジョブの結果の例 32

Slide 33

Slide 33 text

編集してみよう • GitLabでhostsファイルの編集画⾯を開いて、適当にレコード を追加する • 以下の図では192.168.29.102 zabbix を追加 • 変更をコミットして、CI/CDを確認 • CDのジョブが完了したら、 追加したレコードの名前引きを確認 • (例)dig zabbix @192.168.29.76 33

Slide 34

Slide 34 text

まとめ 34

Slide 35

Slide 35 text

まとめ • CI/CDについて解説 • GitLab CI/CDの構築について⼀例を紹介 • 実際の使⽤例を通じて、GitLabのCI/CDの使⽤⽅法を解説 35

Slide 36

Slide 36 text

36