Share
Embed
GitLabでCI/CDを動かしてみよう
CI/CDってよく聞くけれど、実はどうやって動いているのか分からない人のためのGitLab CI/CD入門勉強会を開催します。今回の勉強会では、GitLabを使ってCI/CDを実際に動かしながら、その仕組みや使い方を丁寧に解説します。GitLab本体のセットアップ方法から始めて、ランナーの登録やYAMLファイルの基本的な書き方、ジョブとパイプラインの構成、よく使われる実例までを順を追って紹介します。自動化の基礎を身につけたい初心者や、CI/CDに一歩踏み出したいエンジニアにおすすめの内容です。
とことんDevOps
June 26, 2025
Transcript
36 slides
-
⾃⼰紹介 • ⼤内 明(おおうち あきら) • 技術部所属 • 主に、物理サーバー・ネットワーク、VMwareの仮想基盤の 構築運⽤保守などを⻑く担当
• 個⼈的には、Raspberry Piを使ったシステムや⼯作の作成で 遊んでいる 2 -
GitLab • GitLab Inc.が開発したウェブ型のGitリポジトリマネージャ • オープンソースで開発 • 商⽤版とコミュニティ版がある • GitHubみたいなサービスを⾃分で運⽤できる(※)
• Issue管理 • プルリクエスト(Gitlabではマージリクエスト) • Wiki • CI/CD • ※GitLab⾃⾝がGitHubのようにサービスとしても提供 4 -
CI/CDとは • 以下の略称 • Continuous Integration(継続的インテグレーション) • Continuous Delivery(継続的デリバリー) •
もしくはContinuous Deploy(継続的デプロイ) • アプリケーションの構築・テスト・展開を ⾃動化していくうえでの⼿法 5 -
CIのようす 7 リポジトリ の メインライン ビルド テスト (4)マージ (1)作業ブラ ンチ作成
(2)開発もしくはテスト 結果に応じた修正 (3)プッシュ ビルド テスト ビルド テスト ビルド/テスト 定期実⾏もアリ レビュー PullRequest (MergeRequest)の ようにレビューを 挟むこともある -
CD(継続的デリバリー) • CIでビルド・テストされた結果をいつでも確実にリリース できるように、成果物を⾃動で準備する⼿法 • 継続的デリバリーは、リリースは⼿動で⾏う • (Continuous Delivery) •
継続的デプロイは、リリースまでふくめて⾃動で⾏う • (Continuous Deploy) 8 -
GitLabにおけるCI/CD • GitLab CI/CDという機能が提供されている • GitLabにRunnerと呼ばれるCI/CD実⾏⽤の環境を登録 • Windows・Mac・Linuxに対応 • Runnerのインストール⽅法も、パッケージインストールやDockerや
k8sなどに対応 • プロジェクトのリポジトリに、.gitlab-ci.ymlファイルという 構成ファイルを配置して、実⾏内容を記述する 9 -
やること • お試し環境として、Ubuntu ServerとDocker Engineを構築 • Dockerは、公式のセットアップ⼿順に従う • https://docs.docker.com/engine/install/ubuntu/ •
GitLabをDockerコンテナでセットアップ • 今回はHTTPSではなくHTTPアクセスで⽤意 • GitLab Runnerをコンテナでセットアップ • それぞれ、Docker Composeの例を後述 11 -
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 -
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' -
GitLab管理者のパスワード取得 • コンテナが起動したら、rootパスワードを取得する • 表⽰されたパスワードを使⽤して、rootユーザーでログイン • パスワードを変更 14 akkie@m75q-2:~/gitlab$ docker
compose exec gitlab bash (コンテナ内で)# cat /etc/gitlab/initial_root_password -
GitLab CI/CD Runnerの登録準備 • GitLabの管理者エリアの「CI/CD」→「Runner」を開く • 「Create instance runner」をクリック •
「タグのないジョブの実⾏」にチェックを⼊れる • 「Runnerを作成」をクリック • ステップ1の「Runner認証トークン」をコピーしてメモする 15 -
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 (次のページの内容を参考に記述) -
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 -
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 -
dnsmasqのhostsファイル管理 • 弊社内で使⽤中のものをベースに解説 • dnsmasq(DNSサーバー)で使⽤されるhostsファイルを Gitで管理 • GitLabに配置することで、Web UIでDNSレコードの編集が可能に •
ものぐさな運⽤! • GitLabでCI/CDを設定することで、⾃動デプロイを可能に • 書式エラーチェックのようなCIのテスト的な要素はない • Ansibleを使⽤してhostsファイルを配布 • CDの部分が主な使い⽅かも 21 -
⼿順 • テスト⽤dnsmasqサーバーの⽤意 • VMを⽤意 • リポジトリの作成 • hostsファイル •
Ansible Playbook • .gitlab-ci.yml • GitLabのCI/CDの設定 • 実⾏テスト 22 -
テスト⽤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 -
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 -
.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 -
.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 -
GitLabプロジェクトのCI/CD設定(1/2) • 設定→CI/CD→変数 • 3つの変数を作成する • いずれもファイルタイプで作成 • SSH_PRIVATE_KEY •
dnsmasqサーバーで⽣成したSSH秘密鍵 • 最後に空⾏を含めること! 29 -
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 -
• 最終的な中⾝ • 作成した演習⽤リポジトリを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 -
編集してみよう • GitLabでhostsファイルの編集画⾯を開いて、適当にレコード を追加する • 以下の図では192.168.29.102 zabbix を追加 • 変更をコミットして、CI/CDを確認
• CDのジョブが完了したら、 追加したレコードの名前引きを確認 • (例)dig zabbix @192.168.29.76 33