一般的な言語やユースケース向けの、コピー&ペーストですぐ使えるブループリントです。各テンプレートはそれ単体で完結しています。組み合わせて設定全体を構成できます。
各フィールドの詳細は、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 > [ご利用のリポジトリ] で設定します。
依存関係の管理に 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
pip と venv を使った従来の Python セットアップです。プロジェクトで requirements.txt を利用している場合に使用してください。initialize: |
python3 -m venv .venv
maintenance: |
source .venv/bin/activate
pip install -r requirements.txt
knowledge:
- name: lint
contents: |
source .venv/bin/activate
flake8 .
- name: test
contents: |
source .venv/bin/activate
pytest
- name: build
contents: |
source .venv/bin/activate
python -m build
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 を削除し、すべてを最初から再インストールします。
pnpm を利用するプロジェクト向けです。initialize: |
npm install -g pnpm
maintenance: |
pnpm install --frozen-lockfile
knowledge:
- name: lint
contents: |
pnpm lint
- name: test
contents: |
pnpm test
- name: build
contents: |
pnpm build
モジュールを使用した標準的な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 ./...
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
Maven を使用する 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 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: |
mvn dependency:resolve
knowledge:
- name: test
contents: |
mvn test
- name: build
contents: |
mvn package
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
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) を利用してください。
サービスごとに異なる JDK バージョンが必要な Java モノレポです。セットアップ時に両方の JDK をインストールし、その後 knowledge エントリを利用して、各サービスでどの JAVA_HOME を使うかを Devin に伝えます。initialize:
- name: Install JDK 17 (primary)
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 JDK 11 (legacy service)
run: |
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y -qq openjdk-11-jdk-headless
maintenance:
- name: Warm dependency caches
run: |
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
(cd services/api && ./gradlew dependencies --refresh-dependencies)
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
(cd services/legacy && ./gradlew dependencies --refresh-dependencies)
knowledge:
- name: build_api
contents: |
API サービスをビルドします(JDK 17):
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 \
cd services/api && ./gradlew clean build
- name: build_legacy
contents: |
レガシーサービスをビルドします(JDK 11):
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 \
cd services/legacy && ./gradlew clean build
- name: test_all
contents: |
すべてのサービスのテストを実行します:
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 \
(cd services/api && ./gradlew test)
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 \
(cd services/legacy && ./gradlew test)
パッケージマネージャーが非公開レジストリから依存関係を取得できるように設定します。これらは Settings > Environment configuration > Org-wide setup で設定してください (必要なのが 1 つのリポジトリだけであれば、リポジトリ単位でも設定できます) 。
認証情報の設定は initialize ではなく maintenance に記述してください。 シークレット (レジストリのパスワードや認証トークン) を設定ファイルに書き込むステップでは、各セッションで認証情報が
毎回新しく読み込まれるように、maintenance を使用してください。シークレットはスナップショットが保存される前に削除されるため、initialize 中に書き込まれた設定ファイルには、セッション開始時に有効な認証情報が含まれません。
非公開レジストリで社内 CA を使用している場合は、まず Enterprise レベルで CA 証明書 がインストールされていることを確認してください。以下の設定では、HTTPS の信頼関係が
すでに確立されていることを前提としています。
npm (scoped)
npm (full mirror)
pnpm
Yarn
npm を設定して、スコープ付きパッケージ (例: @myorg/*) は非公開レジストリから取得し、公開パッケージは引き続きデフォルトの npm レジストリから取得するようにします。
- GITHUB_PACKAGES_TOKEN — read: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>
すべての npm パッケージを非公開レジストリ経由にします (スコープ付きパッケージだけではありません) 。
NPM_REGISTRY_URL — npm レジストリの完全な URL (例: https://artifactory.example.com/artifactory/api/npm/npm-virtual) - NPM_REGISTRY_HOST — プロトコルを含まないホスト名のみ (例:
artifactory.example.com) - REGISTRY_TOKEN — レジストリ用の npm 認証トークン
maintenance:
- name: Configure npm to use private registry
run: |
npm config set registry $NPM_REGISTRY_URL
npm config set //${NPM_REGISTRY_HOST}/:_authToken $REGISTRY_TOKEN
npm config set strict-ssl true
pnpm を設定して、パッケージを非公開レジストリから取得するようにします。
NPM_REGISTRY_URL — npm レジストリの完全な URL - NPM_REGISTRY_HOST — プロトコルを含まないホスト名のみ - REGISTRY_TOKEN — レジストリ用の npm 認証トークン
initialize:
- name: Install pnpm
run: npm install -g pnpm
maintenance:
- name: Configure pnpm for private registry
run: |
pnpm config set registry $NPM_REGISTRY_URL
pnpm config set //${NPM_REGISTRY_HOST}/:_authToken $REGISTRY_TOKEN
Yarn (Classic v1 または Berry v2+) を設定して、パッケージを非公開レジストリから取得するようにします。
- NPM_REGISTRY_URL — npm/Yarn レジストリの完全な URL - REGISTRY_TOKEN — レジストリ用の認証トークン (Berry のみ)
Yarn Classic (v1) :initialize:
- name: Install Yarn Classic
run: npm install -g yarn
maintenance:
- name: Configure Yarn for private registry
run: |
yarn config set registry "$NPM_REGISTRY_URL"
# スコープ付きパッケージの場合:
# yarn config set @myorg:registry "https://npm.pkg.github.com"
Yarn Berry (v2+) :maintenance:
- name: Configure Yarn Berry for private registry
run: |
yarn config set npmRegistryServer "$NPM_REGISTRY_URL"
yarn config set npmAuthToken "$REGISTRY_TOKEN"
# スコープ付きパッケージの場合:
# yarn config set npmScopes.myorg.npmRegistryServer "https://npm.pkg.github.com"
# yarn config set npmScopes.myorg.npmAuthToken "$GITHUB_PACKAGES_TOKEN"
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
Poetry が非公開の PyPI レジストリからパッケージを取得できるように設定します。
POETRY_REGISTRY_URL — PyPI 互換レジストリの完全な URL - REGISTRY_USER — レジストリのユーザー名 - REGISTRY_PASS — レジストリのパスワードまたは API トークン
initialize:
- name: Install Poetry
run: curl -sSL https://install.python-poetry.org | python3 -
maintenance:
- name: Configure Poetry for private registry
run: |
poetry config repositories.private "$POETRY_REGISTRY_URL"
poetry config http-basic.private "$REGISTRY_USER" "$REGISTRY_PASS"
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>
JDK をインストールし、すべての依存関係を非公開レジストリ経由で解決するように Gradle を設定します。JDK 17 は Devin のベースイメージに プリインストール されています。デフォルト設定で十分な場合は、JDK のインストール手順をスキップしてください。
- GRADLE_REGISTRY_URL — 使用する Gradle/Maven レジストリの URL - 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 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:
- name: Configure Gradle for private registry
run: |
mkdir -p ~/.gradle
cat > ~/.gradle/init.gradle << EOF
allprojects {
repositories {
maven {
url "$GRADLE_REGISTRY_URL"
credentials {
username = "$REGISTRY_USER"
password = "$REGISTRY_PASS"
}
allowInsecureProtocol = false
}
}
}
EOF
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_ID と AWS_SECRET_ACCESS_KEY — codeartifact: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
すべての 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
お客様の内部サービスでは、公開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
組織で、すべての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は署名を検証しません。
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、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
ツールセットアップ用のGitHub Actions
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-node や setup-python などのアクションは、PATH と環境変数を変更します。あるアクションでインストールされたバイナリは、後続のすべてのステップと maintenance で利用できます。サポートされるのは
Node.js ベースの GitHub Actions のみです。Composite アクションと Docker ベースのアクションはサポートされていません。
基本的なツールのセットアップに GitHub Actions は必要ありません。シェルコマンドを直接実行しても (nvm install 20、curl ... | sh、apt-get install) 、同様に機能し、多くの場合はこちらのほうが簡単です。GitHub Actions が特に有用なのは、CI のセットアップと完全に一致させたい場合や、複数のディストリビューションに対応する setup-java のようなアクションの利便性が必要な場合です。
これらの使用例では、Enterprise と org レベルの設定がどのように組み合わさるかを示しています。実際には、これらはスコープごとに分けて扱うのが一般的です。ここでは参考用にまとめて示しています。
Enterprise向けのフルスタック(Artifactory)
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_TOKEN — read: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 install、uv 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 を参照してください。