Skip to main content
一般的な言語やユースケース向けの、コピー&ペーストですぐ使えるブループリントです。各テンプレートはそれ単体で完結しています。組み合わせて設定全体を構成できます。 各フィールドの詳細は、Blueprint referenceを参照してください。
Secrets: テンプレートは $SECRET_NAME を介してSecretsを参照します。テンプレートを利用する前に、Settings > Secrets でこれらを設定してください。ブループリントに認証情報をハードコードしないでください。

クイックスタート

よくあるセットアップ向けの最小構成のブループリントです。1 つをコピーしてブループリントエディタに貼り付ければ完了です。
initialize: |
  npm install -g pnpm

maintenance: |
  pnpm install

knowledge:
  - name: lint
    contents: |
      エラーを確認するには `pnpm lint` を実行します。
  - name: test
    contents: |
      フルスイートを実行するには `pnpm test` を実行します。
initialize: |
  curl -LsSf https://astral.sh/uv/install.sh | sh

maintenance: |
  uv sync

knowledge:
  - name: lint
    contents: |
      lint を実行するには `uv run ruff check .` を実行します。
  - name: test
    contents: |
      フルスイートを実行するには `uv run pytest` を実行します。
initialize:
  - name: pnpmをインストールする
    run: npm install -g pnpm
  - name: uvをインストールする
    run: curl -LsSf https://astral.sh/uv/install.sh | sh

maintenance:
  - name: フロントエンドの依存関係
    run: (cd frontend && pnpm install)
  - name: バックエンドの依存関係
    run: (cd backend && uv sync)

knowledge:
  - name: structure
    contents: |
      - `frontend/` — React アプリ(pnpm)
      - `backend/` — Python API(uv)
  - name: test
    contents: |
      フロントエンド: cd frontend && pnpm test
      バックエンド: cd backend && uv run pytest

リポジトリのブループリント

リポジトリごとのビルド手順、依存関係管理、Knowledge エントリ。これらは Settings > Environment configuration > [ご利用のリポジトリ] で設定します。

Python

依存関係の管理に uv を利用する Python プロジェクト向けの推奨セットアップです。
initialize: |
  curl -LsSf https://astral.sh/uv/install.sh | sh

maintenance: |
  uv sync

knowledge:
  - name: lint
    contents: |
      uv run ruff check .

      自動修正:
      uv run ruff check --fix .

  - name: test
    contents: |
      uv run pytest

  - name: build
    contents: |
      uv run python -m build

Node.js

npm を使う標準的な Node.js のセットアップです。
initialize: |
  nvm install 20
  nvm use 20

maintenance: |
  npm install

knowledge:
  - name: lint
    contents: |
      npx eslint .

  - name: test
    contents: |
      npm test

  - name: build
    contents: |
      npm run build
maintenance では npm ci ではなく npm install を利用してください。npm install は差分更新を行いますが、npm ci は毎セッション node_modules を削除し、すべてを最初から再インストールします。

Go

モジュールを使用した標準的なGoのセットアップ。
initialize: |
  GO_VERSION=1.23.5
  ARCH=$(dpkg --print-architecture)
  curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-${ARCH}.tar.gz" \
    | sudo tar -xz -C /usr/local
  echo 'export PATH="/usr/local/go/bin:$HOME/go/bin:$PATH"' \
    | sudo tee /etc/profile.d/golang.sh > /dev/null

  go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

maintenance: |
  go mod download

knowledge:
  - name: lint
    contents: |
      golangci-lint run

  - name: test
    contents: |
      go test ./...

  - name: build
    contents: |
      go build ./...

Java

Gradle を使用する Java のセットアップ。
JDK 17 は Devin のベースイメージにプリインストールされています。デフォルトの OpenJDK 17 で十分な場合は、JDK のインストール手順をスキップしてください。
initialize:
  - name: Install JDK 17
    run: |
      sudo apt-get update -qq
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openjdk-17-jdk-headless
      echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' \
        | sudo tee /etc/profile.d/java.sh > /dev/null

  - name: Install Gradle
    run: |
      GRADLE_VERSION=8.12
      curl -fsSL "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" \
        -o /tmp/gradle.zip
      sudo unzip -qo /tmp/gradle.zip -d /opt
      sudo ln -sf /opt/gradle-${GRADLE_VERSION}/bin/gradle /usr/local/bin/gradle
      rm /tmp/gradle.zip

maintenance: |
  ./gradlew dependencies

knowledge:
  - name: lint
    contents: |
      ./gradlew check

  - name: test
    contents: |
      ./gradlew test

  - name: build
    contents: |
      ./gradlew build

Ruby on Rails

PostgreSQL を使用する Rails のセットアップ。
initialize:
  - name: Install Ruby 3.3
    run: |
      sudo apt-get update -qq
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq ruby-full libpq-dev postgresql-client

maintenance: |
  bundle install
  rails db:migrate

knowledge:
  - name: lint
    contents: |
      bundle exec rubocop

  - name: test
    contents: |
      bundle exec rspec

  - name: build
    contents: |
      rails assets:precompile

Rust

cargo を使った標準的な Rust のセットアップ。
Rust (rustup 経由) と Cargo は、Devin のベースイメージにあらかじめインストールされています。デフォルトの安定版ツールチェーンで十分な場合は、インストール手順は省略できます。必要なのは依存関係の取得だけです。
initialize: |
  curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
  source ~/.cargo/env

maintenance: |
  cargo fetch

knowledge:
  - name: lint
    contents: |
      cargo clippy -- -D warnings

  - name: test
    contents: |
      cargo test

  - name: build
    contents: |
      cargo build --release

モノレポ

Node.js のフロントエンドと Python のバックエンドを持つモノレポです。各サブプロジェクトには、それぞれ専用のKnowledge エントリを設定します。
initialize:
  - name: Install pnpm
    run: npm install -g pnpm
  - name: Install uv
    run: curl -LsSf https://astral.sh/uv/install.sh | sh

maintenance:
  - name: Install frontend dependencies
    run: (cd packages/frontend && pnpm install)
  - name: Install backend dependencies
    run: (cd packages/backend && uv sync)
  - name: Build shared library
    run: (cd packages/shared && pnpm install && pnpm build)

knowledge:
  - name: structure
    contents: |
      これは 3 つのパッケージで構成されたモノレポです:
      - `packages/frontend` — React アプリ(TypeScript、pnpm)
      - `packages/backend` — Python API(FastAPI、uv)
      - `packages/shared` — 共有 TypeScript ユーティリティ(フロントエンドより先にビルドが必要)
  - name: frontend
    contents: |
      開発サーバーを起動するには、`cd packages/frontend && pnpm dev` を実行します。
      lint を実行するには、`cd packages/frontend && pnpm lint` を実行します。
      テストを実行するには、`cd packages/frontend && pnpm test` を実行します。
  - name: backend
    contents: |
      API を起動するには、`cd packages/backend && uv run uvicorn app.main:app --reload` を実行します。
      lint を実行するには、`cd packages/backend && uv run ruff check .` を実行します。
      テストを実行するには、`cd packages/backend && uv run pytest` を実行します。
ステップ間で作業ディレクトリがリセットされるように、cd dir && command ではなくサブシェル (cd dir && command) を利用してください。

非公開パッケージレジストリ

パッケージマネージャーが非公開レジストリから依存関係を取得できるように設定します。これらは Settings > Environment configuration > Org-wide setup で設定してください (必要なのが 1 つのリポジトリだけであれば、リポジトリ単位でも設定できます) 。
認証情報の設定は initialize ではなく maintenance に記述してください。 シークレット (レジストリのパスワードや認証トークン) を設定ファイルに書き込むステップでは、各セッションで認証情報が 毎回新しく読み込まれるように、maintenance を使用してください。シークレットはスナップショットが保存される前に削除されるため、initialize 中に書き込まれた設定ファイルには、セッション開始時に有効な認証情報が含まれません。
非公開レジストリで社内 CA を使用している場合は、まず Enterprise レベルで CA 証明書 がインストールされていることを確認してください。以下の設定では、HTTPS の信頼関係が すでに確立されていることを前提としています。

