LoginSignup
2
1

More than 1 year has passed since last update.

WSL2 based Dockerを使用したGitlabの構築

Last updated at Posted at 2021-01-28

旧バージョン

docker-compose.yaml
#docker-composeのバージョン
#https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/
version: '3.8'
services:
  gitlab:
    #インストール時点の最新版にすることを推奨
    image: 'gitlab/gitlab-ce:13.8.0-ce.0'
    container_name: gitlab
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        #公式ドキュメントを参照してください
        # https://docs.gitlab.com/omnibus/docker/README.html
        # https://docs.gitlab.com/omnibus/docker/README.html#install-gitlab-using-docker-compose
        # https://docs.gitlab.com/omnibus/docker/README.html#pre-configure-docker-container
        external_url 'http://localhost:10080'
        #gitlab_rails['gitlab_host'] = 'http://localhost:10022'
        gitlab_rails['gitlab_shell_ssh_port'] = 10022
        nginx['listen_addresses'] = ['0.0.0.0', '[::]']
        # 以降、カスタマイズ
        # https://github.com/gitlabhq/omnibus-gitlab/blob/master/files/gitlab-config-template/gitlab.rb.template
        # Maven(Gradle)パッケージレジストリの有効化
        gitlab_rails['packages_enabled'] = true
        gitlab_rails['packages_storage_path'] = "/var/opt/gitlab/gitlab-rails/shared/packages"
        # grafana監視を使用
        grafana['disable_login_form'] = false
        grafana['allow_user_sign_up'] = true
        grafana['admin_password'] = 'grafana'
        grafana['metrics_enabled'] = true
        grafana['metrics_basic_auth_username'] = 'grafana_metrics'
        grafana['metrics_basic_auth_password'] = 'grafana'
    ports:
      - '10080:10080'
      - '443:443'
      - '10022:22'
    volumes:
      - type: volume
        source: gitlab-config
        target: /etc/gitlab
        volume:
          nocopy: true
      - type: volume
        source: gitlab-log
        target: /var/log/gitlab
        volume:
          nocopy: true
      - type: volume
        source: gitlab-data
        target: /var/opt/gitlab
        volume:
          nocopy: true
  runner:
    build:
      context: .
      dockerfile: gitlab-runner.Dockerfile
    container_name: gitlab-runner
    environment:
      http_proxy: ***
      https_proxy: ***
    restart: always
    volumes:
      - gitlab-runner-volume:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
volumes:
  gitlab-config:
  gitlab-log:
  gitlab-data:
  gitlab-runner-volume:

gitlab-runner.Dockerfile
#インストール時点の最新版にすることを推奨。うまく動作しない場合はubuntuにすること。
#https://hub.docker.com/r/gitlab/gitlab-runner/tags?page=1&ordering=last_updated
FROM gitlab/gitlab-runner:ubuntu-v13.8.0

ENV http_proxy=***
ENV https_proxy=***

RUN ["/bin/bash", "-c", "apt update"]
RUN ["/bin/bash", "-c", "apt -y install sshpass"]
RUN ["/bin/bash", "-c", "apt -y install openjdk-8-jdk"]

main.tf
terraform {
  # 本体のバージョン指定
  required_version = "~> 0.14"

  required_providers {
    gitlab = {
      source  = "gitlabhq/gitlab"
      version = "3.4.0"
    }
  }
}

provider "gitlab" {
  # Configuration options
  token    = ***
  base_url = "http://localhost:10080/api/v4/"
}


locals {
  #管理者一覧
  admininfo = {
    #ここの下に全員分足してください。左は社員番号、右はメールアドレスの@から左
    "user" = "prefix"
  }
  #一般ユーザ一覧
  userinfo = {
    "user" = "prefix"
  }
}

resource "gitlab_user" "admin" {

  for_each = local.admininfo

  name             = each.value
  username         = each.key
  email            = "${each.value}@foo.co.jp"
  is_admin         = true
  projects_limit   = 4
  can_create_group = true
  is_external      = false
  reset_password   = true
}

resource "gitlab_user" "user" {

  for_each = local.userinfo

  name             = each.value
  username         = each.key
  email            = "${each.value}@foo.co.jp"
  is_admin         = false
  projects_limit   = 2
  can_create_group = true
  is_external      = false
  reset_password   = true
}

resource "gitlab_group" "cicd_test" {
  name        = "cicd_test"
  path        = "cicd_test"
  description = "An example group"

  visibility_level = "internal"
}

// Create a project in the example group
resource "gitlab_project" "example" {
  name         = "example"
  description  = "example"
  namespace_id = gitlab_group.cicd_test.id

  visibility_level = gitlab_group.cicd_test.visibility_level
}

resource "gitlab_group_membership" "admin" {
  for_each = gitlab_user.admin

  group_id     = gitlab_group.cicd_test.id
  user_id      = each.value.id
  access_level = "maintainer"
}

