【小ネタ】Azure PipelineのMicrosoft-hostedなOSがubuntuのagentsでazcopyコマンドを使うときはazcopyのバージョンに気をつけるんよー
2021-02-26
azblob://2022/11/11/eyecatch/2021-02-26-azure-pipeline-agent-azcopy10-000.jpg

この記事はなむゆの個人ブログにもマルチポストしてあります。

はじめに

タイトルが長いですね。
あと何も知らない人には何を言ってるかわからないですね。
ここにたどり着いた方は多分下の方に書いてるエラー文とかで検索に引っかかった方かと思います。
今回はそういった方向けのお話になります。

結論から

Azure PipelineのMicrosoft-hostedなagentを使ってazcopyのv7にはなくてv10には含まれるコマンドを使おうとした場合、azcopyコマンドのエイリアスは azcopy10 でないとThe syntax of the command is incorrect. Unrecognized command or argument 'copy' といったエラーが発生します。
エラーの意味合いとしては「azcopyにcopyと続くコマンドはないよ~」というものです。
この例ではMicrosoft-hostedなUbuntu OSのagentで azcopy copy とコマンドを打ったのですが、その際に使われたazcopyのバージョンはv7で、それには azcopy copy のコマンドが含まれていなかったことが原因です。
azcopyのv10で追加されたコマンドである azcopy copy を使用しようとした場合、 `azcopy10 copy' で書き始めることでこの問題は解決できます。

もうちょっと詳しい話

これだけだと味気ないのでもう少し結論の話に肉付けします。
Microsoft-hostedのagentとは何かということとそれに最初からインストールされているソフトウェアのお話、あとその中のazcopyコマンドのお話です。

Microsoft-hostedなagentとは

Azure pipelineではパイプラインで処理を実行するためにAgentと呼ばれる、Azure上でホストされたVMを使用します。
このVMは、自分で設定したVMを使用する(Self-hosted agent)他、Microsoftによってあらかじめ設定されたVM(Microsoft-hosted agent)を使用することもできます。
Self-hosted agentにおいては、Pipelineでビルドを行う際に必要なソフトウェアをユーザーが決めてインストールすることになります。
この作業は手間でもあるのですが、代わりにインストールするソフトウェアやハードウェア性能をより細かく設定できるという利点でもあります。
これによって、例えばアプリビルド時にライセンスが必要なUnityを設定したGPUマシマシのハイエンドなVMを用意してUnityアプリを高速でデプロイするなんてこともできます。
一方で、Microsoft-hosted agentではビルドに使うことがある多くのソフトウェアのインストールや準備を既に行っているVMが利用できます。
これによって、特にインストールなどをしなくてもaz cliやdotnet コマンド等を使用することができ、ビルドやデプロイのためにソフトウェアのインストールの手間をかけずに済みます。
逆に最初からインストールされていないソフトウェアを使用する場合は、agentのVMはパイプラインの処理ごとに変更が初期化されるため、毎回インストールの処理をしなければなりません。
Microsoft-hosted agentsの中でもさらにWindows Server OSを利用したものやUbuntu、Mac OSをインストールしたVMを使用することができます。
これによって、ビルドに使用したいマシンのOSについてある程度選択することもできます。
一般的には最初から使用できるようになっていて、かつ最初から十分に設定が行われているMicrosoft-hostedなagentを使用することになるかと思います。

Microsoft-hostedなagentにインストールされているソフトウェアの話

Microsoft-hostedなagentには初めからビルドに使うソフトウェアが色々インストールされているため特にパイプライン内でソフトウェアのインストールをせずにaz cliやdotnetコマンドなどを使用できるというお話をしましたが、実際にどのようなソフトウェアがインストールされているかはこちらのドキュメントに纏められています。
それぞれのOSのLinkから、そのOSのagentにインストールされているソフトウェアの一覧を見ることができます。
例えば、基本的に全部のOSにaz cliやdotnetコマンドがインストールされているほか、Go、npm、gitなども全部のOSでインストールされています。
面白いものではRも使えるようです。
あと、UbuntuとWindows Server限定ですがDockerコマンドも利用できます。
よくやるのはGithubにコードをマージされたらDockerコマンドでコンテナ化してazコマンドでACRにデプロイとかですね。

ただしUbuntuのazcopyには注意

今回の記事の主題として注目してほしいのがこの中のUbuntuのagentにインストールされているazcopyの欄です。
Ubuntu OSのagentにはAzCopyのバージョン10.8と7.3がインストールされているのですが(2021年2月現在)、エイリアスがそれぞれ azcopy10azcopy になっています。
azcopy10 とコマンドを打つとazcopyのバージョン10.8が使用され、 azcopy とコマンドを打つとバージョン7.3が使用されます。
一方で他のOSのエージェントだとどれもazcopyのバージョン10.8のみ利用可能で、azcopyとコマンドを打つとバージョン10.8のazcopyが実行されます。
Ubuntuのagentでのみ、 azcopy のコマンドを打つとバージョン7.3のものが使用され、azocopyコマンドは認識されるもののバージョン10で追加されたコマンドが見つからず使用できないということが起きます。
気をつけましょう。

おわりに

最近行っていたパイプライン周りの作業でこのような問題に引っかかってエラーシュートに時間がかかったので「こんなことがあるよー」という共有でした。
同じ問題で詰まった方の助けになれば幸いです。

参考