Bambooから移行する
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab.com、GitLab Self-Managed、GitLab Dedicated
Atlassian BambooからGitLab CI/CDに移行するには、Bamboo UIからエクスポートされた、または仕様リポジトリに保存されているBamboo仕様YAML構成を変換します。
主な移行の考慮事項
| 構成の側面 | Bamboo | GitLab CI/CD。 | 移行タスク |
|---|---|---|---|
| 設定ファイル | Bamboo仕様(JavaまたはYAML) | .gitlab-ci.ymlファイル | 仕様をGitLab YAML構文に変換する |
| 変数の構文 | ${bamboo.variableName} | $VARIABLE_NAME | スクリプト内のすべての変数の参照を更新します |
| 実行環境 | エージェント(ローカルまたはリモート) | executor付きのRunner | Runnerをインストールして構成する |
| アーティファクトの共有 | サブスクリプション付きの名前付きアーティファクト | ステージ間の自動継承 | アーティファクトの構成を簡素化する |
| デプロイ | 個別のデプロイプロジェクト | 環境を備えたデプロイメントジョブ | 単一のパイプラインでビルドとデプロイを組み合わせる |
設定例
Bamboo仕様のエクスポート
次の例は、UIからのBamboo仕様YAMLのエクスポートと、それに対応するGitLab CI/CDを示しています。
Bambooは、プロジェクトに複数のプランが含まれ、プランがステージとジョブを定義し、ジョブが個々のタスクを実行する、ネストされた階層を介してビルドを編成します。プロジェクトは、複数のプランがアクセスできる変数、認証情報、リポジトリ接続などの共有リソースのコンテナとして機能します。
UIからのBamboo仕様のエクスポートには、この完全な階層に加えて、許可、通知、プロジェクト設定などの管理メタデータが含まれています。
エクスポートをレビューする際は、これらの移行に不可欠な要素に焦点を当ててください:
- ジョブとタスク: 実際のビルドコマンドとスクリプト
- ステージングの定義: シーケンスの実行順序と依存関係
- 変数とアーティファクト: ジョブ間で共有されるデータとファイル
- トリガーと条件: ビルドの実行時期を決定するルール
version: 2
plan:
project-key: AB
key: TP
name: test plan
stages:
- Default Stage:
manual: false
final: false
jobs:
- Default Job
Default Job:
key: JOB1
tasks:
- checkout:
force-clean-build: false
description: Checkout Default Repository
- script:
interpreter: SHELL
scripts:
- |-
ruby -v # Print out ruby version for debugging
bundle config set --local deployment true # Install dependencies into ./vendor/ruby
bundle install -j $(nproc)
rubocop
rspec spec
description: run bundler
artifact-subscriptions: []
repositories:
- Demo Project:
scope: global
triggers:
- polling:
period: '180'
branches:
create: manually
delete: never
link-to-jira: true
notifications: []
labels: []
dependencies:
require-all-stages-passing: false
enabled-for-branches: true
block-strategy: none
plans: []
other:
concurrent-build-plugin: system-default
---
version: 2
plan:
key: AB-TP
plan-permissions:
- users:
- root
permissions:
- view
- edit
- build
- clone
- admin
- view-configuration
- roles:
- logged-in
- anonymous
permissions:
- view
...GitLab CI/CDは、ネストされた複雑さを排除します。代わりに、各リポジトリには、すべてのステージとジョブを定義する単一の.gitlab-ci.ymlファイルが含まれています。
default:
image: ruby:latest
stages:
- default-stage
job1:
stage: default-stage
script:
- ruby -v # Print out ruby version for debugging
- bundle config set --local deployment true # Install dependencies into ./vendor/ruby
- bundle install -j $(nproc)
- rubocop
- rspec specジョブとタスク
GitLabとBambooの両方で、同じステージ内のジョブは並行して実行されます。ただし、ジョブの実行前に満たす必要のある依存関係がある場合を除きます。
Bambooで実行できるジョブの数は、Bambooエージェントの可用性とBambooライセンスのサイズによって異なります。
GitLab CI/CDでは、並列ジョブの数は、GitLabインスタンスとRunnerに設定された並行処理に統合されたRunnerの数によって異なります。
Bambooでは、ジョブはタスクで構成されています。これらは、スクリプトとして実行される一連のコマンド、またはソースコードのチェックアウト、アーティファクトのダウンロード、およびAtlassianタスクマーケットプレイスで利用できるその他のタスクのような事前定義されたタスクにすることができます。
version: 2
#...
Default Job:
key: JOB1
tasks:
- checkout:
force-clean-build: false
description: Checkout Default Repository
- script:
interpreter: SHELL
scripts:
- |-
ruby -v
bundle config set --local deployment true
bundle install -j $(nproc)
description: run bundler
other:
concurrent-build-plugin: system-defaultGitLabでのタスクに相当するものは、scriptです。これは、Runnerが実行するコマンドを指定します。CI/CDテンプレートとCI/CDコンポーネントを使用すると、すべてを自分で記述しなくても、パイプラインを構成できます。
job1:
script: "bundle exec rspec"
job2:
script:
- ruby -v
- bundle config set --local deployment true
- bundle install -j $(nproc)コンテナイメージ
次の例は、BambooのdockerキーワードがGitLabのimageキーワードにどのように変換されるかを示しています。
ビルドとデプロイは、デフォルトでBambooエージェントネイティブのオペレーティングシステムで実行されますが、dockerキーワードを使用してコンテナで実行するように構成できます。
version: 2
plan:
project-key: SAMPLE
name: Build Ruby App
key: BUILD-APP
docker: alpine:latest
stages:
- Build App:
jobs:
- Build Application
Build Application:
tasks:
- script:
- # Run builds
docker:
image: alpine:edgeGitLab CI/CDでは、imageキーワードのみが必要です。
default:
image: alpine:latest
stages:
- build
build-application:
stage: build
script:
- # Run builds
image:
name: alpine:edge変数
次の例は、変数の定義とアクセスにおける構文の違いを示しています。
Bambooには、アクセスパターンが異なるさまざまな変数のタイプがあります。システム変数は${system.variableName}を使用し、その他の変数は${bamboo.variableName}を使用します。
スクリプトタスクでは、ドットはアンダースコアに変換されます。たとえば、${bamboo.variableName}は$bamboo_variableNameになります。
variables:
username: admin
releaseType: milestone
Default job:
tasks:
- script: echo '$bamboo_username is the DRI for $bamboo_releaseType'GitLab CI/CDでは、変数は$VARIABLE_NAMEを使用して、通常のShellスクリプト変数のようにアクセスされます。Bambooのシステム変数およびグローバル変数のように、GitLabには、すべてのジョブで使用できる定義済みのCI/CD変数があります。
variables:
DEFAULT_VAR: "A default variable"
job1:
variables:
JOB_VAR: "A job variable"
script:
- echo "Variables are '$DEFAULT_VAR' and '$JOB_VAR'"条件とトリガー
これらの例は、Bambooの条件とトリガーがGitLabのルールにどのように変換されるかを示しています。
Bambooには、コードの変更、スケジュール、他のプランの結果、またはオンデマンドに基づいてビルドをトリガーするためのさまざまなオプションがあります。プランは、新しい変更についてプロジェクトを定期的にポーリングするように構成できます。
tasks:
- script:
scripts:
- echo "Hello"
conditions:
- variable:
equals:
planRepository.branch: development
triggers:
- polling:
period: '180'GitLab CI/CDパイプラインは、コードの変更、スケジュール、またはAPIコールに基づいてトリガーされます。パイプラインはポーリングを使用しません。
job:
script: echo "Hello, Rules!"
rules:
- if: $CI_COMMIT_REF_NAME == "development"
workflow:
rules:
- changes:
- .gitlab/**/**.md
when: neverアーティファクト
GitLabとBambooの両方で、artifactsキーワードを使用してジョブアーティファクトを定義できます。
Bambooでは、アーティファクトは名前、場所、パターンで定義されます。アーティファクトを他のジョブおよびプランと共有したり、アーティファクトをサブスクリプションするジョブを定義したりできます。
artifact-subscriptionsは、同じプラン内の別のジョブからアーティファクトにアクセスするために使用され、artifact-downloadは、異なるプラン内のジョブからアーティファクトにアクセスするために使用されます。
version: 2
# ...
Build:
# ...
artifacts:
- name: Test Reports
location: target/reports
pattern: '*.xml'
required: false
shared: false
- name: Special Reports
location: target/reports
pattern: 'special/*.xml'
shared: true
Test app:
artifact-subscriptions:
- artifact: Test Reports
destination: deploy
# ...
Build:
# ...
tasks:
- artifact-download:
source-plan: PROJECTKEY-PLANKEYGitLabでは、前のステージで完了したジョブからのすべてのアーティファクトがデフォルトでダウンロードされます。
stages:
- build
pdf:
stage: build
script: #generate XML reports
artifacts:
name: "test-report-files"
untracked: true
paths:
- target/reportsこの例では:
- アーティファクトの名前は明示的に指定されていますが、CI/CD変数を使用して動的にすることができます。
untrackedキーワードは、アーティファクトがGitの追跡されていないファイルも含むように設定し、pathsで明示的に指定されたファイルとともに設定します。
キャッシュ
Bambooでは、Gitキャッシュを使用してビルドを高速化できます。Gitキャッシュは、Bamboo管理設定で構成され、Bambooサーバーまたはリモートエージェントに保存されます。
GitLabは、Gitキャッシュとジョブキャッシュの両方をサポートしています。キャッシュは、cacheキーワードを使用してジョブごとに定義されます:
test-job:
stage: build
cache:
- key:
files:
- Gemfile.lock
paths:
- vendor/ruby
- key:
files:
- yarn.lock
paths:
- .yarn-cache/
script:
- bundle config set --local path 'vendor/ruby'
- bundle install
- yarn install --cache-folder .yarn-cache
- echo Run tests...デプロイ
次の例は、BambooのデプロイプロジェクトをGitLabのデプロイメントジョブに変換する方法を示しています。
Bambooには、デプロイ環境へのアーティファクトの追跡、フェッチ、およびデプロイを行うためのビルドプランにリンクするデプロイプロジェクトがあります。プロジェクトを作成するときは、それをビルドプランにリンクし、デプロイ環境とデプロイを実行するためのタスクを指定します。
deployment:
name: Deploy ruby app
source-plan: build-app
release-naming: release-1.0
environments:
- Production
Production:
tasks:
- # scripts to deploy app to production
- ./.ci/deploy_prod.shGitLab CI/CDでは、環境にデプロイするか、リリースを作成するデプロイメントジョブを作成できます。
deploy-to-production:
stage: deploy
script:
- # Run Deployment script
- ./.ci/deploy_prod.sh
environment:
name: production代わりにリリースを作成するには、releaseキーワードとglab CLIツールを使用して、Gitタグ付けのリリースを作成します:
release_job:
stage: release
image: registry.gitlab.com/gitlab-org/cli:latest
rules:
- if: $CI_COMMIT_TAG # Run this job when a tag is created manually
script:
- echo "Building release version"
release:
tag_name: $CI_COMMIT_TAG
name: 'Release $CI_COMMIT_TAG'
description: 'Release created using the CLI.'セキュリティスキャン
Bambooは、Atlassian Marketplaceで提供されているサードパーティのタスクに依存して、セキュリティスキャナーを実行します。
GitLabは、SDLCのすべての部分で脆弱性を検出するためのセキュリティスキャナーを提供します。たとえば、SASTスキャンをパイプラインに追加するには、テンプレートを使用して、これらのスキャナーをGitLabに追加できます:
include:
- template: Jobs/SAST.gitlab-ci.ymlCI/CD変数を使用すると、セキュリティスキャナーの動作をカスタマイズできます。
シークレット管理
Bambooのシークレット管理は、共有認証情報、またはAtlassianマーケットプレイスからのサードパーティアプリケーションを使用して処理されます。
GitLabでのシークレット管理の場合、サポートされている外部サービスのインテグレーションを使用できます。これらのサービスは、GitLabプロジェクトの外部にシークレットを安全に保存しますが、サービスのサブスクリプションが必要です。
GitLabは、OIDC認証をサポートする他のサードパーティサービスに対してもOIDC認証をサポートしています。
さらに、CI/CD変数に保存することで、ジョブで認証情報を使用できるようにすることができます。ただし、プレーンテキストで保存されたシークレットは、偶発的な露出の影響を受けやすくなります。機密情報は常にマスクされた保護された変数に保存する必要があります。これにより、リスクの一部が軽減されます。
プロジェクトへのアクセス権を持つすべてのユーザーに公開されている.gitlab-ci.ymlファイルに、変数としてシークレットを保存しないでください。機密情報を変数に保存するのは、プロジェクト、グループ、またはインスタンスの設定でのみ行う必要があります。
移行計画を作成する
移行を開始する前に、移行計画を作成し、次の質問に答えてください:
- 今日のジョブではどのBambooタスクが使用されていますか?また、それらは何をしますか?
- Maven、Gradle、またはNPMのような一般的なビルドツールをラップするタスクはありますか?
- どのソフトウェアがBambooエージェントにインストールされていますか?
- どのようにBambooから認証していますか(SSHキー、APIトークン、またはその他のシークレット)?
- 外部サービスにアクセスするためのBambooの認証情報はありますか?
- 共有ライブラリまたはテンプレートは使用されていますか?
BambooからGitLab CI/CDへの移行
前提要件:
- GitLabインスタンスがセットアップされ、構成されている必要があります。
- Runnerが利用可能である必要があります。
Bambooから移行するには:
Bamboo構成を監査します:
- Bambooプロジェクト/プランをBamboo UIからYAML仕様としてエクスポートします。
- ジョブで使用されているすべてのBambooタスクを一覧表示します(たとえば、Maven、Docker、SCP)。
- 各Bambooエージェントにインストールされているソフトウェアバージョンをドキュメント化します。
- すべての共有認証情報とその使用状況を特定します。
ソースコードリポジトリをGitLabに移行します:
- 利用可能なインポーターを使用して、外部SCMプロバイダーからの大量インポートを自動化します。
- 個々のリポジトリについては、URLでリポジトリをインポートします。
同等のソフトウェアでGitLab Runnerをセットアップします:
- Bambooエージェントに存在するのと同じソフトウェアバージョンをインストールします。
- 複雑なエージェントのセットアップの場合は、必要なツールを使用してカスタムDockerイメージを作成します。
- Runnerがビルドコマンドを正常に実行できることをテストします。
Bamboo仕様を
.gitlab-ci.ymlファイルに変換します:- Bambooプランの構造をGitLabのステージとジョブに置き換えます。
${bamboo.variableName}構文を$VARIABLE_NAMEに変換します。${bamboo.planKey}のようなBamboo固有の変数を、$CI_PIPELINE_IDのようなGitLabの同等の変数に置き換えます。- Bambooチェックアウトタスクを削除します。GitLabは、各ジョブの開始時にソースコードを自動的にチェックアウトします。
アーティファクトの処理を移行します:
- Bambooの
artifact-subscriptionsおよびartifact-download構成を削除します。 - ステージ間でアーティファクトの自動継承を使用します。
- アーティファクトのパスを更新して、GitLabのジョブ構造と一致させます。
- Bambooの
Bambooのデプロイプロジェクトを変換します:
- 個別のBambooデプロイプロジェクトからメイン
.gitlab-ci.ymlファイルにデプロイタスクを移動します。 - Bamboo環境をGitLabの環境に置き換えます。
- 一般的なデプロイパターンには、クラウドデプロイテンプレートを使用します。
- Kubernetesにデプロイする場合は、Kubernetes向けGitLabエージェントを構成します。
- 個別のBambooデプロイプロジェクトからメイン
シークレットと認証情報を移行します:
- 外部シークレットインテグレーションを使用するか、認証情報をマスクされた保護された変数として保存します。
移行されたパイプラインをテストして最適化します:
- テストパイプラインを実行して、機能を確認します。
- マージリクエストインテグレーションを追加して、パイプラインの結果を表示します。
- パイプラインのパフォーマンスを最適化し、再利用可能なテンプレートを作成します。