tag:crieit.net,2005:https://crieit.net/tags/CI/feed 「CI」の記事 - Crieit Crieitでタグ「CI」に投稿された最近の記事 2020-04-04T15:57:22+09:00 https://crieit.net/tags/CI/feed tag:crieit.net,2005:PublicArticle/15810 2020-04-04T10:47:33+09:00 2020-04-04T15:57:22+09:00 https://crieit.net/posts/github-actions-build-lastmod hugoをgithub-actions上でbuildした際、lastmodの更新がすべての記事に適用される問題を解決した <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://tech-wafter.net/2020/build-hugo-homepage-by-github-action/">hugoのジェネレートをGitHub-actionsを使って、pushするだけでデプロイできるようにした</a>のですが、全記事の最終更新日が更新されていたため原因調査をおこないました。</p> <h2 id="TL;DR"><a href="#TL%3BDR">TL;DR</a></h2> <ul> <li>gitのcloneを行う際に最新コミットしか取得していなかった</li> <li><code>actions/checkout</code>を利用する場合は以下の方法でfetchを行わせ、全履歴を取得しておく</li> </ul> <pre><code class="yaml">- uses: actions/checkout@v2 with: fetch-depth: 0 # Fetch all history for .GitInfo and . </code></pre> <h2 id="試したこと"><a href="#%E8%A9%A6%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8">試したこと</a></h2> <h3 id="GitHub-actions上とlocalの比較"><a href="#GitHub-actions%E4%B8%8A%E3%81%A8local%E3%81%AE%E6%AF%94%E8%BC%83">GitHub-actions上とlocalの比較</a></h3> <div class="table-responsive"><table> <thead> <tr> <th align="center">icon</th> <th align="center">結果</th> </tr> </thead> <tbody> <tr> <td align="center">✅</td> <td align="center">更新対象記事のみlastmodが更新されていた</td> </tr> <tr> <td align="center">❎</td> <td align="center">すべての記事に対して更新が入っていた</td> </tr> </tbody> </table></div> <ul> <li>ローカル <ul> <li>✅MacOSでのビルド</li> <li>✅Vagrant内のUbuntu:18.04.4でのビルド</li> </ul></li> <li><p>CI環境</p> <ul> <li>❎Ubuntu:ubuntu-18.04でのビルド</li> <li>❎MacOS:latestでのビルド</li> <li>✅hugoのビルドを省いてデプロイ</li> <li>❎オプションを外してビルド</li> <li><p>❎既存のworkflowを使わずにコマンドでインストール(下記コマンドを実行)</p> <pre><code class="bash">wget https://github.com/gohugoio/hugo/releases/download/v0.68.3/hugo_0.68.3_Linux-64bit.deb sudo apt-get install -y ./hugo_0.68.3_Linux-64bit.deb </code></pre></li> </ul></li> </ul> <h3 id="git周りの確認"><a href="#git%E5%91%A8%E3%82%8A%E3%81%AE%E7%A2%BA%E8%AA%8D">git周りの確認</a></h3> <ul> <li>参照先のcommitIDが対象コミットのcommitIDになっているか <ul> <li>対象のコミットIDでした</li> </ul></li> <li><code>git log</code>の結果が正常に表示されているか <ul> <li><strong>CI上のログでは、1件しか表示されていなかった</strong></li> </ul></li> </ul> <h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2> <p><code>actions/checkout@v2</code>という公式のworkflowを利用してgitのcloneを行っていたのですが、デフォルトでは最新のコミットしか取ってこないようです。<br /> 更新日時の参照先が見つけられなくなるため、すべての記事が最新のコミット更新日時を取得しに行ってしまったのだと思います。</p> <blockquote> <pre><code class="markdown"># Number of commits to fetch. 0 indicates all history. # Default: 1 fetch-depth: '' </code></pre> <p>https://github.com/actions/checkout#usage</p> </blockquote> <p>すべての履歴をcloneしてくることで、解決しました。<br /> GitHub Actionsのymlファイルでは、以下のように記載するようです。</p> <blockquote> <pre><code class="yaml">- uses: actions/checkout@v2 with: fetch-depth: 0 # Fetch all history for .GitInfo and . </code></pre> <p>https://github.com/peaceiris/actions-hugo#️-create-your-workflow</p> </blockquote> <h2 id="さいごに"><a href="#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB">さいごに</a></h2> <p>最初はhugoのセットアップに使っているworkflowが悪いのかを疑ってたせいで、結構解決までに時間がかかりました…</p> <p>今回のような問題を早期発見するために、確認用のStepも入れたほうが良いのかなと思いました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/actions/checkout">actions/checkout: Action for checking out a repo</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/peaceiris/actions-hugo">peaceiris/actions-hugo: GitHub Actions for Hugo ⚡️ Setup Hugo quickly and build your site fast. Hugo extended, Hugo Modules, Linux (Ubuntu), macOS, and Windows are supported.</a></li> </ul> matsu4ki tag:crieit.net,2005:PublicArticle/15728 2020-02-20T18:48:36+09:00 2020-02-26T17:42:55+09:00 https://crieit.net/posts/GitHub-Actions-MySQL-Laravel GitHub ActionsでMySQLを使ったLaravelのテストを実行する <p>GitHub ActionsでMySQLを使ったLaravelのテストを実行してみたら出来たのでメモ。</p> <p>アクションを作成する時にLaravelの雛形が選べるようなので、とりあえずそちらを使って作成する。雛形を下記のように置き換えた。</p> <pre><code class="yaml">name: Laravel on: [push] jobs: laravel-tests: runs-on: ubuntu-latest services: mysql: image: mysql:5.7 ports: - 3306 options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10 env: MYSQL_ALLOW_EMPTY_PASSWORD: yes MYSQL_DATABASE: laravel steps: - uses: actions/checkout@v2 - name: Copy .env run: php -r "file_exists('.env') || file_put_contents('.env', str_replace('DB_PORT=3306', 'DB_PORT=$<span>{</span><span>{</span> job.services.mysql.ports['3306'] <span>}</span><span>}</span>', file_get_contents('.env.example')));" - name: Cache vendor id: cache-vendor uses: actions/cache@v1 with: path: vendor key: $<span>{</span><span>{</span> runner.os <span>}</span><span>}</span>-vendor-$<span>{</span><span>{</span> hashFiles('**/composer.lock') <span>}</span><span>}</span> - name: Install Dependencies if: steps.cache-vendor.outputs.cache-hit != 'true' run: composer install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist - name: Generate key run: php artisan key:generate - name: Directory Permissions run: chmod -R 777 storage bootstrap/cache - name: Execute tests (Unit and Feature tests) via PHPUnit run: vendor/bin/phpunit </code></pre> <h2 id="やったこと"><a href="#%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">やったこと</a></h2> <p>下記が追加で編集したもの。</p> <h3 id="MySQLの設定"><a href="#MySQL%E3%81%AE%E8%A8%AD%E5%AE%9A">MySQLの設定</a></h3> <p>もともとはSQLiteでテストが行われる設定になっていたが、ちゃんとMySQLで実行したいのでその設定。まずはservicesにMySQLのサービスを追加。optionsはよくわからないがコンテナが落ちてしまうらしいので追加している。そのうち不要になるのでは。</p> <p>接続の設定は <code>.env.example</code> をコピーして使う。そのため、その設定に合わせてこのサービスのenvを設定する。具体的な設定はDockerHubのmysqlイメージのところに書いてある。</p> <p>ポートは <code>$<span>{</span><span>{</span> job.services.mysql.ports['3306'] <span>}</span><span>}</span></code> という感じでサービスのポートを参照できる。ホストはローカル。ただしlocalhostでなく127.0.0.1としないとつながらないっぽい。</p> <h4 id="phpunit.xmlの編集"><a href="#phpunit.xml%E3%81%AE%E7%B7%A8%E9%9B%86">phpunit.xmlの編集</a></h4> <p>phpunit.xmlにSQLiteを使う設定が書かれているので、そちらを削除する。</p> <h3 id="キャッシュの設定"><a href="#%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AE%E8%A8%AD%E5%AE%9A">キャッシュの設定</a></h3> <p>vendorフォルダをキャッシュする。Cache vendorとInstall Dependenciesのところ。これでキャッシュされて次回から0秒になっているので多分大丈夫っぽい。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e4e55ac0e03c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e4e55ac0e03c.png?mw=700" alt="image.png" /></a></p> <p>ちなみに下記がキャッシュ前。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e4e55d2a2859.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e4e55d2a2859.png?mw=700" alt="image.png" /></a></p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>雛形もあるし非常に簡単だった。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14861 2019-03-08T00:17:46+09:00 2019-03-08T00:19:10+09:00 https://crieit.net/posts/Express-TypeORM-Wercker-CI Express+TypeORMの環境にてWerckerでCI <p>ExpressとTypeORMを使ったアプリケーションのWerckerでのCIがとりあえず完成したのでメモ。</p> <pre><code class="yaml">box: node services: - id: mysql tag: 5.7 env: MYSQL_ALLOW_EMPTY_PASSWORD: true MYSQL_DATABASE: dbname build: steps: - script: name: yarn code: yarn - script: name: Fill mysql env code: |- cp .env.example .env sudo sed -i -e "s/TYPEORM_HOST=localhost/TYPEORM_HOST=$MYSQL_PORT_3306_TCP_ADDR/g" .env sudo sed -i -e "s/TYPEORM_PORT=3306/TYPEORM_PORT=$MYSQL_PORT_3306_TCP_PORT/g" .env cp .env test/.env - script: name: migration code: yarn run migrate:run - script: name: yarn test code: yarn test </code></pre> <p>migrationとtestのコマンドは適宜自分で設定。</p> <p><code>test/.env</code>はテスト用に読むこむやつを設定しているというだけなので別のやり方をしている場合は不要。</p> <p>TypeORMは特にテスト用のDB管理方法があるわけではないようなので、事前にマイグレーションしている。(ローカル環境も考慮すると全部自分で準備しなければならないのが非常に面倒)</p> <p>ちなみにテストは下記でつくったもの。</p> <p><a href="https://crieit.net/posts/Mocha-SuperTest-async-await">Mocha+SuperTestでasync/awaitを使ってテスト</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14469 2018-06-17T19:55:22+09:00 2018-10-25T17:29:30+09:00 https://crieit.net/posts/Wercker-Laravel5-6-PHP7-CI WerckerでLaravel5.6+PHP7のCI <p><a href="https://crieit.net/posts/BitBucket-Wercker-Laravel5-CI">BitBucket+WerckerでLaravel5のCI</a> でも書いたとおり、BitBucket+Werckerを利用することでLaravel5のCIを無料で簡単に行うことができます。</p> <p>ただ、上記の内容だと最新のLaravel5.6(PHP7)には対応していないため、対応したものでCIできるようにしてみました。</p> <p>下記が設定のためのwercker.ymlになります。</p> <pre><code class="yaml">box: dala00/laravel services: - id: mysql tag: 5.7 env: MYSQL_ALLOW_EMPTY_PASSWORD: "true" MYSQL_DATABASE: test build: steps: - script: name: Install dependencies code: | composer install - script: name: Fill mysql env. code: |- sudo sed -i -e "s/DB_HOST=mysql/DB_HOST=$MYSQL_PORT_3306_TCP_ADDR/g" .env.testing sudo sed -i -e "s/DB_PORT=3306/DB_PORT=$MYSQL_PORT_3306_TCP_PORT/g" .env.testing - script: name: Run phpunit code: |- vendor/bin/phpunit </code></pre> <h2 id="Werckerで使っている設定の解説"><a href="#Wercker%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E8%A8%AD%E5%AE%9A%E3%81%AE%E8%A7%A3%E8%AA%AC">Werckerで使っている設定の解説</a></h2> <pre><code class="yaml">box: dala00/laravel </code></pre> <p>僕が作ったイメージです(7.2。タグ付けは忘れているようです)。<code>/var/www/app</code>にプロジェクトが入っています。ちょっとしたものは大体動くのでこれで問題ない気がします(どうしてもちょうどいいイメージが見つからないため…)。</p> <pre><code class="yaml"> - id: mysql tag: 5.7 </code></pre> <p>mysql8が入るとパスワードのプラグインが違う関係でWerckerのCI時に接続ができません。仕方がないのでtagで5.7を指定しています。(恐らく今後イメージ側かWercker側で対処してくれるとは思うのですが…)</p> <pre><code class="yaml"> sudo sed -i -e "s/DB_HOST=mysql/DB_HOST=$MYSQL_PORT_3306_TCP_ADDR/g" .env.testing sudo sed -i -e "s/DB_PORT=3306/DB_PORT=$MYSQL_PORT_3306_TCP_PORT/g" .env.testing </code></pre> <p>Laravel5.6のテストの場合はphpunit.xmlで指定されている環境変数である<code>APP_ENV=testing</code>が使われるため、<code>.env.testing</code>が優先的に使用されます。また、WerckerはDBのIPがMYSQL_PORT_3306_TCP_ADDRで取得できるので、<code>.env.testing</code>をその内容に置換します。置換前の文字列は適宜自分のものに置き換えてください。</p> <p>こんな感じでWerckerにてLaravel5.6のCIが可能です。BitBucketを利用されている方は連携も非常に簡単ですので是非お試しください。</p> だら@Crieit開発者