-
Notifications
You must be signed in to change notification settings - Fork 1
morimoto/linux-ci
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
============== -*- outline -*- ============== Linux-CI 2019/11/20 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> ============================================= * Linux-CI とは? Linux Kernel を開発していると、特定環境下ではコンパイルが 通らなくなっている場合があり、しかも、それに気づかない場合が多い。 Linux-CI を使う事であらゆる環境でのコンパイルテストをする事で そのような問題を事前に察知する事を目的としている Linux-CI は「自前の環境」「リモート環境」「Gitlab」で 使用される事を想定している。 「Github」もターゲットに入っているが、現在調査中。 * Kernel-CI と何が違うの? Kernel-CI も似たような事をしているが、規模が大きすぎたり 大げさ過ぎる。単にコンパイルを自動化したいだけなら Linux-CI。 * 事前準備 各種ツールが必要。Ubuntu の場合 > sudo script/tool-install-ubuntu.sh * ローカルマシンで好きな時に使う ローカルマシンで、好きなタイミングで Linux-CI を実行する ための方法です。リモート環境で使う場合、Gitlab で使う場合の 基本となります ** Linux-CI を clone する 以下のいづれかで clone > git clone https://gitlab.com/morimoto.kuninori/linux-ci.git > git clone https://github.com/morimoto/linux-ci.git ** yaml/sample-setup.yaml をベースに yaml/setup.yaml を作成 (必須) Linux Kerenl の位置、mail、ジョブ数等を設定するため、 yaml/sample-setup.yaml をコピーし、yaml/setup.yaml を編集する 「yaml」章を参照 > cp yaml/sample-setup.yaml yaml/setup.yaml > vi yaml/setup.yaml ** yaml/xx.yaml をベースにコンパイル対象等を設定 (オプション) Linux-CI は config を指定するか yaml/xxx.yaml を元に コンパイルします。 yaml/all-arch.yaml はサポート済みの全てのアーキテクチャで、 全てのドライバをコンパイルする設定が書いてあるが、 設定を理解するのは簡単 --- yaml/all-arch.yaml --- target: - x86-allyesconfig - x86-allmodconfig ... -------------------------- ** 実行する 自前の config ファイルを使う場合は目的の .config を <arch>-<name> と言うファイル名で適当な場所に保存し、以下を実行 例) arm64 で sound 用に特化した .config を使う場合 > cp ${LINUX}/.config /tmp/arm64-sound > make CONFIG=/tmp/arm64-sound config yaml/yyy.yaml を使う場合は > make yyy で、Linux-CI がスタートする 各コンパイルは binary 以下で実行され、 yaml/setup.yaml に log の設定があれば実行結果はそれぞれの フォルダ内の log ファイルに保存される。 コンパイル結果はそれぞれの log を参照するか、または、 setup.yaml に mail が設定されている場合はメールで送られる。 コンパイルをバックグラウンドで実行しておきたい場合は 以下のコマンドを使う > script/bkmake all-arch *** 注意1 Linux-CI は yaml/setup.yaml ファイルの kernel に指定されている Linux Kernel をそのまま使用します。 Linux-CI で使用する branch を事前に checkout しておく必要が有ります *** 注意2 Linux-CI はバイナリを binary ディレクトリ以下に出力します。 そのため、Linux Kernel は事前に make mrproper がされている 必要が有ります。 *** 注意3 Linux-CI は make xxx を実行すると、make.ci と言う ファイルを作成し実行します。 万が一 make に失敗した場合、もう一度 make xxx を実行しても "previous make not yet finished" と言うエラーを出力します。 その場合は、以下を試してください 前回の make を続ける > make 前回の make を取り消す > make clean *** 注意4 yaml に書いた設定順序とは違う順番でコンパイルされます。 yaml 自体が順番を気にしない事が原因です。 * リモート環境で好きな時に使う リモートにコンパイルマシンを持っている場合などに、 リモートマシンで Linux-CI を実行する場合の手順です。 設定ができれば、リモートマシンで Linux-CI を実行させ、 ローカルマシンは電源を切ることが出来ます ** リモートマシンで下準備 リモートマシン上で「ローカルマシンで好きな時に使う」と同じ設定をする。 ** ローカルマシンからリモートマシンに指示を出す ${REMOTE}: リモートマシンの IP アドレス ${LINUX}: リモートマシン上の Linux Kernel の展開場所 ${LINUXCI}: リモートマシン上の Linux-CI の展開場所 ${BRANCH}: ${LINUX} でのコンパイル対象のブランチ/コミット # リモートマシン上でターゲット branch を checkout する > ssh ${REMOTE} git -C ${LINUX} checkout ${BRANCH} # リモートマシン上でコンパイル状況を確認しながら Linux-CI を実行 > ssh ${REMOTE} "cd ${LINUXCI}; make all-arch" # リモートマシンで Linux-CI を実行。 # ローカルマシンは電源を切って帰宅する > ssh -f ${REMOTE} ${LINUXCI}/script/bkmake all-arch > sudo shutdown -h now * Git サーバーに hook をつけて実行する リモートマシン上に Linux Kernel のリポジトリを置いている場合、 リモートマシンに git push をしたタイミングで自動的に Linux-CI を実行させることが出来ます ** 想定環境 ${REMOTE}: Git サーバーの IP アドレス ${GIT}: Git サーバー上の Git リポジトリの場所 ${LINUX}: Git サーバー上の Linux Kernel の展開場所 ${LINUXCI}: Git サーバー上の Linux-CI の展開場所 ローカル環境では、このように Git サーバーから clone します > git clone ${REMOTE}:/${GIT} Git サーバー上では、予め Linux Kernel と Linux-CI を展開し、 「ローカルマシンで好きな時に使う」と同じ設定をしておきます ** yaml/setup.yaml を設定する yaml/setup.yaml で以下の 2 つの設定を有効化する。 これらは ${GIT}/hook/update から使用されます ci_branch: ci_yaml: ** Git hook を仕掛ける Git サーバー上のリポジトリにローカルマシンから 「git push」が あったした場合に起動するスクリプト設定します。 -- ${GIT}/hook/update -- ${LINUXCI}/script/makefile.py -p $@ -- ${GIT}/hook/post-receive -- ${LINUXCI}/script/bkmake それぞれスクリプトなので実行権限を与えます > chmod +x ${GIT}/hook/update > chmod +x ${GIT}/hook/post-receive *** 注意1 Git サーバー上で、Linux-CI を実行する為に Linux-CI の他に Linux Kernel も用意する必要が有りますが、 どちらも git push 時にリポジトリの更新や checkout をします。 Git サーバーに Linux-CI を仕掛けた場合は、 以降 Linux-CI / Linux Kernel を手動でいじらないで下さい *** 注意2 git push した際、サーバー側で Linux Kernel リポジトリの更新 を行うため、Linux CI の開始までに時間がかかります。 根気よく待ちましょう *** 注意3 git push 時に "previous make not yet finished" と言われた場合、 前回 push 時の Linux-CI がまだ動いているか、または何らかの エラーが発生して止まっている可能性が有ります。 前回の Linux-CI がまだ動いているなら、終わるまで待ちましょう エラーが発生して止まっているなら、サーバー上で自力で ${LINUXCI}/make をするか、 ${LINUXCI}/make clean してファイルを削除してください * Gitlab で使う Linux-CI は Gitlab の CI/CD で実行する事も出来ます ただし、無料で使用できる時間は制限されているようです ** Linux Kernel に .gitlab-ci.yml を用意する (必須) Gitlab は push したリポジトリが .gitlab-ci.yml を持っている場合、 その指示に沿って CI マシンを動かす仕組みになっています。 Gitlab で CI/CD を自動で実行させるための仕掛けを用意します *** .gitlab-ci.yml をコピー Linux-CI に用意されている Gitlab 用のファイルを Linux Kernel にコピーする > cp ${LINUXCI}/yaml/.gitlab-ci.yaml ${LINUX} *** .gitlab-ci.yml を編集 環境に合わせ使用する Linux-CI やコンパイル対象を設定するため、 "custom here" の箇所を編集します > vi ${LINUX}/.gitlab-ci.yaml Gitlab では複数のコンパイルを同時に実行できます とりあえず使いたい場合でも編集してください 要「注意2」 *** .gitlab-ci.yml を git add (必須) .gitlab-ci.yml を Linux Kernel の git 管理下に置く Linux Kernel では -f をつけないと add できないので注意 > git add -f .gitlab-ci.yml ** Gitlab へ push (必須) あとはそのまま Gitlab へ push する git push gitlab xxxx push した Gitlab ページの Linux プロジェクトのメニューから「CI/CD」 を選択すると「パイプライン」や「ジョブ」から実行状況や結果を見ること が出来ます。 *** 注意1 Gitlab 自体に結果をメールで送る機能が有ります。 setup.yaml の設定ではなく Gitlab の設定でメールが届きます そちらの機能を使ってメールを受け取ってください *** 注意2 Linux-CI にサンプルで付いている .gitlab-ci.yml では 全 config を実行しようとしますが、膨大な時間がかかるため、 あっ と言う間に Gitlab-Ci で無料で使用できる時間を消費してしまいます。 不要なモノは消しましょう *** 注意3 Gitlab の CI/CD を無料で使用するのは上限があるようです。 それ以降は時間を購入するか、ローカルマシンを Gitlab Runner として登録する必要があるようです * Github ** 現在調査中 * yaml/setup-yaml ** kernel (必須) Linux Kernel への PATH ** log (オプション) 1 : コンパイル時に log を取ります。 0 : コンパイル時に log を取りません。 1 の場合、コンパイルに失敗しても Linux-CI は全てのターゲットの コンパイルをするまで止まりません。 0 の場合、コンパイルに失敗した段階で止まります ** mail (オプション) コンパイル結果の log をメールで受け取る場合に指定します。 そのため、log: 1 の設定が必要 その際には、~/.mailrc の設定が別途必要になります 以下のコマンドを実行して、メールが届けば OK > echo "Test mail" | mail -s "Test" xxx@xxx.com ** logerr (オプション) コンパイル結果をメールする際、error や warning だけに絞る コンパイルに成功した場合は空メールが届く ** jobs (オプション) make コマンドの -j オプションに渡す数 指定がない場合は 1 になる マシンに合わせて設定するとコンパイルが早くなります ** ccache (オプション) コンパイル時に ccache を使うかどうかの設定です 1 を指定する事で ccache を使用します ** ci_branch git push した時に自動で実行される Linux-CI の設定です。 Linux-CI 自体を更新した後、ここで指定したブランチを checkout します。 自前環境を作っている場合に便利です ** ci_yaml git push した時に自動で実行される Linux-CI の設定です。 ここで指定した対象を Linux-CI を実行します * yaml/設定ファイル ** target コンパイルに使用するコマンド 「アーキテクチャ」と「コマンド」に分かれている target: - x86-allyesconfig
About
No description, website, or topics provided.
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published