使用してGitHubアクションまたは任意のCI/CDをDockerコンテナに基づいてスナップパッケージを構築する


それがスナップパッケージに来るとき、エントリの容易さは信じられないほど低いです.これは特にSnapcraft Build Service , スナップクラフトでホストされます.入出力ビルドサービスはスナップインパッケージの著者のGithubアカウントにつながり、リンクされたリポジトリからスナップパッケージを自動的に構築します.スナップパッケージがビルドを終えたとき、ビルドサービスはスナップインを' edge 'トラックに解放します.

問題
ビルドサービスには、非常に簡単に始めることができるという欠点があります、それは非常にカスタマイズされたリリーススケジュールと構造を実行するその能力に制限されます.もう1つの問題は、開発者がしばしば自分のプロセスを構築し、そのようなサービスを使用して自分のアプリケーションをテストする場所を持っていることですTravis CI or GitHub Actions . これらのサービスは、Snapcraftのビルドサービスよりも簡単に動作を調整するプログラムです.
私は多くのスナップパッケージを維持し、それらのいくつかのためのSnapcraftのビルドサービスの制限に対してアップロードしている.フラストレーションを引き起こしている影響を受けるスナップパッケージには、上流プロジェクトにいくつかのリリースタイプがある場合があります.これらの問題のスナップパッケージの一つはOpenRA , これには2種類のリリースがあります.のための頻繁な機能要求OpenRA Snap Package 私は安定したリリースに加えてプレイテストをリリースしていますが、ビルドサービスは、この目標を達成するのを防いだ.
Travis CIとGitHubのアクションのようなサービスの容易に利用可能なリソースで、私はこれらの1つを使用して私のスナップパッケージを構築する可能性を調査している.Snapcraftチームは、長い間Aを提供しましたContainer Image of Snapcraft Dockerハブでは、今まで彼らはAMD 64のバリアントを提供することができました.残念ながら、これは64ビットX 86プラットフォーム以外のアーキテクチャ用のコンテナイメージを使用してスナップパッケージをコンパイルする範囲が限られていることを意味します.

解決策
ステージから入るDocker Buildx , 複数のアーキテクチャでコンテナイメージをビルドすることができます.コンテナイメージは、ビルド時に指定されたアーキテクチャのために構築され、Docker Hubのようなコンテナレジストリ上のコンテナイメージマニフェストを介して単一の名前空間に結び付けられます.Githubアクションを使用する場合は、完全に機能するbuildXセットアップを使用してビルドを実行しますDocker Buildx Action . 作用を利用するqemu ユーザーモードのエミュレーションは透過的に複数のアーキテクチャを実行するGithubのアクションをビルドします.通常はAMD 64とI 386アーキテクチャに制限されます.

ビルダー
私のマスタープランのステップ1はビルトインを使用して、すべてのサポートされているスナップアーキテクチャのためにコア、コア18、コア20のためにコンパイルされた私自身のDockerハブ名前空間の下でSnapcraftの実験的なビルドをリリースします(Qemuユーザーと結合されたときにbash関連の問題があるので、コア変形のS 390 Xを除いてください).My Snapcraft Container Image is on Docker Hub at diddledan/snapcraft .


本当に楽しい部分のために、そして、これは旋風になるでしょう:我々は便利なコンテナイメージのすべてのアーキテクチャのために簡単に利用できるスナップクラフトを構築します、しかし、我々はスナップストアのために我々のパッケージを構築するためにどのようにそれを使用しますか?
私たちが行くので、あなたの帽子につかんでください.私たちはqemu-user-static 上に構築された外国の建築コンテナを実行するには、スナップストアを構築する!
GitHubアクションやTrarais CI設定を設定する必要がありますqemu-user-static とビルドを実行します.以下に、独自のGithubアクションの設定を示します.
name: Build and Release Snap

on:
  push:
    branches:
    - master

jobs:
  build-stable:
    runs-on: ubuntu-latest

    # Let's build for many architectures..
    strategy:
      matrix:
        architecture:
        - linux/amd64
        - linux/386
        - linux/arm64
        - linux/arm/v7
    steps:
    # Checkout the code of our Repository
    - uses: actions/checkout@v2

    # Do the build!
    - id: build
      run: |
        # Enable docker daemon support for --platform parameter
        echo '{"experimental": true}' | sudo tee /etc/docker/daemon.json > /dev/null
        sudo systemctl restart docker

        # Configure qemu-user-static
        docker run --rm --tty \
          --security-opt apparmor:unconfined \
          --cap-add SYS_ADMIN \
          multiarch/qemu-user-static --reset -p yes

        # Run snapcraft
        docker run --rm --tty \
          --security-opt apparmor:unconfined \
          --cap-add SYS_ADMIN \
          --device /dev/fuse \
          --volume /sys \
          --volume /sys/fs/cgroup:/sys/fs/cgroup:ro \
          --volume $GITHUB_WORKSPACE:$GITHUB_WORKSPACE \
          --workdir $GITHUB_WORKSPACE \
          --platform "${{ matrix.architecture }}" \
          --env PLAYTEST="${{ matrix.playtest }}" \
          diddledan/snapcraft:core18

        echo ::set-output name=snap::$(find $GITHUB_WORKSPACE -maxdepth 1 -type f -name "*.snap" | head -n1)

    # Release this Snap to the channel we choose.
    - uses: snapcore/action-publish@v1
      with:
        store_login: ${{ secrets.STORE_LOGIN }}
        snap: ${{ steps.build.outputs.snap }}
        release: beta

出版のためのストア資格
残っている唯一のことはSTORE_LOGIN Githubリポジトリへの秘密store-credentials.secret , Linux端末で以下のコマンドで生成します.
snapcraft export-login \
   --snaps="$SNAP_NAME" \
   --acls package_access,package_push,package_update,package_release \
   store-credentials.secret
交換することを確認$SNAP_NAME あなたのスナップの名前を使用すると、設定されます.

結論
そして最後の一歩です私の計画は完了です.スナップインクラフトのビルドで、すべてのスナップアーキテクチャのコンテナイメージでqemu-user-static , 我々は現在、すべてのアーキテクチャのためのGithubアクション、Travis CI、または他の競合する連続統合ランナーを使用してスナップパッケージを構築することができます.我々は現在、我々は選択し、我々のビルドのセットアップにcodifyルールを使用して希望のいずれかのトラックのスナップストアにリリースすることができます.
それは私の、人々からです.今すぐあなたのターン何か素晴らしいこの簡単なセットアップとCIプロバイダの選択を使用してスナップイン!私は、あなたが何を造るかについて見るのを待つことができません.