kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Wingetパッケージリポジトリへの追加方法(Schema 1.4対応)

github.com

WingetのパッケージレポジトリにPackerを追加してもらおうとPRを作ろうとしたら、ちょっと古い話が引っかかることが多いので、自分の備忘録として書いておきます。現在はSchema 1.4で作らないと受け付けてもらえません。

learn.microsoft.com

大体ここに書いている通りですが…自分がやらかした注意点&ドキュメント書かれていなかったけどやってみたらうまくいった話。

Validationはローカルで通ってもダメ

github.com

今回HashiCorpのPackerを追加してもらったのですが、ローカルのvalidationとWindows Sandboxを使ったインストールテストは成功したのにPRのvalidationチェックに引っ掛かりました。なんで?と思ってAzure Pipelinesのログを見てみると…PackageIdentifierHashi Corp.Packerじゃないといけなかったのに、Hashcorp.Packerと```iが抜けていました。これはwingetcreateコマンドで作られているので、コマンド実行時にtypoしていると全部間違います。

PRのチェックでこれがダメだとはねられます。

  • manifest/categoly/organization/product/version 形式の階層とyamlのファイル名が一致していないといけない。
  • PackageIdentifierは大文字小文字区別します。

wingetcreateコマンドでtypoしていたけど、フォルダーはすでにTerraformとVagrantが入っているので、YAMLそのままコピーして動いているように見えたのですが、PRの検証ではねられた、ということでした。はずかしい。

修正して、PRのValidationは通ったように見えたのですが、それでもボットのコメントで「まだ検証通ってないよ」というコメントがついたので、「通ったように見えるけど…」とコメント書いたら中の人がレビューしてくれてOKになったようです。

Gitのブランチ名

気にしなくてもいいのかもしれませんが、「どんなブランチルールあるのかなぁ」と思ってほかのPRみてみたら、 organization.Product-version-hash みたいな形が多いようです。私はサボってversionだけにしました。

一人が同じプロダクトかつ、一つのバージョンで複数のPR受けることはたぶんないので、これでよさそうです。

ほかにもwinget-pkgに登録してほしいツールがいくつかあるので、また追加してみます。

Azure Pipelineでデプロイ時にチェックを必須化させる

Azure DevOps(に限らないですが)通常のCI/CDではだいたいこんな感じですよね。

一応Service Connectionが使えるパイプラインは管理者が指定できますが、一度許可で指定したらパイプラインの内容がどうあれ、デプロイし放題です。最初にマルウェアチェックのタスクやソース監査のタスクがあっても「めんどくさいからいらないや」とパイプライン編集権限のある人削除してしまえばなんでもデプロイできるようになってしまいます。

これはまずいので、Service Connection(Environmentsでも同じ)を使うときにチェックしたい、という要件が必要になります。

これを実現するための機能がApproval and checksです。

learn.microsoft.com

承認にはいくつかの種類があるのですが、わかりやすいのはBusiness Hours(使用可能な時間を制限)、Approvals(承認しないとデプロイできない)です。しかし、承認者がいつも正しくチェックできるとは限りません。そういうチェックは機械にやらせましょうということで、使えるのがRequired templateEvaluate artifactです。後者はまた別途解説します。

特にRequired templateは特定のテンプレートが含まれていないとService ConnectionとEnvironmentsを使わせないという設定なので、極めて有効です。しかし、この機能ドキュメントも試しただけではわかりづらい仕様があります*1

まず、テンプレートのおさらいです。呼び出されるテンプレートをPipelinesレポジトリのapprvaldemo/credscan.ymlに配置します。

steps:
- task: CredScan@2
  displayName: 'Check Cred scan'
  inputs:
    toolMajorVersion: 'V2'

わかりやすくするために引数などは使わないテンプレートです。そして、そのテンプレートを使用する呼び出し側。resources句でGitレポジトリをリソースとして参照して、templateという名前でPipelinesレポジトリを参照可能とします。

resources:
  repositories:
    - repository: templates
      type: git
      name: SessionDemo/Pipelines

stages:
  - stage: Deploy
    jobs:
      - deployment: Deployment
        displayName: 'Deploy'
        pool:
          vmImage: 'windows-latest'
        strategy:
          runOnce:
            deploy:
              steps:
              - template: apprvaldemo/credscan.yml@templates

最後の-templateでテンプレートとして用意されている外部レポジトリのYAMLファイルを参照しています。この例では非常に単純なタスクですが、一連のデプロイやビルド方法、特定のコンプライアンス関係のタスクをまとめて使用するのが一般的かと思います。

じゃあ、このテンプレートをApprovalに設定すればいいのか?こういう形にしたいということで、このテンプレートをApproval and checksに指定したとします。

これで良さそうに見えるので実行してみると…。

ビルドが失敗します。チェックが失敗したとかではなくて、そもそもApproval and checksRequired templateを指定するときはこのようにYAMLパイプラインの一部として存在するテンプレートの指定は認められていません。評価の順番としてはこうなるそうです。

  1. テンプレートを展開
  2. 式を評価
  3. stageを評価して依存関係をチェック
  4. すべてのリソースに関して承認をチェック (以下略)

learn.microsoft.com

で、この「テンプレートを展開」ですが、何もしなくても展開ではなくて、extends句を使った展開でなくてはなりません。実際にはこうなります。 呼び出される側のテンプレートはこの方法で、template.ymlという名前でGitレポジトリのルートフォルダーに保存します。

parameters:
- name: buildConfiguration
  type: string
  default: Release

steps:
- task: DownloadBuildArtifacts@1
  inputs:
    buildType: 'specific'
    project: '0a9af6d9-(略)'
    pipeline: '238'
    specificBuildWithTriggering: true
    buildVersionToDownload: 'latestFromBranch'
    allowPartiallySucceededBuilds: true
    branchName: 'refs/heads/main'
    downloadType: 'single'
    artifactName: 'approvaldemo'
    downloadPath: '$(System.ArtifactsDirectory)'
- task: AzureWebApp@1
  inputs:
    azureSubscription: '(Service connection)'
    appType: 'webApp'
    appName: '(appname)'
    package: '$(System.ArtifactsDirectory)/**/*.zip'
    deploymentMethod: 'auto'                  
  • project: Azure DevOps内のプロジェクトのGUID。REST APIでも使います。
  • pipeline: パイプラインのIDを指定します。こちらは連番ですね。

GUIではこのように指定します。

Download Build Artifactsタスクの指定例です。GUIではプロジェクト名とパイプライン名が名前で選択できるので、楽です。そして、呼び出すパイプラインはこのように指定します。

pool:
  vmImage: ubuntu-latest

variables:
  buildConfiguration: 'Release'

extends:
  template: templatefile.yml
  parameters:
    buildConfiguration: $(buildConfiguration)

extendsでテンプレートを指定します。これでこのパイプライン内で指定したテンプレートが完全に展開されます。Approval and checksへの指定はこうなります。

Service Connectionですが、Environmentでも同じです。

項目 説明
repositry プロジェクト名/レポジトリ の形式で指定します
ref Gitのブランチ名です。ref/heads/ブランチ名 です。デフォルトをmainにしている人は気を付けてください
Path to required YAML template YAMLテンプレートファイル名を指定します。私はサブフォルダー指定したら動きませんでした

Approval and checksを保存すると、指定したテンプレートを使わない限り、Service Connectionへのデプロイに失敗します。

先ほどのエラーはApproval and checksの書式間違いですが、こちらはちゃんとApproval and checksのポリシー違反であることが分かります。

注意事項(今後変わるかもしれない)

templateに指定するテンプレートのYAMLはGitのルートフォルダに置かれていなくてはなりませんでした。サブフォルダに置くと「Gitのコミットにない」といわれました。もしかしたらバグかもしれない。

パイプラインやapproval and checksを編集すると、挙動がおかしいように見えるので、聞いてみます…。

learn.microsoft.com

一応シナリオとしては書いたようにセキュリティのチェックをするためのに用意されています。テンプレート内で独自のフローを使いたければ、引数に渡して、stepsとして展開する、という方法が紹介されています…が、自分が試したときはresourcesで外部レポジトリのフォルダー使うと、Queueに入ろうとして、エラーになったのだけどなぁ🤔。

*1:最初に試したときはこうじゃなかったはずなんだけどなぁ…

Azure DevOps 2023/3/8の更新

Azure DevOps Sprint 218リリースノートの翻訳を行いました。オリジナルはこちらからご覧ください。

learn.microsoft.com

今回は3週間スプリントですが、小幅ですかね。セキュリティ回りの投資は続いているようです。パイプラインではいまだにnode 6に依存しているタスクがあった場合の回避方法、同じく拡張機能をnode.jsで作った場合の検証といったあたりが強化されています。

Service Hookにジョブの状態変化と、どのGitレポジトリを参照しているのかということが入ったのもうれしいですが、GitのUriだけじゃなくてここまで入るならブランチも入れてほしい気がします。

ダッシュボードの上限はプロジェクト当たり500となっていますが、ホイホイ作っていたらきてしまうかもしれないし、寿命が来たものは捨てていきましょう、ということで最終アクセス情報が提供されるようになりました。管理者はこの辺定期的にとってこれたらいいですね。

learn.microsoft.com

ではまた三週間後。

translate to Japanese to Azure DevOps release not…

Azure AD Connect設定後のトラブルなど

kkamegawa.hatenablog.jp

前回の続きです。やった後の解決できてないトラブル編

Azure Backupクライアントが動かない

バックアップはできているようなんですが、クライアントがこうなって設定ができません。一度登録解除しないとだめかな…サポートに聞いてもいいけど、拉致があかないかもしれない。

同期前のトラブル

アカウント同期の前の話ですが、同期のアカウントがローカルドメインのままであるとだめなのでldfixで修正します。

microsoft.github.io

どうするか設定してCOMPLETEにしてAPPLYすればOKです。とはいえ、本来はrendom操作の中で/cleanすれば消えるはず…なのですが(確か)。

同期処理で頻繁にエラー

これはたぶん自分の自宅のPCの性能が足りない(Core i3でDCのVM動かしているから)のが原因だと思いますが、割と頻繁に同期エラーのメール通知受け取ります。特にバックアップ処理しているときがダメ。

learn.microsoft.com

どうせそんなにオブジェクトの変更かけないのでAAD Connectのカスタムスケジューラーでバックアップが動かない時間帯で12時間に一度に設定しました。

これで同期エラーの通知はほぼ受け取らなくなりました。どうしてもというときは手動で同期すればいいので大丈夫です。