コンテナーによる Klocwork の設定 (Linux)

Klocwork 解析を実行するためのコンテナーの設定

前提条件:

  • サーバーが実行中の場合はポートを開きます
  • 実行するアンダーライニングシステムに応じて、以下のいずれかの docker ファイルを選択してビルドします。RUN wget URL の場所を kwbuildtools パッケージの有効な場所に置き換えます。示された行に、プロジェクトをビルドするために必要な追加の依存関係を追加できます。

: Debian ベースの Linux (Ubuntu 20.04 など) で Klocwork 解析を実行する:

FROM ubuntu:20.04
 
# Install Klocwork Dependencies
RUN dpkg --add-architecture i386
RUN apt update
RUN apt install -y lib32ncurses6 lib32ncurses6 libncursesw5:i386 numactl libaio1 lsb-core libc6:i386 libgcc1:i386
 
 
# Install compiler dependencies. This will depend on the source being built
# This example installs gcc/g++ 8
RUN apt install -y build-essential gcc-8 g++-8 gcc-8-multilib g++-8-multilib
 
# Get Klocwork build tools package and unzip to a location
# This example uses 'wget' to get the installer from an internally hosted Klocwork Portal
RUN apt install -y  wget unzip
RUN mkdir /klocwork
WORKDIR /klocwork
RUN wget http://klocwork.<yourURL.com>:8080/portal/downloads/kwbuildtools.20.2.0.89.linux64.zip && unzip kwbuildtools.20.2.0.89.linux64.zip && rm kwbuildtools.20.2.0.89.linux64.zip

例 2: yum ベースの Linux (Fedora 32 など) で Klocwork 解析を実行する:

FROM fedora:32
 
# Install Klocwork Dependencies
RUN yum update -y
RUN yum install -y redhat-lsb-core.i686 libaio numactl-libs libnsl libnsl.i686 glibc.i686 libgcc.i686
 
# Install compiler dependencies. This will depend on the source being built
# This example installs gcc/g++
RUN yum install -y gcc-c++
 
# Get Klocwork build tools package and unzip to a location
# This example uses 'wget' to get the installer from an internally hosted Klocwork Portal
RUN yum install -y wget unzip
RUN mkdir /klocwork
WORKDIR /klocwork
RUN wget http://klocwork.<yourURL.com>:8080/portal/downloads/kwbuildtools.20.2.0.89.linux64.zip && unzip kwbuildtools.20.2.0.89.linux64.zip && rm kwbuildtools.20.2.0.89.linux64.zip

上記のいずれかの例を完了した後、イメージをビルドします。

docker build --tag klocwork-buildtools:20.2 .

これにより、ベースイメージ klocwork-buildtools:20.2 がビルドされます。

データの永続性

Klocwork 解析を実行する際に、Klocwork ビルドスペックと解析データ (buildspec、tracefiles、tables、.kwlp/.kwps、projects_root など) をコンテナーの外部に保存することをお勧めします。kwbuildproject コマンドで --increment パラメーターを使用する場合は、今後はどの解析でも --tables-directory を維持する必要があります。同様に、ネイティブビルドが増分である場合、今後はどのビルドでもビルドスペックを維持する必要があります。次の例では、これらのファイルをホストマシン上の /project/klocwork_data フォルダーに出力します。イメージがビルドされたら、次のものでコンテナーを実行できます。

docker run --rm -v /project/src:/project/src -v /project/klocwork_data:/klocwork_data klocwork-buildtools:20.2 sh -c "cd /project/src && /klocwork/kwbuildtools/bin/kwinject -w -o /klocwork_data/kwinject.out make && /klocwork/kwbuildtools/bin/kwbuildproject --url http://klocwork.<yourURL.com>:8080/<project> -o /klocwork_data/tables kwinject.out -f &&  kwadmin load --url http://klocwork.<yourURL.com>:8080 load <project> /klocwork_data/tables"

これにより、解析するプロジェクトと Klocwork 出力データがコンテナーの外部マウントにマウントされます。分かりやすくするために、保守を目的として sh -c "..." セクションをスクリプトファイルに抽出できます。たとえば、次の build.sh ファイルを作成します。

#!/bin/sh
cd /project/src
/klocwork/kwbuildtools/bin/kwinject -w -o /klocwork_data/kwinject.out make
/klocwork/kwbuildtools/bin/kwbuildproject --url http://klocwork.<yourURL.com>:8080/<project> -o /klocwork_data/tables -f
/klocwork_data/kwinject.out
/klocwork/kwbuildtools/bin/kwadmin --url http://klocwork.<yourURL.com>:8080 load <project> /klocwork_data/tables

続いて、次を実行します。

