maetesのブログ

個人用Memoです

gitlab runnner についてまとめてみた

gitlab runnnerのインストール・登録・挙動について正確に理解をしたいため、AWS環境を利用して確認をしてみました。
今回、runnner登録時はどちらから登録するのか?ポートは?というところと、具体的にどんなことができるのか?どう表現すればできるのか?というところが不明確であったため確認をしています。

AWS環境上で自動構築

Template を流すだけで環境ができるようにしました。
これによりまっさらな環境を誰でもいつでも構築して、挙動の確認ができます。
gitlab のサイズが900MB近くと大きいことと、インストールに時間がかかるため、だいたい20~30分ぐらい構築には時間がかかります。
気長に待ちましょう。

AWSTemplateFormatVersion: "2010-09-09"
Description: gitlab
Parameters:
  Subnet1:
    Type: String
    Description: Subnet IDs for VPC
    Default: 'subnet-xxxxxxxx'
  SecurityGroup:
    Type: String
    Default: 'sg-xxxxxxxx'
    Description: SecurityGroup

Resources:
  gitlab:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: "ami-0ddea5e0f69c193a4" # Centos7, 7.9.2009, ap-northeast-1
      InstanceType: t2.medium
      KeyName: dev-key
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref Subnet1
          GroupSet: [ !Ref SecurityGroup ]
      Tags:
        - Key: "Name"
          Value: "dev-gitlab"
      UserData:
        Fn::Base64: |
            #!/bin/bash
            # hostname 設定
            hostnamectl set-hostname gitlab
            echo "preserve_hostname: true" >> /etc/cloud/cloud.cfg
            sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
            # install
            yum -y install curl policycoreutils-python openssh-server vim bash-completion
            curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
            public_ip=$(curl http://169.254.169.254/latest/meta-data/public-ipv4)
            EXTERNAL_URL="http://${public_ip}" yum install -y gitlab-ee
            shutdown -r now
  gitlabrunnner:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: "ami-0ddea5e0f69c193a4" # Centos7, 7.9.2009, ap-northeast-1
      InstanceType: t2.micro
      KeyName: dev-key
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref Subnet1
          GroupSet: [ !Ref SecurityGroup ]
      Tags:
        - Key: "Name"
          Value: "dev-gitlabrunnner"
      UserData:
        Fn::Base64: |
            #!/bin/bash
            # hostname 設定
            hostnamectl set-hostname gitlabrunnner
            echo "preserve_hostname: true" >> /etc/cloud/cloud.cfg
            # install
            yum -y install curl vim bash-completion
            curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
            export GITLAB_RUNNER_DISABLE_SKEL=true; yum -y install gitlab-runner
            shutdown -r now

構築後gitlab runnner 設定

構築が完了したらgitlab とgitlab runnner の紐付けを実施します。

  1. gitlab のWeb 画面の特定リポジトリで登録するための情報を取得します。(repository 内 setting CI/CD -> Runnners に記載)
  2. runnner 側のインスタンスで下記コマンドを実行
gitlab-runner register

CI/CD の実行

設定が完了したので実際にCI/CDが実行できることを試してみます。

一番簡単なecho するだけの例

git commit/push で見てやるとrunnner が動いているのが確認できます
.gitlab-ci.yml

job-name:
  script:
    - echo "This is test1" >> /tmp/test

もう少し複雑な例1: pushしてきたbranch がMarge できるレベルの品質かどうかを確かめる(CI的)

例えば特定のファイルを検索してsort uniq した結果重複行があるかをチェックします

#!/bin/bash
result=$(cat targetfile | sort | uniq -d)
if [[ -n "${result}" ]]; then
  echo "target file has duplicate row"
  exit 1
fi
echo "target file is fine"
job-name:
  script:
    - bash duplicate_check.sh

というわけでスクリプト化してもっと複雑な例も作っていけそうです。

gitlab runnnerの挙動

gitlab runnnerの挙動としては、インストール場所に基づきますがrootでインストールした場合は下記のような場所にrepositoryに関するファイルが生成されます
/home/gitlab-runner/builds/yi84sU-f/0/root/repository_name/test.sh

感想

runnner は結構汎用性があり色々なことができそうです。
実装も今回bash でかきましたがそれ以外にも色々とコマンド実行をさせることで自動化を実現できます。
OSSでここまでできるというのは嬉しいですね。

AWSインスタンスを停止したり起動したりする場合のメモ

IPが変わる可能性があります。そんな場合は下記を実行してください * /etc/gitlab/gitlab.rbを開き external url を書き換えてgitlab-ctl reconfigure