Node.js レジストリ

npm を設定して、スコープ付きパッケージ (例: @myorg/*) は非公開レジストリから取得し、公開パッケージは引き続きデフォルトの npm レジストリから取得するようにします。
- GITHUB_PACKAGES_TOKENread:packages スコープを持つパーソナルアクセストークン、または GitHub App トークン
maintenance:
  - name: Configure npm scoped registry
    run: |
      npm config set @myorg:registry https://npm.pkg.github.com
      npm config set //npm.pkg.github.com/:_authToken $GITHUB_PACKAGES_TOKEN
@myorg は実際の npm スコープに置き換えてください。一般的な非公開レジストリ URL:
  • GitHub Packages: https://npm.pkg.github.com
  • Artifactory: https://artifactory.example.com/artifactory/api/npm/npm-virtual
  • Nexus: https://nexus.example.com/repository/npm-group
  • GitLab: https://gitlab.example.com/api/v4/packages/npm
  • AWS CodeArtifact: https://<domain>.d.codeartifact.<region>.amazonaws.com/npm/<repo>

Python レジストリ

pip と uv が非公開の PyPI レジストリ (例: Nexus、Artifactory) からパッケージを取得できるように設定します。
  • PYPI_REGISTRY_URL — 必要に応じて認証情報を含む、PyPI インデックスの完全な URL (例: https://user:token@nexus.example.com/repository/pypi-proxy/simple)
maintenance:
  - name: Configure pip/uv for private registry
    run: |
      mkdir -p ~/.config/pip
      cat > ~/.config/pip/pip.conf << EOF
      [global]
      index-url = $PYPI_REGISTRY_URL
      EOF

      echo "export UV_INDEX_URL=$PYPI_REGISTRY_URL" \
        | sudo tee /etc/profile.d/uv-registry.sh > /dev/null
一般的な PyPI レジストリ URL パターン:
  • Artifactory: https://artifactory.example.com/artifactory/api/pypi/pypi-virtual/simple
  • Nexus: https://nexus.example.com/repository/pypi-proxy/simple
  • AWS CodeArtifact: https://aws:TOKEN@domain-owner.d.codeartifact.region.amazonaws.com/pypi/repo/simple/
  • Azure Artifacts: https://pkgs.dev.azure.com/org/project/_packaging/feed/pypi/simple
  • GitLab: https://gitlab.example.com/api/v4/groups/<group-id>/-/packages/pypi/simple

JVM 用レジストリ

JDK をインストールし、すべての依存関係の解決が非公開レジストリ (例: Artifactory、Nexus) を経由するように Maven を設定します。
Devin のベースイメージには JDK 17 がプリインストールされています。デフォルトの OpenJDK 17 で十分な場合は、インストール手順をスキップしてください。必要なのは Maven のインストールとレジストリ設定のみです。
  • MAVEN_REGISTRY_URL — Maven レジストリの URL (例: https://artifactory.example.com/artifactory/maven-virtual) - REGISTRY_USER — レジストリのユーザー名 - REGISTRY_PASS — レジストリのパスワードまたは API トークン
initialize:
  - name: Install JDK 17
    run: |
      sudo apt-get update -qq
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openjdk-17-jdk-headless
      echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' \
        | sudo tee /etc/profile.d/java.sh > /dev/null

  - name: Install Maven
    run: |
      MAVEN_VERSION=3.9.9
      curl -fsSL "https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \
        | sudo tar -xz -C /opt
      sudo ln -sf /opt/apache-maven-${MAVEN_VERSION}/bin/mvn /usr/local/bin/mvn

maintenance:
  - name: Configure Maven for private registry
    run: |
      mkdir -p ~/.m2
      cat > ~/.m2/settings.xml << EOF
      <settings>
        <mirrors>
          <mirror>
            <id>private-registry</id>
            <mirrorOf>*</mirrorOf>
            <url>$MAVEN_REGISTRY_URL</url>
          </mirror>
        </mirrors>
        <servers>
          <server>
            <id>private-registry</id>
            <username>$REGISTRY_USER</username>
            <password>$REGISTRY_PASS</password>
          </server>
        </servers>
      </settings>
      EOF
Mavenでよく使われるレジストリURLのパターン:
  • Artifactory: https://artifactory.example.com/artifactory/maven-virtual
  • Nexus: https://nexus.example.com/repository/maven-public
  • Azure Artifacts: https://pkgs.dev.azure.com/org/project/_packaging/feed/maven/v1
  • GitHub Packages: https://maven.pkg.github.com
  • GitLab: https://gitlab.example.com/api/v4/groups/<group-id>/-/packages/maven
  • AWS CodeArtifact: https://<domain>.d.codeartifact.<region>.amazonaws.com/maven/<repo>

その他のレジストリ

Go をインストールし、非公開のモジュールプロキシ (例: Athens、Artifactory、または GOPROXY エンドポイント) 経由でモジュールを取得できるように設定します。
  • GO_PROXY_URL — Go モジュールプロキシの URL (例: https://athens.corp.internal) - GIT_TOKEN — Go モジュールをホストする非公開 Git リポジトリ用のパーソナルアクセストークン
initialize:
  - name: Install Go
    run: |
      GO_VERSION=1.23.5
      ARCH=$(dpkg --print-architecture)
      curl -fsSL "https://go.dev/dl/go${GO_VERSION}.linux-${ARCH}.tar.gz" \
        | sudo tar -xz -C /usr/local
      echo 'export PATH="/usr/local/go/bin:$HOME/go/bin:$PATH"' \
        | sudo tee /etc/profile.d/golang.sh > /dev/null

  - name: Configure Go for private modules
    run: |
      cat << 'GOENV' | sudo tee /etc/profile.d/go-private.sh > /dev/null
      export GOPROXY="$GO_PROXY_URL,direct"
      export GONOSUMCHECK="corp.internal/*,github.com/myorg/*"
      export GOPRIVATE="corp.internal/*,github.com/myorg/*"
      GOENV

maintenance:
  - name: Authenticate Go private modules
    run: |
      git config --global url."https://$GIT_TOKEN@github.com/myorg/".insteadOf "https://github.com/myorg/"
一般的な Go プロキシ URL パターン:
  • Artifactory: https://artifactory.example.com/artifactory/go-virtual
  • Nexus: https://nexus.example.com/repository/go-proxy
  • Athens: https://athens.corp.internal
非公開フィードからパッケージを取得できるように NuGet を設定します。
- NUGET_SOURCE_URL — NuGet フィードの URL - NUGET_API_KEY — フィードの APIキーまたは PAT
initialize:
  - name: Install .NET SDK
    run: |
      curl -fsSL https://dot.net/v1/dotnet-install.sh | bash -s -- --channel 8.0
      echo 'export PATH="$HOME/.dotnet:$PATH"' \
        | sudo tee /etc/profile.d/dotnet.sh > /dev/null

maintenance:
  - name: Configure NuGet for private feed
    run: |
      dotnet nuget add source "$NUGET_SOURCE_URL" \
        --name private \
        --username any \
        --password "$NUGET_API_KEY" \
        --store-password-in-clear-text 2>/dev/null || \
      dotnet nuget update source private \
        --source "$NUGET_SOURCE_URL" \
        --username any \
        --password "$NUGET_API_KEY" \
        --store-password-in-clear-text
Docker が非公開のコンテナレジストリからイメージをプルできるように設定します。
  • DOCKER_MIRROR_URL (任意) — Docker Hub ミラーの URL (例: https://mirror.corp.internal) - DOCKER_REGISTRY_URL — 非公開のコンテナレジストリの URL (例: registry.corp.internal:5000) - DOCKER_REGISTRY_USER — レジストリのユーザー名 - DOCKER_REGISTRY_PASS — レジストリのパスワードまたは API トークン
initialize:
  - name: Create Docker config directory
    run: sudo mkdir -p /etc/docker

maintenance:
  - name: Configure Docker for private registry
    run: |
      # レジストリミラーを設定する(省略可能 — Docker Hub のプルをレジストリ経由でルーティングする)
      cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null
      {
        "registry-mirrors": ["$DOCKER_MIRROR_URL"]
      }
      EOF
      sudo systemctl restart docker || true

      # 非公開コンテナレジストリにログインする
      echo "$DOCKER_REGISTRY_PASS" | docker login "$DOCKER_REGISTRY_URL" \
        --username "$DOCKER_REGISTRY_USER" \
        --password-stdin
よく使われるコンテナレジストリのURL:
  • Amazon ECR: <account-id>.dkr.ecr.<region>.amazonaws.com
  • Azure Container Registry: <name>.azurecr.io
  • Google Artifact Registry: <region>-docker.pkg.dev
  • GitHub Container Registry: ghcr.io
  • GitLab Container Registry: registry.gitlab.example.com
  • Nexus: https://nexus.example.com:8443
  • JFrog: <name>.jfrog.io
Cargo が非公開レジストリからクレートを解決するように設定します。
Rust (rustup 経由) と Cargo は、Devin のベースイメージに プリインストール されています。デフォルトの stable ツールチェーンで十分な場合は、インストール手順をスキップしてください。必要なのはレジストリの設定のみです。
  • CARGO_REGISTRY_INDEX — 非公開レジストリインデックスの URL (例: sparse+https://cargo.corp.internal/api/v1/crates/) - CARGO_REGISTRY_TOKEN — 非公開レジストリ用の認証トークン
initialize:
  - name: Install Rust
    run: |
      curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
        | sh -s -- -y --default-toolchain stable
      echo 'source "$HOME/.cargo/env"' \
        | sudo tee /etc/profile.d/rust.sh > /dev/null

maintenance:
  - name: Configure Cargo for private registry
    run: |
      mkdir -p ~/.cargo
      cat > ~/.cargo/config.toml << EOF
      [registries.private]
      index = "$CARGO_REGISTRY_INDEX"
      token = "$CARGO_REGISTRY_TOKEN"

      [source.crates-io]
      replace-with = "private"

      [source.private]
      registry = "$CARGO_REGISTRY_INDEX"
      EOF
crates.io を置き換えずに非公開レジストリを追加するだけでよい場合は、[source.crates-io][source.private] セクションを削除し、代わりに cargo install --registry private を利用するか、Cargo.toml[dependencies] my-crate = { version = "1.0", registry = "private" } を利用してください。
Ruby をインストールし、非公開の gem サーバーから gem を取得できるように Bundler を設定します。
  • GEM_SERVER_URL — 非公開の gem サーバーの URL (例: https://artifactory.example.com/artifactory/api/gems/gems-virtual) - REGISTRY_USER — レジストリのユーザー名 - REGISTRY_PASS — レジストリの パスワードまたは API トークン
initialize:
  - name: Install Ruby
    run: |
      sudo apt-get update -qq
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq ruby-full

maintenance:
  - name: Configure Bundler for private gem server
    run: |
      bundle config set mirror.https://rubygems.org "$GEM_SERVER_URL"
      bundle config set "$GEM_SERVER_URL" "$REGISTRY_USER:$REGISTRY_PASS"
一般的な gem サーバーの URL パターン:
  • Artifactory: https://artifactory.example.com/artifactory/api/gems/gems-virtual
  • Nexus: https://nexus.example.com/repository/rubygems-proxy
  • Gemfury: https://gem.fury.io/<org>
PHP をインストールし、Composer が非公開の Packagist または Satis レジストリからパッケージを取得できるように設定します。
  • COMPOSER_REGISTRY_URL — 非公開の Composer レジストリの URL (例: https://repo.packagist.com/<org>)
  • REGISTRY_USER — レジストリのユーザー名
  • REGISTRY_PASS — レジストリのパスワードまたは API トークン
initialize:
  - name: Install PHP and Composer
    run: |
      sudo apt-get update -qq
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \
        php-cli php-mbstring php-xml php-curl unzip

      # Composerをインストール
      curl -sS https://getcomposer.org/installer | php
      sudo mv composer.phar /usr/local/bin/composer

maintenance:
  - name: Configure Composer for private registry
    run: |
      composer config --global repositories.private \
        composer "$COMPOSER_REGISTRY_URL"

      # レジストリで認証する
      composer config --global http-basic.$(echo "$COMPOSER_REGISTRY_URL" \
        | sed 's|https\?://||;s|/.*||') "$REGISTRY_USER" "$REGISTRY_PASS"
一般的な Composer レジストリの URL パターン:
  • Artifactory: https://artifactory.example.com/artifactory/api/composer/packagist-virtual
  • Nexus: https://nexus.example.com/repository/packagist-proxy
  • Private Packagist: https://repo.packagist.com/<org>
  • Satis: https://satis.corp.internal
AWS CodeArtifact のトークンは 12 時間で期限切れになります。各セッションの開始時に maintenance を利用してトークンを更新します。この例では、npm、pip、Maven で CodeArtifact を利用するよう設定します。
awscli は Devin のベースイメージにあらかじめインストールされています。必要なのは、トークンの更新とレジストリの設定だけです。
  • AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYcodeartifact:GetAuthorizationToken および sts:GetServiceBearerToken 権限を持つ IAM 認証情報 - CA_DOMAIN — CodeArtifact のドメイン名
    • CA_DOMAIN_OWNER — ドメインを所有する AWS アカウント ID - CA_REGION — AWS リージョン (例: us-east-1) - CA_NPM_REPO, CA_PYPI_REPO, CA_MAVEN_REPO — 各エコシステムのリポジトリ名
maintenance:
  - name: Refresh CodeArtifact auth token
    run: |
      # 新しいトークンを取得する(12時間有効)
      export CODEARTIFACT_AUTH_TOKEN=$(aws codeartifact get-authorization-token \
        --domain $CA_DOMAIN \
        --domain-owner $CA_DOMAIN_OWNER \
        --region $CA_REGION \
        --query authorizationToken \
        --output text)

      CA_ENDPOINT="https://${CA_DOMAIN}-${CA_DOMAIN_OWNER}.d.codeartifact.${CA_REGION}.amazonaws.com"

      # npmを設定する
      npm config set registry "${CA_ENDPOINT}/npm/${CA_NPM_REPO}/"
      npm config set "//${CA_DOMAIN}-${CA_DOMAIN_OWNER}.d.codeartifact.${CA_REGION}.amazonaws.com/npm/${CA_NPM_REPO}/:_authToken" "$CODEARTIFACT_AUTH_TOKEN"

      # pipを設定する
      mkdir -p ~/.config/pip
      cat > ~/.config/pip/pip.conf << EOF
      [global]
      index-url = https://aws:${CODEARTIFACT_AUTH_TOKEN}@${CA_DOMAIN}-${CA_DOMAIN_OWNER}.d.codeartifact.${CA_REGION}.amazonaws.com/pypi/${CA_PYPI_REPO}/simple/
      EOF

      # Mavenを設定する(任意)
      mkdir -p ~/.m2
      cat > ~/.m2/settings.xml << EOF
      <settings>
        <servers>
          <server>
            <id>codeartifact</id>
            <username>aws</username>
            <password>${CODEARTIFACT_AUTH_TOKEN}</password>
          </server>
        </servers>
        <mirrors>
          <mirror>
            <id>codeartifact</id>
            <mirrorOf>*</mirrorOf>
            <url>${CA_ENDPOINT}/maven/${CA_MAVEN_REPO}/</url>
          </mirror>
        </mirrors>
      </settings>
      EOF

Enterprise インフラストラクチャ

すべての org と repo に共通して適用されるマシンレベルのインフラストラクチャです。これらは Settings > Devin’s base environment (enterprise-wide の場合) または Settings > Environment configuration > Org-wide setup (org-wide の場合) で設定します。

ネットワークと接続

お使いの組織では、内部サービス向けに非公開の認証局を利用しています。Devin が HTTPS 経由で内部レジストリやツールに接続するには、ルート証明書が必要です。
- CORP_ROOT_CA_B64 — 社内 CA の PEM 証明書を Base64 エンコードしたもの。生成方法: cat corp-root-ca.crt | base64 -w0
initialize:
  - name: Install corporate CA certificate
    run: |
      echo "$CORP_ROOT_CA_B64" | base64 -d \
        | sudo tee /usr/local/share/ca-certificates/corp-root-ca.crt > /dev/null
      sudo update-ca-certificates
      echo 'export NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/corp-root-ca.crt' \
        | sudo tee /etc/profile.d/node-ca.sh > /dev/null
組織で複数のCA証明書 (例:内部サービスごとに異なるCA) を利用している場合。
- CORP_ROOT_CA_B64 — Base64エンコードされたプライマリCA証明書 - CORP_INTERMEDIATE_CA_B64 — Base64エンコードされた中間CA証明書
initialize:
  - name: Install corporate CA certificates
    run: |
      echo "$CORP_ROOT_CA_B64" | base64 -d \
        | sudo tee /usr/local/share/ca-certificates/corp-root-ca.crt > /dev/null
      echo "$CORP_INTERMEDIATE_CA_B64" | base64 -d \
        | sudo tee /usr/local/share/ca-certificates/corp-intermediate-ca.crt > /dev/null
      sudo update-ca-certificates

      # 単一のCAファイルが必要なツール向けに結合バンドルを作成する
      cat /usr/local/share/ca-certificates/corp-*.crt \
        | sudo tee /usr/local/share/ca-certificates/corp-bundle.crt > /dev/null

      echo 'export NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/corp-bundle.crt' \
        | sudo tee /etc/profile.d/node-ca.sh > /dev/null
すべてのネットワークトラフィックを社内プロキシ経由で送信します。
  • CORP_HTTP_PROXY — HTTP プロキシ URL (例: http://proxy.corp.example.com:8080) - CORP_HTTPS_PROXY — HTTPS プロキシ URL - CORP_NO_PROXY — プロキシを経由しないホストのカンマ区切りリスト (例: localhost,127.0.0.1,.corp.example.com)
initialize:
  - name: Configure system-wide proxy
    run: |
      cat << 'PROXY' | sudo tee /etc/profile.d/proxy.sh > /dev/null
      export http_proxy="$CORP_HTTP_PROXY"
      export https_proxy="$CORP_HTTPS_PROXY"
      export no_proxy="$CORP_NO_PROXY"
      export HTTP_PROXY="$CORP_HTTP_PROXY"
      export HTTPS_PROXY="$CORP_HTTPS_PROXY"
      export NO_PROXY="$CORP_NO_PROXY"
      PROXY
      source /etc/profile.d/proxy.sh

maintenance:
  - name: Configure git proxy
    run: |
      git config --global http.proxy "$CORP_HTTP_PROXY"
      git config --global https.proxy "$CORP_HTTPS_PROXY"

      # npmプロキシを設定する
      npm config set proxy "$CORP_HTTP_PROXY"
      npm config set https-proxy "$CORP_HTTPS_PROXY"
企業内プロキシでユーザー名/パスワード認証が必要な場合。
  • PROXY_USER — プロキシのユーザー名 - PROXY_PASS — プロキシのパスワード - PROXY_HOST — プロキシのホスト名とポート (例: proxy.corp.example.com:8080) - CORP_NO_PROXY — プロキシを経由しないホスト
initialize:
  - name: Configure authenticated proxy
    run: |
      PROXY_URL="http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}"

      cat << PROXY | sudo tee /etc/profile.d/proxy.sh > /dev/null
      export http_proxy="$PROXY_URL"
      export https_proxy="$PROXY_URL"
      export no_proxy="$CORP_NO_PROXY"
      export HTTP_PROXY="$PROXY_URL"
      export HTTPS_PROXY="$PROXY_URL"
      export NO_PROXY="$CORP_NO_PROXY"
      PROXY
      source /etc/profile.d/proxy.sh

maintenance:
  - name: Configure git for authenticated proxy
    run: |
      PROXY_URL="http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}"
      git config --global http.proxy "$PROXY_URL"
      git config --global https.proxy "$PROXY_URL"
社内CAとプロキシの両方が必要な環境向けの設定です。これは、内部サービスが社内証明書を利用し、すべてのトラフィックをプロキシ経由にする必要があるEnterprise環境で一般的です。
  • CORP_ROOT_CA_B64 — Base64エンコードされた社内CA証明書 - CORP_HTTP_PROXY, CORP_HTTPS_PROXY — プロキシURL - CORP_NO_PROXY — プロキシをバイパスするホスト
initialize:
  - name: Install corporate CA certificate
    run: |
      echo "$CORP_ROOT_CA_B64" | base64 -d \
        | sudo tee /usr/local/share/ca-certificates/corp-root-ca.crt > /dev/null
      sudo update-ca-certificates
      echo 'export NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/corp-root-ca.crt' \
        | sudo tee /etc/profile.d/node-ca.sh > /dev/null

  - name: Configure system-wide proxy
    run: |
      cat << 'PROXY' | sudo tee /etc/profile.d/proxy.sh > /dev/null
      export http_proxy="$CORP_HTTP_PROXY"
      export https_proxy="$CORP_HTTPS_PROXY"
      export no_proxy="$CORP_NO_PROXY"
      export HTTP_PROXY="$CORP_HTTP_PROXY"
      export HTTPS_PROXY="$CORP_HTTPS_PROXY"
      export NO_PROXY="$CORP_NO_PROXY"
      PROXY
      source /etc/profile.d/proxy.sh

maintenance:
  - name: Configure git proxy
    run: |
      git config --global http.proxy "$CORP_HTTP_PROXY"
      git config --global https.proxy "$CORP_HTTPS_PROXY"
非公開レジストリ、Git サーバー、その他の社内サービスには、VPN 経由でのみアクセスできます。これは、社内リソースへのネットワークアクセスが必要な他のモジュールより前に実行する必要があります。
OpenVPN:
  • VPN_CONFIG_B64 — Base64 エンコードされた OpenVPN 設定ファイル (.ovpn) 。生成方法: cat corp.ovpn | base64 -w0
  • VPN_AUTH_USER (任意) — VPN でユーザー名/パスワード認証が必要な場合の VPN ユーザー名
  • VPN_AUTH_PASS (任意) — VPN パスワード
WireGuard:
  • WG_CONFIG_B64 — Base64 エンコードされた WireGuard 設定ファイル。生成方法: cat wg0.conf | base64 -w0
OpenVPN:
initialize:
  - name: Install and configure OpenVPN
    run: |
      sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openvpn

      # VPN設定を書き込む
      sudo mkdir -p /etc/openvpn/client
      echo "$VPN_CONFIG_B64" | base64 -d \
        | sudo tee /etc/openvpn/client/corp.conf > /dev/null

      # VPNがユーザー名/パスワード認証を必要とする場合
      if [ -n "${VPN_AUTH_USER:-}" ] && [ -n "${VPN_AUTH_PASS:-}" ]; then
        printf '%s\n%s\n' "$VPN_AUTH_USER" "$VPN_AUTH_PASS" \
          | sudo tee /etc/openvpn/client/auth.txt > /dev/null
        sudo chmod 600 /etc/openvpn/client/auth.txt
        echo "auth-user-pass /etc/openvpn/client/auth.txt" \
          | sudo tee -a /etc/openvpn/client/corp.conf > /dev/null
      fi

      # VPNトンネルを起動する
      sudo systemctl daemon-reload
      sudo systemctl enable --now openvpn-client@corp

      # トンネルが起動するまで待機する
      for i in $(seq 1 30); do
        if ip link show tun0 >/dev/null 2>&1; then break; fi
        sleep 1
      done
WireGuard:
initialize:
  - name: Install and configure WireGuard
    run: |
      sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq wireguard-tools

      # WireGuard の設定を書き込む
      echo "$WG_CONFIG_B64" | base64 -d \
        | sudo tee /etc/wireguard/wg0.conf > /dev/null
      sudo chmod 600 /etc/wireguard/wg0.conf

      # トンネルを開始する
      sudo systemctl enable --now wg-quick@wg0
VPN の設定の詳細については、VPN Configurationを参照してください。
お客様の内部サービスでは、公開DNSでは名前解決できない非公開DNS名を利用しています。
initialize:
  - name: Configure custom DNS resolution
    run: |
      # 内部ホスト名を追加する
      cat << 'HOSTS' | sudo tee -a /etc/hosts > /dev/null
      10.0.1.50  nexus.corp.internal
      10.0.1.51  git.corp.internal
      10.0.1.52  artifactory.corp.internal
      HOSTS

      # 必要に応じてカスタムネームサーバーを設定する
      sudo mkdir -p /etc/systemd/resolved.conf.d
      cat << 'DNS' | sudo tee /etc/systemd/resolved.conf.d/corp.conf > /dev/null
      [Resolve]
      DNS=10.0.0.53 10.0.0.54
      Domains=corp.internal
      DNS
      sudo systemctl restart systemd-resolved || true

ID とセキュリティ

組織で、すべてのGitコミットに署名する必要があり、DevinのコミットをGitHubでVerifiedとして表示したい場合。
  • GPG_PRIVATE_KEY_B64 — Base64エンコードされたGPG秘密鍵。生成方法: gpg --export-secret-keys <key-id> | base64 -w0
  • GIT_USER_NAME — Gitの作成者名 (例: Devin AI)
  • GIT_USER_EMAIL — Gitの作成者メールアドレス。GPGキー上のUIDと一致している必要があります。一致しない場合、GitHubは署名を検証しません。
Devinがプッシュに利用する認証情報に対応するGitHubアカウントにも、対応する公開鍵をアップロードしてください (GitHub Settings > SSH and GPG keys) 。GitHubがコミットをVerifiedとして表示するのは、コミットの作成者アカウントに署名用の公開鍵が登録されている場合のみです。
initialize:
  - name: Prepare GPG and git signing config
    run: |
      # TTYがなくてもGPGが動作できるようにする
      echo 'export GPG_TTY=$(tty)' | sudo tee -a /etc/profile.d/gpg.sh > /dev/null

maintenance:
  - name: Import GPG key and configure git signing
    run: |
      echo "$GPG_PRIVATE_KEY_B64" | base64 -d | gpg --batch --import 2>/dev/null

      KEY_ID=$(gpg --list-secret-keys --keyid-format long 2>/dev/null \
        | grep sec | head -1 | awk '{print $2}' | cut -d'/' -f2)

      git config --global user.signingkey "$KEY_ID"
      git config --global commit.gpgsign true
      git config --global tag.gpgsign true
      git config --global gpg.program gpg
非公開GitサーバーにアクセスするためのDevinのGit IDとSSHキーを設定します。
  • GIT_USER_NAME — Gitの作成者名 - GIT_USER_EMAIL — Gitの作成者メールアドレス - SSH_PRIVATE_KEY_B64 — Base64エンコードされたSSH秘密鍵。生成方法: cat ~/.ssh/id_ed25519 | base64 -w0 - SSH_KNOWN_HOSTS_B64 — Base64エンコードされたknown hostsエントリ。生成方法: ssh-keyscan git.corp.internal | base64 -w0 - SSH_CONFIG_B64 (任意) — Base64エンコードされたSSH設定ファイル
initialize:
  - name: Configure git identity
    run: |
      git config --global user.name "$GIT_USER_NAME"
      git config --global user.email "$GIT_USER_EMAIL"

      # SSHディレクトリを準備
      mkdir -p ~/.ssh && chmod 700 ~/.ssh

maintenance:
  - name: Install SSH keys
    run: |
      # SSH秘密鍵をインストール(各セッションで毎回新しく読み込まれるよう、maintenanceで実行)
      echo "$SSH_PRIVATE_KEY_B64" | base64 -d > ~/.ssh/id_ed25519
      chmod 600 ~/.ssh/id_ed25519

      # Gitサーバーのknown hostsを追加
      echo "$SSH_KNOWN_HOSTS_B64" | base64 -d >> ~/.ssh/known_hosts

      # 必要に応じてカスタムSSH設定をインストール
      if [ -n "${SSH_CONFIG_B64:-}" ]; then
        echo "$SSH_CONFIG_B64" | base64 -d > ~/.ssh/config
        chmod 600 ~/.ssh/config
      fi
Gitサーバー用のknown hostsエントリは、ssh-keyscan git.corp.internal | base64 -w0 で生成できます。

システム構成

Devinのデフォルトイメージに含まれていないシステムレベルのパッケージ (例:画像処理やPDF生成に必要なネイティブライブラリ) をインストールします。
initialize:
  - name: Install system packages
    run: |
      sudo apt-get update -qq
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \
        libpq-dev \
        libmagickwand-dev \
        poppler-utils \
        ffmpeg
すべてのセッションで利用できる永続的な環境変数を設定します。推奨される方法は、KEY=VALUE 形式の行を $ENVRC ファイルに書き込むことです。$ENVRC に書き込まれた変数は、以降のすべてのステップと Devin セッションで自動的にエクスポートされます (GitHub Actions の $GITHUB_ENV と同様です) 。
initialize:
  - name: カスタム環境変数を設定する
    run: |
      echo "CORPORATE_ENV=production" >> $ENVRC
      echo "DEFAULT_REGION=us-east-1" >> $ENVRC
      echo "MAX_RETRIES=3" >> $ENVRC
システム全体で利用できるように、環境変数を /etc/profile.d/ のスクリプトに書き込むこともできます。
cat << 'ENVVARS' | sudo tee /etc/profile.d/custom-env.sh > /dev/null
export CORPORATE_ENV=production
export DEFAULT_REGION=us-east-1
ENVVARS
どちらの方法でも問題ありません。ほとんどの場合は、$ENVRC のほうが簡単でおすすめです。
デフォルトのベースイメージでは、ロケール設定が正しくない場合があります。ビルドツール、Java、Python、Git で警告が表示されないように、ロケールとタイムゾーンを設定してください。
initialize:
  - name: Configure locale and timezone
    run: |
      sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq locales

      # ロケールを生成して設定する
      sudo sed -i 's/^# *en_US.UTF-8/en_US.UTF-8/' /etc/locale.gen
      sudo locale-gen
      sudo update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8

      cat << 'LOCALE' | sudo tee /etc/profile.d/locale.sh > /dev/null
      export LANG="en_US.UTF-8"
      export LC_ALL="en_US.UTF-8"
      LOCALE

      # タイムゾーンを設定する
      sudo timedatectl set-timezone UTC 2>/dev/null || \
        sudo ln -sfn /usr/share/zoneinfo/UTC /etc/localtime
Java、Gradle、Node.js のビルドでは、デフォルトの 1024 のオープンファイル上限に頻繁に達します。ビルドの失敗を防ぐため、この上限を引き上げてください。
initialize:
  - name: Raise resource limits
    run: |
      cat << 'LIMITS' | sudo tee /etc/security/limits.d/99-devin.conf > /dev/null
      *    soft    nofile    65536
      *    hard    nofile    65536
      *    soft    nproc     65536
      *    hard    nproc     65536
      LIMITS

      # カーネルの最大値も設定する
      echo "fs.file-max = 65536" | sudo tee /etc/sysctl.d/99-devin-filemax.conf > /dev/null
      sudo sysctl -p /etc/sysctl.d/99-devin-filemax.conf 2>/dev/null || true
air-gapped または制限された環境では、デフォルトの Ubuntu APT ソースを内部ミラーに置き換えます。
- APT_MIRROR_URL — 内部 APT ミラーの URL (例: https://artifactory.example.com/artifactory/ubuntu-remote)
initialize:
  - name: Replace APT sources with internal mirror
    run: |
      # 元のソースをバックアップ
      sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

      # すべてのUbuntuミラーを内部ミラーに置き換える
      sudo sed -i "s|http://archive.ubuntu.com/ubuntu|$APT_MIRROR_URL|g" /etc/apt/sources.list
      sudo sed -i "s|http://security.ubuntu.com/ubuntu|$APT_MIRROR_URL|g" /etc/apt/sources.list

      sudo apt-get update -qq
一般的なAPTミラーのURLパターン:
  • Artifactory: https://artifactory.example.com/artifactory/ubuntu-remote
  • Nexus: https://nexus.example.com/repository/ubuntu-proxy

高度なパターン

Devinのベース環境には direnv が含まれています。.envrc ファイルを作成するには initialize を利用します。direnv がそれらを自動的に読み込みます。
initialize: |
  cat <<'EOF' > .envrc
  export DATABASE_URL=postgresql://localhost:5432/myapp_dev
  export REDIS_URL=redis://localhost:6379
  export APP_ENV=development
  EOF

maintenance: |
  direnv allow .
direnv は Devin のシェルにあらかじめ組み込まれているため、.envrc の変数は自動的に読み込まれます。手動で source する必要はありません。
機密性の高い環境変数 (APIキー、トークン、データベースのパスワード) には、.envrc ファイルではなく repo secrets を利用してください。Repo secrets は安全に保存され、セッション時に自動的に注入されます。ブループリントやスナップショットに含まれることはありません。
.nvmrc を使って、リポジトリごとに Node.js のバージョンを切り替えるには、nvm (プリインストール済み) を利用します。
initialize: |
  nvm install 18
  nvm install 20
  nvm install 22

maintenance: |
  nvm use
nvm use はリポジトリのルートにある .nvmrc を読み取ります。リポジトリに .nvmrc があることを確認してください (例: 20 を含むもの) 。
Devin では、セッション中localhost:29229 の CDP エンドポイントを備えた Chrome ブラウザを利用できます。Playwright スクリプトを利用して、ブラウザベースのログインを自動化してください。
ブラウザを利用できるのはセッション中のみで、スナップショットのビルドでは利用できません。initialize で Playwright をインストールし、ログインスクリプトはリポジトリに保存してください。
initialize: |
  pip install playwright
  playwright install chromium

maintenance: |
  npm install

knowledge:
  - name: browser-auth
    contents: |
      This project requires browser authentication.
      Run the login script before interacting with the app:
      python scripts/login.py

      Devin's Chrome browser is accessible via CDP at:
      http://localhost:29229
ログインスクリプトの例 (scripts/login.py) :
from playwright.sync_api import sync_playwright
import os

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp("http://localhost:29229")
    context = browser.contexts[0]
    page = context.pages[0] if context.pages else context.new_page()

    page.goto("https://internal-tool.example.com/login")
    page.fill("#username", os.environ["TOOL_USERNAME"])
    page.fill("#password", os.environ["TOOL_PASSWORD"])
    page.click('button[type="submit"]')
    page.wait_for_url("**/dashboard")
ログイン認証情報はソースコードに含めず、シークレットとして保存してください。長期間使用する認証が必要な場合は、Devin が自動で再認証できるよう、ログインスクリプトを .agents/skills/ にコミットしてください。
initialize でシステムパッケージやカスタムバイナリをインストールし、PATH を設定します。
initialize:
  - name: Install system packages
    run: |
      apt-get update
      apt-get install -y \
        jq \
        ripgrep \
        fd-find \
        protobuf-compiler \
        libssl-dev

  - name: Install custom CLI tool
    run: |
      curl -L https://github.com/example/tool/releases/download/v1.0/tool-linux-amd64 \
        -o /usr/local/bin/mytool
      chmod +x /usr/local/bin/mytool

  - name: Add custom bin directory to PATH
    run: |
      mkdir -p ~/bin
      echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc

knowledge:
  - name: tools
    contents: |
      Custom tools available:
      - mytool: installed at /usr/local/bin/mytool
      - Additional binaries can be placed in ~/bin
Devin では、Node.js ベースの GitHub Actions をブループリント内で直接実行できます。これにより、CI で利用しているのと同じアクションを使って、特定のバージョンのツールをインストールできます。
initialize:
  - name: "Install Node.js 20"
    uses: github.com/actions/setup-node@v4
    with:
      node-version: "20"

  - name: "Install Python 3.12"
    uses: github.com/actions/setup-python@v5
    with:
      python-version: "3.12"

  - name: "Install Go 1.22"
    uses: github.com/actions/setup-go@v5
    with:
      go-version: "1.22"

  - name: "Install Java 21"
    uses: github.com/actions/setup-java@v4
    with:
      java-version: "21"
      distribution: "temurin"

  - name: "Install Gradle"
    uses: github.com/gradle/actions/setup-gradle@v4

  - name: "Install Ruby 3.3"
    uses: github.com/ruby/setup-ruby@v1
    with:
      ruby-version: "3.3"

  - name: "Install additional tools"
    run: |
      pip install uv
      npm install -g pnpm turbo
      go install golang.org/x/tools/gopls@latest

maintenance: |
  echo "All runtimes are available:"
  node --version
  python --version
  go version
  java --version
setup-nodesetup-python などのアクションは、PATH と環境変数を変更します。あるアクションでインストールされたバイナリは、後続のすべてのステップと maintenance で利用できます。サポートされるのは Node.js ベースの GitHub Actions のみです。Composite アクションと Docker ベースのアクションはサポートされていません。
基本的なツールのセットアップに GitHub Actions は必要ありません。シェルコマンドを直接実行しても (nvm install 20curl ... | shapt-get install) 、同様に機能し、多くの場合はこちらのほうが簡単です。GitHub Actions が特に有用なのは、CI のセットアップと完全に一致させたい場合や、複数のディストリビューションに対応する setup-java のようなアクションの利便性が必要な場合です。

フルスタックの使用例

これらの使用例では、Enterprise と org レベルの設定がどのように組み合わさるかを示しています。実際には、これらはスコープごとに分けて扱うのが一般的です。ここでは参考用にまとめて示しています。
Enterprise環境のフルセット構成例:社内CA証明書、プロキシ、Java (Maven) 、Python (pip/uv) 、Node.js (npm) 、Dockerをすべて単一のArtifactoryインスタンスに向けた設定です。
ネットワーク & 信頼設定 (アカウント全体) :
  • CORP_ROOT_CA_B64 — Base64 エンコードされた社内CA証明書
  • CORP_HTTP_PROXY — HTTP プロキシ URL
  • CORP_HTTPS_PROXY — HTTPS プロキシ URL
  • CORP_NO_PROXY — プロキシをバイパスするホスト
レジストリ認証情報 (組織全体) :
  • ARTIFACTORY_USER — Artifactory のユーザー名
  • ARTIFACTORY_TOKEN — Artifactory API トークンまたはパスワード
  • ARTIFACTORY_MAVEN_URL — Maven リポジトリ URL (例: https://artifactory.example.com/artifactory/maven-virtual)
  • ARTIFACTORY_PYPI_URL — PyPI リポジトリ URL (例: https://user:token@artifactory.example.com/artifactory/api/pypi/pypi-virtual/simple)
  • ARTIFACTORY_NPM_URL — npm リポジトリ URL (例: https://artifactory.example.com/artifactory/api/npm/npm-virtual)
  • ARTIFACTORY_DOCKER_URL — Docker レジストリ URL (例: artifactory.example.com)
これは通常、3つのスコープに分割されます:
  • アカウント全体で共通 (initialize) : 証明書とプロキシ
  • 組織全体 (initialize) : 言語ランタイムのインストール
  • 組織全体 (maintenance): レジストリ認証情報 (セッションごとに更新)
参考までに、まとめて示します:
initialize:
  # ── アカウント全体:ネットワークと信頼 ──────────────────────────────────────

  - name: Install corporate CA certificate
    run: |
      echo "$CORP_ROOT_CA_B64" | base64 -d \
        | sudo tee /usr/local/share/ca-certificates/corp-root-ca.crt > /dev/null
      sudo update-ca-certificates
      echo 'export NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/corp-root-ca.crt' \
        | sudo tee /etc/profile.d/node-ca.sh > /dev/null

  - name: Configure system-wide proxy
    run: |
      cat << 'PROXY' | sudo tee /etc/profile.d/proxy.sh > /dev/null
      export http_proxy="$CORP_HTTP_PROXY"
      export https_proxy="$CORP_HTTPS_PROXY"
      export no_proxy="$CORP_NO_PROXY"
      export HTTP_PROXY="$CORP_HTTP_PROXY"
      export HTTPS_PROXY="$CORP_HTTPS_PROXY"
      export NO_PROXY="$CORP_NO_PROXY"
      PROXY
      source /etc/profile.d/proxy.sh

  # ── Org全体:言語ランタイム ──────────────────────────────────────────

  - name: Install JDK 17 + Maven
    run: |
      sudo apt-get update -qq
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openjdk-17-jdk-headless
      echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' \
        | sudo tee /etc/profile.d/java.sh > /dev/null

      MAVEN_VERSION=3.9.9
      curl -fsSL "https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz" \
        | sudo tar -xz -C /opt
      sudo ln -sf /opt/apache-maven-${MAVEN_VERSION}/bin/mvn /usr/local/bin/mvn

  - name: Install uv
    run: curl -LsSf https://astral.sh/uv/install.sh | sh

maintenance:
  # ── アカウント全体:gitプロキシ(セッションごとに更新) ───────────────────

  - name: Configure git proxy
    run: |
      git config --global http.proxy "$CORP_HTTP_PROXY"
      git config --global https.proxy "$CORP_HTTPS_PROXY"

  # ── Org全体:レジストリ認証情報(セッションごとに更新) ──────────────────

  - name: Configure Maven → Artifactory
    run: |
      mkdir -p ~/.m2
      cat > ~/.m2/settings.xml << EOF
      <settings>
        <mirrors>
          <mirror>
            <id>artifactory</id>
            <mirrorOf>*</mirrorOf>
            <url>$ARTIFACTORY_MAVEN_URL</url>
          </mirror>
        </mirrors>
        <servers>
          <server>
            <id>artifactory</id>
            <username>$ARTIFACTORY_USER</username>
            <password>$ARTIFACTORY_TOKEN</password>
          </server>
        </servers>
      </settings>
      EOF

  - name: Configure pip/uv → Artifactory PyPI
    run: |
      mkdir -p ~/.config/pip
      cat > ~/.config/pip/pip.conf << EOF
      [global]
      index-url = $ARTIFACTORY_PYPI_URL
      trusted-host = $(echo "$ARTIFACTORY_PYPI_URL" | sed 's|https\?://||;s|/.*||')
      EOF

      echo "export UV_INDEX_URL=$ARTIFACTORY_PYPI_URL" \
        | sudo tee /etc/profile.d/uv-registry.sh > /dev/null

  - name: Configure npm → Artifactory
    run: |
      npm config set registry "$ARTIFACTORY_NPM_URL"
      REGISTRY_HOST=$(echo "$ARTIFACTORY_NPM_URL" | sed 's|https\?://||;s|/.*||')
      npm config set "//${REGISTRY_HOST}/:_authToken" "$ARTIFACTORY_TOKEN"

  - name: Configure Docker → Artifactory
    run: |
      echo "$ARTIFACTORY_TOKEN" | docker login "$ARTIFACTORY_DOCKER_URL" \
        --username "$ARTIFACTORY_USER" \
        --password-stdin
この例では、すべてのレジストリが同じ Artifactory インスタンスを参照していますが、URL パスはそれぞれ異なります。各パッケージエコシステムには、それぞれ固有のエンドポイント形式があります。Maven、PyPI、npm、Docker の URL は、同じレジストリであってもそれぞれ異なります。
言語ごとに異なる非公開レジストリを利用する場合 (例:Maven は Nexus、npm は GitHub Packages、Python は Artifactory) 。
  • NEXUS_MAVEN_URL — Nexus Maven リポジトリの URL - NEXUS_USER — Nexus のユーザー名 - NEXUS_PASS — Nexus のパスワード - GITHUB_PACKAGES_TOKENread:packages スコープを持つ GitHub パーソナルアクセストークン - ARTIFACTORY_USER — Artifactory のユーザー名 - ARTIFACTORY_TOKEN — Artifactory API トークン - GIT_TOKEN — Go の非公開モジュール用パーソナルアクセストークン
maintenance:
  # Maven → Nexus
  - name: Configure Maven → Nexus
    run: |
      mkdir -p ~/.m2
      cat > ~/.m2/settings.xml << EOF
      <settings>
        <mirrors>
          <mirror>
            <id>nexus</id>
            <mirrorOf>*</mirrorOf>
            <url>$NEXUS_MAVEN_URL</url>
          </mirror>
        </mirrors>
        <servers>
          <server>
            <id>nexus</id>
            <username>$NEXUS_USER</username>
            <password>$NEXUS_PASS</password>
          </server>
        </servers>
      </settings>
      EOF

  # npm → GitHub Packages(スコープ付き)
  - name: Configure npm → GitHub Packages
    run: |
      npm config set @myorg:registry https://npm.pkg.github.com
      npm config set //npm.pkg.github.com/:_authToken $GITHUB_PACKAGES_TOKEN

  # Python → Artifactory
  - name: Configure pip → Artifactory
    run: |
      mkdir -p ~/.config/pip
      cat > ~/.config/pip/pip.conf << EOF
      [global]
      index-url = https://$ARTIFACTORY_USER:$ARTIFACTORY_TOKEN@artifactory.example.com/artifactory/api/pypi/pypi-virtual/simple
      EOF

  # Go → git経由の非公開モジュール
  - name: Configure Go private modules
    run: |
      git config --global url."https://$GIT_TOKEN@github.com/myorg/".insteadOf "https://github.com/myorg/"
完全にエアギャップされた環境では、Devin は公開 URL に一切アクセスできません。すべてのツール、ランタイム、パッケージは内部ミラー経由で取得する必要があります。
証明書:
  • CORP_ROOT_CA_B64 — Base64 エンコードされた社内CA証明書
ミラーへのアクセス:
  • APT_MIRROR_URL — 内部 Ubuntu APT ミラーの URL
  • MIRROR_USER — ミラー認証用のユーザー名
  • MIRROR_PASS — ミラー認証用のパスワード
  • JDK_TARBALL_URL — 内部ミラーから JDK tarball をダウンロードするための URL
  • NODE_TARBALL_URL — 内部ミラーから Node.js tarball をダウンロードするための URL
パッケージレジストリ:
  • INTERNAL_MAVEN_URL — 内部 Maven レジストリの URL
  • INTERNAL_NPM_URL — 内部 npm レジストリの URL
  • INTERNAL_PYPI_URL — 内部 PyPI レジストリの URL
initialize:
  - name: Install corporate CA certificate
    run: |
      echo "$CORP_ROOT_CA_B64" | base64 -d \
        | sudo tee /usr/local/share/ca-certificates/corp-root-ca.crt > /dev/null
      sudo update-ca-certificates

  - name: Replace apt sources with internal mirror
    run: |
      sudo sed -i "s|http://archive.ubuntu.com/ubuntu|$APT_MIRROR_URL|g" /etc/apt/sources.list
      sudo sed -i "s|http://security.ubuntu.com/ubuntu|$APT_MIRROR_URL|g" /etc/apt/sources.list
      sudo apt-get update -qq

  - name: Install JDK from internal mirror
    run: |
      # 内部アーティファクトストアからJDKのtarballをダウンロード
      curl -fsSL -u "$MIRROR_USER:$MIRROR_PASS" "$JDK_TARBALL_URL" \
        | sudo tar -xz -C /usr/local
      sudo ln -sf /usr/local/jdk-17.*/bin/java /usr/local/bin/java
      sudo ln -sf /usr/local/jdk-17.*/bin/javac /usr/local/bin/javac
      echo "export JAVA_HOME=$(ls -d /usr/local/jdk-17.*)" \
        | sudo tee /etc/profile.d/java.sh > /dev/null

  - name: Install Node.js from internal mirror
    run: |
      curl -fsSL -u "$MIRROR_USER:$MIRROR_PASS" "$NODE_TARBALL_URL" \
        | sudo tar -xz -C /usr/local --strip-components=1

maintenance:
  - name: Configure all package managers for internal registry
    run: |
      # Maven
      mkdir -p ~/.m2
      cat > ~/.m2/settings.xml << EOF
      <settings>
        <mirrors>
          <mirror>
            <id>internal</id>
            <mirrorOf>*</mirrorOf>
            <url>$INTERNAL_MAVEN_URL</url>
          </mirror>
        </mirrors>
        <servers>
          <server>
            <id>internal</id>
            <username>$MIRROR_USER</username>
            <password>$MIRROR_PASS</password>
          </server>
        </servers>
      </settings>
      EOF

      # npm
      npm config set registry "$INTERNAL_NPM_URL"

      # pip
      mkdir -p ~/.config/pip
      cat > ~/.config/pip/pip.conf << EOF
      [global]
      index-url = $INTERNAL_PYPI_URL
      EOF
エアギャップ環境では、Devin が必要とするすべてのツール (言語ランタイム、CLI ツールなど) を社内ミラーで利用できるようにしておく必要があります。公開レジストリやダウンロードサイトにはアクセスできません。
VPN接続、証明書、プロキシ、多言語サポートを組み合わせた包括的なEnterpriseセットアップです。以下が推奨される操作手順です。
VPN:
  • VPN_CONFIG_B64 — Base64 でエンコードされた OpenVPN 設定ファイル
ネットワークと信頼設定:
  • CORP_ROOT_CA_B64 — Base64 でエンコードされた社内CA証明書
  • CORP_HTTP_PROXY — HTTP プロキシ URL
  • CORP_HTTPS_PROXY — HTTPS プロキシ URL
  • CORP_NO_PROXY — プロキシを経由しないホスト
レジストリ認証情報:
  • MAVEN_REGISTRY_URL — Maven レジストリ URL
  • NPM_REGISTRY_URL — npm レジストリ URL
  • PYPI_REGISTRY_HOST — PyPI レジストリのホスト名
  • REGISTRY_USER — レジストリのユーザー名 (Maven と pip 用)
  • REGISTRY_PASS — レジストリのパスワード (Maven と pip 用)
  • REGISTRY_TOKEN — npm 認証トークン
initialize:
  # 1. VPN — 内部リソースにアクセスできるよう、最初に実行する必要があります
  - name: Establish VPN connection
    run: |
      sudo DEBIAN_FRONTEND=noninteractive apt-get update -qq
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openvpn
      sudo mkdir -p /etc/openvpn/client
      echo "$VPN_CONFIG_B64" | base64 -d \
        | sudo tee /etc/openvpn/client/corp.conf > /dev/null
      sudo systemctl daemon-reload
      sudo systemctl enable --now openvpn-client@corp
      for i in $(seq 1 30); do
        if ip link show tun0 >/dev/null 2>&1; then break; fi
        sleep 1
      done

  # 2. DNS — 内部ホスト名を解決する
  - name: Configure DNS
    run: |
      sudo mkdir -p /etc/systemd/resolved.conf.d
      cat << 'DNS' | sudo tee /etc/systemd/resolved.conf.d/corp.conf > /dev/null
      [Resolve]
      DNS=10.0.0.53
      Domains=corp.internal
      DNS
      sudo systemctl restart systemd-resolved || true

  # 3. 証明書 — 内部CAを信頼する
  - name: Install CA certificate
    run: |
      echo "$CORP_ROOT_CA_B64" | base64 -d \
        | sudo tee /usr/local/share/ca-certificates/corp-root-ca.crt > /dev/null
      sudo update-ca-certificates
      echo 'export NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/corp-root-ca.crt' \
        | sudo tee /etc/profile.d/node-ca.sh > /dev/null

  # 4. プロキシ — 社内プロキシ経由でトラフィックをルーティングする
  - name: Configure proxy
    run: |
      cat << 'PROXY' | sudo tee /etc/profile.d/proxy.sh > /dev/null
      export http_proxy="$CORP_HTTP_PROXY"
      export https_proxy="$CORP_HTTPS_PROXY"
      export no_proxy="$CORP_NO_PROXY"
      export HTTP_PROXY="$CORP_HTTP_PROXY"
      export HTTPS_PROXY="$CORP_HTTPS_PROXY"
      export NO_PROXY="$CORP_NO_PROXY"
      PROXY
      source /etc/profile.d/proxy.sh

  # 5. 言語ランタイム
  - name: Install JDK 17
    run: |
      sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openjdk-17-jdk-headless
      echo 'export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64' \
        | sudo tee /etc/profile.d/java.sh > /dev/null

  - name: Install Node.js tooling
    run: npm install -g pnpm

  - name: Install uv
    run: curl -LsSf https://astral.sh/uv/install.sh | sh

maintenance:
  - name: Configure git proxy
    run: |
      git config --global http.proxy "$CORP_HTTP_PROXY"
      git config --global https.proxy "$CORP_HTTPS_PROXY"

  - name: Configure Maven
    run: |
      mkdir -p ~/.m2
      cat > ~/.m2/settings.xml << EOF
      <settings>
        <mirrors>
          <mirror>
            <id>corp</id>
            <mirrorOf>*</mirrorOf>
            <url>$MAVEN_REGISTRY_URL</url>
          </mirror>
        </mirrors>
        <servers>
          <server>
            <id>corp</id>
            <username>$REGISTRY_USER</username>
            <password>$REGISTRY_PASS</password>
          </server>
        </servers>
      </settings>
      EOF

  - name: Configure npm
    run: |
      npm config set registry "$NPM_REGISTRY_URL"
      NPM_HOST=$(echo "$NPM_REGISTRY_URL" | sed 's|https\?://||;s|/.*||')
      npm config set "//${NPM_HOST}/:_authToken" "$REGISTRY_TOKEN"

  - name: Configure pip/uv
    run: |
      mkdir -p ~/.config/pip
      cat > ~/.config/pip/pip.conf << EOF
      [global]
      index-url = https://$REGISTRY_USER:$REGISTRY_PASS@${PYPI_REGISTRY_HOST}/simple
      EOF
      echo "export UV_INDEX_URL=https://$REGISTRY_USER:$REGISTRY_PASS@${PYPI_REGISTRY_HOST}/simple" \
        | sudo tee /etc/profile.d/uv-registry.sh > /dev/null
initialize ステップでは順序が重要です。 まず VPN (内部ホストに到達できるようにするため) 、次に DNS (名前解決を行えるようにするため) 、次に証明書 (HTTPS を機能させるため) 、次にプロキシ (トラフィックを正しくルーティングするため) 、最後に言語ランタイム (内部ミラーからダウンロードする場合があるため) を設定する必要があります。

良い ブループリント を書くためのヒント

  • まずセッションでコマンドをテストする。 ブループリント に追加する前に、Devin のセッションでコマンドを手動で実行してください。フルビルドを待つより、そのほうが速く済みます。
  • 一度だけインストールするツールには initialize、依存関係には maintenance を利用する。 インストールに数分かかるもの (コンパイラ、大きなバイナリ、グローバルツール) は initialize に入れます。短時間で終わる依存関係コマンド (npm installuv sync) は maintenance に入れます。
  • maintenance コマンドは高速に保つ。 2 分以内を目安にしてください。これらは毎回のセッション開始時に実行されます。
  • 環境変数には $ENVRC を利用する。 .bashrc.profile には書き込まないでください。ステップ間やセッション間で変数を設定するための正式な仕組みは $ENVRC です。
  • ステップには名前を付ける。 name フィールドを使う expanded form にすると、ビルドログ内の失敗箇所を特定しやすくなります。
  • monorepo では サブシェル を利用する。 (cd packages/foo && npm install) は サブシェル 内で実行されるため、後続のステップはディレクトリ変更の影響を受けません。
  • npm ci ではなく npm install を利用する。 npm ci は毎回のセッションで node_modules を削除し、毎回ゼロから再インストールするため、maintenance には不向きです。
  • 機密性の高い値には repo secrets を利用する。 ブループリント に直接書き込むのではなく、Settings > Secrets で repo scope を指定して設定してください。
構文の詳細については、ブループリント reference を参照してください。ビルド失敗のトラブルシューティングについては、Declarative configuration > Troubleshooting を参照してください。