resource "gitlab_group_membership" "user" {
  for_each = gitlab_user.user

  group_id     = gitlab_group.cicd_test.id
  user_id      = each.value.id
  access_level = "guest"
}

output "web_url" {
  value = gitlab_project.example.web_url
}

output "runners_token" {
  value = gitlab_project.example.runners_token
}


14.0 & oracleあり

docker-compose.yaml
#docker-composeのバージョン
#https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/
version: '3.8'
services:
  gitlab:
    #インストール時点の最新版にすることを推奨
    image: "gitlab/gitlab-ce:${GITLAB_TAG_VERSION:-14.0.0-ce.0}"
    container_name: gitlab
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        #公式ドキュメントを参照してください
        # https://docs.gitlab.com/omnibus/docker/README.html
        # https://docs.gitlab.com/omnibus/docker/README.html#install-gitlab-using-docker-compose
        # https://docs.gitlab.com/omnibus/docker/README.html#pre-configure-docker-container
        # = をつけてはいけない。正しいhostが参照できない場合がある
        external_url 'http://${GITLAB_HOST?err}:18080'
        #gitlab_rails['gitlab_host'] = 'http://${GITLAB_HOST?err}:18080'
        gitlab_rails['gitlab_shell_ssh_port'] = 10022
        #タイムゾーン設定
        gitlab_rails['time_zone'] = 'Asia/Tokyo'
        nginx['listen_addresses'] = ['0.0.0.0', '[::]']
        #nginx['listen_port'] = 18080
        #ChromeでsecureでないcookieがブロックされることによるInvalidAuthenticityToken(status code 422)対策。
        #https://gitlab.com/gitlab-org/gitlab-foss/-/issues/50393
        nginx['proxy_set_headers'] = {
          "X-Forwarded-Proto" => "http"
        }
        nginx['redirect_http_to_https'] = false
        nginx['redirect_http_to_https_port'] = 18080
        nginx['real_ip_trusted_addresses'] = ['${GITLAB_HOST?err}','127.0.0.1']
        # 以降、カスタマイズ
        # https://github.com/gitlabhq/omnibus-gitlab/blob/master/files/gitlab-config-template/gitlab.rb.template
        # [OPTION]Maven(Gradle)パッケージレジストリの有効化
        gitlab_rails['packages_enabled'] = true
        gitlab_rails['packages_storage_path'] = "/var/opt/gitlab/gitlab-rails/shared/packages"
        # [OPTION]grafana監視を使用
        grafana['disable_login_form'] = false
        grafana['allow_user_sign_up'] = true
        grafana['admin_password'] = 'grafana'
        grafana['metrics_enabled'] = true
        grafana['metrics_basic_auth_username'] = 'grafana_metrics'
        grafana['metrics_basic_auth_password'] = 'grafana'
        prometheus['scrape_configs'] = [
          {
          'job_name': 'example',
          'static_configs' => [ 'targets' => ['${GITLAB_HOST?err}:9252'], ],
          },
        ]
        #https://gitlab.com/gitlab-org/gitlab-foss/-/issues/35300
        prometheus['monitor_kubernetes'] = false
        pages_external_url 'http://${GITLAB_HOST?err}:18080'
        gitlab_pages['enable'] = true
        gitlab_pages['dir'] = "/var/opt/gitlab/gitlab-pages"
        gitlab_pages['log_directory'] = "/var/log/gitlab/gitlab-pages"
        gitlab_pages['access_control'] = true
        gitlab_pages['inplace_chroot'] = true
    ports:
      - '18080:18080'
      - '443:443'
      - '10022:22'
    volumes:
      - type: volume
        source: gitlab-config
        target: /etc/gitlab
        volume:
          nocopy: true
      - type: volume
        source: gitlab-log
        target: /var/log/gitlab
        volume:
          nocopy: true
      - type: volume
        source: gitlab-data
        target: /var/opt/gitlab
        volume:
          nocopy: true
  runner:
    build:
      context: .
      dockerfile: gitlab-runner.Dockerfile
      args:
        IMAGE_VERSION: ubuntu-v${RUNNER_TAG_VERSION:-14.0.0}
        PROXY_URL: ${PROXY_URL}
    image: koyama/jdk-runner:ubuntu-v${RUNNER_TAG_VERSION:-14.0.0}
    container_name: gitlab-runner
    restart: always
    ports:
      #9252=Prometheus
      - '9252:9252'
    volumes:
      - gitlab-runner-config:/etc/gitlab-runner
      - gitlab-runner-home:/home/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
  database:
   build:
     context: .
     dockerfile: oracle.Dockerfile
   container_name: oracle11
   shm_size: 2g # 共有メモリは1GB以上にしないとコンテナ起動時にエラー発生
   environment:
     - TZ=Asia/Tokyo
     - LANGUAGE=ja_JP.ja
     - LANG=ja_JP.UTF-8
     - NLS_LANG=Japanese_Japan.AL32UTF8 # sqlplusの日本語化用
     - ORACLE_PWD=oracle # sys,systemのパスワード
     - ORACLE_SID=XE
     - ORACLE_PDB=pdb1
   ports:
     - 1521:1521
   volumes:
     - /oradata:/opt/oracle/oradata # データの永続化
