概要
イメージをビルドしビルドしたイメージからアプリを起動しそのアプリに対してテストするみたいな流れを GItlab CI でやってみます
今回 Web アプリは Python を使っていますが好きな言語のアプリで OK です
環境
- Gitlab 18.2.6
- Gitlab Runner 18.2.2
- Python 3.12.11
Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
flask = "*"
[dev-packages]
[requires]
python_version = "3.12"
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, World!"
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0")
Dockerfile
FROM python:3.12.11-slim-bookworm
# 作業ディレクトリを設定
WORKDIR /app
# 必要なファイルをコンテナにコピー
COPY Pipfile Pipfile
COPY Pipfile.lock Pipfile.lock
COPY app.py app.py
# 必要なPythonパッケージをインストール
RUN pip install pipenv
RUN pipenv install
# アプリケーションを起動
CMD ["pipenv", "run", "python", "app.py"]
.gitlab-ci.yml
stages:
- build # ビルドステージ
- test # テストステージ
build:
stage: build
image:
name: moby/buildkit:rootless # BuildKit を使用するための Docker イメージ
entrypoint: [""] # デフォルトのエントリーポイントを無効化
variables:
BUILDKITD_FLAGS: --oci-worker-no-process-sandbox # BuildKit の設定
before_script:
# Docker 認証情報を設定
- mkdir -p ~/.docker
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > ~/.docker/config.json
script:
# BuildKit を使用して Docker イメージをビルドし、GitLab Container Registry にプッシュ
- |
buildctl-daemonless.sh build \
--frontend dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--output type=image,name=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA,push=true
app:
stage: test
services:
# ビルドした Docker イメージをサービスとして起動
- name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
alias: testapp # サービスに "testapp" というホスト名を割り当て
script:
# サービスが起動するまで待機
- echo "Waiting for the service to be ready..."
- >
for i in {1..30}; do
curl -s http://testapp:5000 && break || sleep 1; # サービスが応答するまで最大 30 秒間リトライ
done
- echo "Service is ready." # サービスが起動したことを確認
validate:
stage: test
image: curlimages/curl:latest # curl を使用するための軽量イメージ
services:
# ビルドした Docker イメージを再度サービスとして起動
- name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
alias: testapp # サービスに "testapp" というホスト名を割り当て
script:
# サービスに対してレスポンスを検証
- echo "Running validation tests..."
- |
RESPONSE=$(curl -s http://testapp:5000) # サービスにリクエストを送信しレスポンスを取得
if [ "$RESPONSE" = "Hello, World!" ]; then
echo "Validation passed!" # レスポンスが期待通りの場合
else
echo "Validation failed: Expected 'Hello, World!' but got '$RESPONSE'" # レスポンスが期待と異なる場合
exit 1 # ジョブを失敗させる
fi
最後に
Gitlab には Ultimate ライセンスを使っていると DAST を使えるのですがそうじゃないライセンスだと使えません
そんな場合に自分で DAST 的なことをする必要があるので今回のような流れで実装できます
次回は nikto を組み合わせてセキュリティテストしてみます
0 件のコメント:
コメントを投稿