docker run --rm -v /project/src:/project/src -v /project/klocwork_data:/klocwork_data klocwork-buildtools:20.2 --entrypoint build.sh

Klocwork サーバーを実行するためのコンテナーの設定

以下は、必要な Klocwork とコンパイラの依存関係をインストールするために実行が必要なコマンドの例と、Klocwork ビルドツールパッケージをインストールする方法です。

FROM ubuntu:20.04
 
# Install Klocwork Dependencies
RUN dpkg --add-architecture i386
RUN apt update
RUN apt install -y lib32ncurses6 lib32ncurses6 libncursesw5:i386 numactl libaio1 lsb-core libc6:i386 libgcc1:i386
 
 
# Install compiler dependencies. This will depend on the source being built
RUN apt install -y build-essential gcc-8 g++-8 gcc-8-multilib g++-8-multilib
 
# Get Klocwork build tools package and unzip to a location
# This example uses 'wget' to get the installer from an internally hosted Klocwork Portal
# Note: server install cannot be done as the root user. This will create a user 'klocwork'
RUN apt install -y  wget unzip
RUN useradd -u 10066 -d /home -s /bin/bash klocwork &&  groupmod -g 1005 klocwork
RUN mkdir /klocwork
RUN chown -R klocwork:klocwork /klocwork
 
USER klocwork
 
WORKDIR /klocwork
RUN wget <download_server>/kw-server-installer.20.2.0.89.linux64.sh
RUN sh kw-server-installer.20.2.0.89.linux64.sh -a server KlocworkServer
RUN rm kw-server-installer.20.2.0.89.linux64.sh

ここで、<download_server> は Klocwork サーバーのインストールファイルの場所です。

次に、イメージを作成する必要があります。

docker build --tag klocwork-server:20.2 .

サーバーデータを維持するには、ホストマシン上に Klocwork サーバーの projects_root フォルダーを保持するフォルダーを設定します。例: /data/klocwork/server_data。フォルダーが設定されたら、上記の Dockerfile で設定されたグループ ID で作成込むためのパーミッションが付与される必要があります。この例では、グループ ID は 1005 です。

chown -R 1005:1005 /data/klocwork/server_data

サーバーは、対話型または非対話型の 2 つの方法で設定できます。以下の例では、Klocwork Web ポート 8086 と Klocwork データベースポート 3386 を使用していることに注意してください。

対話型

ドッカーにより、コンテナーを対話型モードで実行できます。これは、コンテナーの実行中にコンテナー内でコマンドを実行できることを意味します。これを行うには、次を実行します。

docker run -d -i -t -p 8086:8086 -v /data/klocwork/server_data:/klocwork/server_data --name klocwork_server klocwork-server:20.2

サーバーが実行されたら、次を使用してコンテナーに接続できます。

docker exec -t -i klocwork_server /bin/bash

コンテナーに接続されたら、サーバーを設定できます。

/klocwork/server/bin/kwservice -r /klocwork/server_data/projects_root setup
/klocwork/server/bin/kwservice -r /klocwork/server_data/projects_root set-service-property license host <license_host>
/klocwork/server/bin/kwservice -r /klocwork/server_data/projects_root set-service-property klocwork port 8086
/klocwork/server/bin/kwservice -r /klocwork/server_data/projects_root set-service-property database port 3386
/klocwork/server/bin/kwservice -r /klocwork/server_data/projects_root start
exit

非対話型

コンテナーを非対話型モードで実行する場合は、次を実行します。

docker run -d -p 8086:8086 -v /data/klocwork/server_data:/klocwork/server_data --name klocwork_server klocwork-server:20.2 --entrypoint server.sh

ここで、server.sh は次のとおりです。

/klocwork/server/bin/kwservice -r /klocwork/server_data/projects_root setup
/klocwork/server/bin/kwservice -r /klocwork/server_data/projects_root set-service-property license host <license_host>
/klocwork/server/bin/kwservice -r /klocwork/server_data/projects_root set-service-property klocwork port 8086
/klocwork/server/bin/kwservice -r /klocwork/server_data/projects_root set-service-property database port 3386
/klocwork/server/bin/kwservice -r /klocwork/server_data/projects_root start
tail -f /dev/null

サーバーが設定されたら、あとは kwservice start コマンドを実行するだけです。

docker run -d -p 8086:8086 -v /data/klocwork/server_data:/klocwork/server_data --name klocwork_server klocwork-server:20.2 sh -c "/klocwork/server/bin/kwservice -r /klocwork/server_data/projects_root start && tail -f /dev/null"

Perforce はここでも役に立ちます。Klocwork によるコンテナーの設定または使用について支援が必要な場合は、静的コード解析プロフェッショナルサービスに問い合わせて、サービス契約による支援について相談してください。