volumes:
  gitlab-config:
  gitlab-log:
  gitlab-data:
  gitlab-runner-config:
  gitlab-runner-home:

runner-dockerfile

#インストール時点の最新版にすることを推奨。うまく動作しない場合はubuntuにすること。
#https://hub.docker.com/r/gitlab/gitlab-runner/tags?page=1&ordering=last_updated

ARG IMAGE_VERSION=ubuntu-v13.10.0
ARG PROXY_URL

FROM gitlab/gitlab-runner:${IMAGE_VERSION}

ENV http_proxy=${PROXY_URL} https_proxy=${PROXY_URL}

#いちいち/bin/bashを入れなくても済むようにする
SHELL ["/bin/bash", "-o", "pipefail", "-c"]

#鍵認証がない検証環境と接続するためのパッケージ:sshpass
#ビルド用java:openjdk-8-jdk

RUN apt update && apt install -y \
    openjdk-8-jdk \
    && apt clean \
    && rm -rf /var/lib/apt/lists/*

oracle-dockerfile

FROM oracle/database:11.2.0.2-xe 

RUN yum -y install vi
RUN echo 'TZ="Asia/Tokyo"' > /etc/sysconfig/clock
RUN cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN echo 'LANG="ja_JP.UTF-8"' > /etc/sysconfig/i18n
RUN echo 'LC_CTYPE="ja_JP.utf8"' >> /etc/sysconfig/i18n
RUN yum reinstall -y glibc-common
RUN yum reinstall -y glibc
RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8

# ポート番号1521で起動
EXPOSE 1521

oracleビルド方法

※git bash を利用

git clone https://github.com/oracle/docker-images.git
cd oracle/docker-images/OracleDatabase/SingleInstance/dockerfiles
# ここで、oracle-xe-11.2.0-1.0.x86_64.rpm.zipを移動先フォルダに配置
./buildContainerImage.sh -v 11.2.0.2 -x -i

テストサンプル

build.gradle
plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation "com.oracle.database.jdbc:ojdbc6:11.2.0.4"
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}

test {
    useJUnitPlatform()
}
.gitlab-ci.yaml
image: openjdk:8u282-jdk-slim

default:
  tags:
    - shell
variables:
  GRADLE_OPTS: "-Dorg.gradle.daemon=false"

before_script:
  - export GRADLE_USER_HOME=`pwd`/.gradle

build:
  stage: build
  script: ./gradlew --build-cache assemble
  cache:
    key: "$CI_COMMIT_REF_NAME"
    policy: push
    paths:
      - build
      - .gradle

test:
  stage: test
  script: ./gradlew test
  cache:
    key: "$CI_COMMIT_REF_NAME"
    policy: pull
    paths:
      - build
      - .gradle
  artifacts:
    paths:
      - ./build/reports/
    reports:
      junit: ./build/test-results/test/TEST-MainTest.xml
main.java
import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static List<Integer> getList() throws SQLException {
        final String URL = "jdbc:oracle:thin:@192.168.1.4:1521:XE";
        final String USER = "system";
        final String PASS = "oracle";
        final String CONN_FACTORY_CLASS_NAME = "oracle.jdbc.pool.OracleDataSource";

        PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();

        pds.setConnectionFactoryClassName(CONN_FACTORY_CLASS_NAME);
        pds.setURL(URL);
        pds.setUser(USER);
        pds.setPassword(PASS);
        pds.setConnectionPoolName("JDBC_UCP_POOL");

        // Default is 0. Set the initial number of connections to be created
        // when UCP is started.
        pds.setInitialPoolSize(5);
        pds.setMinPoolSize(5);
        pds.setMaxPoolSize(20);
        pds.setTimeoutCheckInterval(5);
        pds.setInactiveConnectionTimeout(10);

        List<Integer> list = new ArrayList<>();
        final String SQL = "select * from HR.EMPLOYEES";
        try (Connection conn = pds.getConnection();
             PreparedStatement ps = conn.prepareStatement(SQL);
             ResultSet rs = ps.executeQuery()) {
            while (rs.next()) {
                list.add(rs.getInt("EMPLOYEE_ID"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            System.out.println("finished");
        }
        return list;
    }

    public static void main(String[] args) throws SQLException {
        System.out.println(getList().stream().collect(Collectors.summarizingInt(e->e)));
    }
}

test.java
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.sql.SQLException;
import java.util.stream.Collectors;

import static org.junit.jupiter.api.Assertions.*;

class MainTest {

    @Test
    void getList() throws SQLException {
        Assertions.assertEquals(Main.getList().stream().count(),107);
        System.out.println(Main.getList().stream().collect(Collectors.summarizingInt(e->e)));
    }
}

結果画像

image.png

image.png

image.png

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1