summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2024-04-20 23:44:15 +0900
committernsfisis <nsfisis@gmail.com>2024-04-20 23:44:30 +0900
commit88f8bcc0862621c96d23a552eaa2a8fed010440f (patch)
treee9822c6dcbf4ac58df5638fa6c4d4f3d4fb3c615
parentb372b90ae4f65855d6f7132c7722f0228f43daa8 (diff)
downloadnsfisis.dev-88f8bcc0862621c96d23a552eaa2a8fed010440f.tar.gz
nsfisis.dev-88f8bcc0862621c96d23a552eaa2a8fed010440f.tar.zst
nsfisis.dev-88f8bcc0862621c96d23a552eaa2a8fed010440f.zip
feat(blog/content): new post /posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/
-rw-r--r--vhosts/blog/content/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd.ndoc180
-rw-r--r--vhosts/blog/nuldoc-src/config.ts4
-rw-r--r--vhosts/blog/public/atom.xml10
-rw-r--r--vhosts/blog/public/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/index.html229
-rw-r--r--vhosts/blog/public/posts/atom.xml10
-rw-r--r--vhosts/blog/public/posts/index.html15
-rw-r--r--vhosts/blog/public/tags/ci-cd/atom.xml19
-rw-r--r--vhosts/blog/public/tags/ci-cd/index.html66
-rw-r--r--vhosts/blog/public/tags/gitlab/atom.xml19
-rw-r--r--vhosts/blog/public/tags/gitlab/index.html66
-rw-r--r--vhosts/blog/public/tags/index.html20
11 files changed, 635 insertions, 3 deletions
diff --git a/vhosts/blog/content/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd.ndoc b/vhosts/blog/content/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd.ndoc
new file mode 100644
index 00000000..028cbbb0
--- /dev/null
+++ b/vhosts/blog/content/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd.ndoc
@@ -0,0 +1,180 @@
+---
+[article]
+uuid = "a4c326a6-5ffe-450c-abf2-45833c5efb6a"
+title = "【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている"
+description = "GitLab CI/CD で bash/sh スクリプトを動かすと、pipefail オプションが有効になった状態で実行される。"
+tags = [
+ "ci-cd",
+ "gitlab",
+]
+
+[[article.revisions]]
+date = "2022-11-17"
+remark = "デジタルサーカス株式会社の社内記事として公開"
+isInternal = true
+
+[[article.revisions]]
+date = "2024-04-21"
+remark = "ブログ記事として一般公開"
+---
+<article>
+ <note>
+ この記事は、2022-11-17 に<a href="https://www.dgcircus.com/">デジタルサーカス株式会社</a> の社内 Qiita Team に公開された記事をベースに、加筆修正して一般公開したものです。
+ </note>
+ <p>
+ ハマったのでメモ。
+ </p>
+ <section id="background">
+ <h>前提</h>
+ <section id="background--gitlab-ci-cd">
+ <h>GitLab CI/CD について</h>
+ <p>
+ GitLab CI/CD では、Docker executor を用いて任意の Docker image 上でスクリプトを走らせることができる。
+ </p>
+ <p>
+ 例:
+ </p>
+ <codeblock language="yaml" filename=".gitlab-ci.yml">
+ <![CDATA[
+ hello-world:
+ stage: test
+ image: alpine:latest
+ script:
+ - 'echo "Hello, World!"'
+ rules:
+ - if: '$CI_MERGE_REQUEST_IID'
+ when: always
+ ]]>
+ </codeblock>
+ <p>
+ ここで、<code>script</code> に指定したコマンドが失敗する (exit status が 0 以外になる) と、即座に実行が停止され、ジョブは失敗する。
+ </p>
+ <p>
+ では、次のようなケースだとどうなるか。
+ </p>
+ <codeblock language="yaml" filename=".gitlab-ci.yml">
+ <![CDATA[
+ hello-world:
+ stage: test
+ image: alpine:latest
+ script:
+ - 'exit 1 | exit 0'
+ rules:
+ - if: '$CI_MERGE_REQUEST_IID'
+ when: always
+ ]]>
+ </codeblock>
+ <p>
+ 失敗するコマンドをパイプに接続した。通常 Bash では、パイプの最後のコマンドの exit code が全体の exit code になる。
+ </p>
+ </section>
+ <section id="background--pipefail-option">
+ <h><code>pipefail</code> オプションについて</h>
+ <p>
+ 前述したようなケースにおいて、途中で失敗したときに全体を失敗させるには、<code>pipefail</code> オプションを有効にする。
+ </p>
+ <codeblock language="bash">
+ <![CDATA[
+ # On にする
+ set -o pipefail
+ # Off にする
+ set +o pipefail
+ ]]>
+ </codeblock>
+ <p>
+ こうすると、パイプ全体が失敗するようになる。
+ この設定は、デフォルトだと off になっている。
+ </p>
+ </section>
+ </section>
+ <section id="problem">
+ <h>発生した問題</h>
+ <p>
+ 次のような GitLab CI/CD ジョブが失敗してしまった。
+ </p>
+ <codeblock language="yaml" filename=".gitlab-ci.yml">
+ <![CDATA[
+ hoge:
+ stage: test
+ image: alpine:latest
+ script:
+ - 'cat hoge.txt | grep piyo | sed -e "s/foo/bar/g"'
+ rules:
+ - if: '$CI_MERGE_REQUEST_IID'
+ when: always
+ ]]>
+ </codeblock>
+ <p>
+ <code>grep</code> コマンドは、パターンにマッチする行が一行もなかったとき、exit code 1 を返す。よって、<code>pipefail</code> が on になっていると、このジョブは失敗する。
+ 現在の <code>pipefail</code> がどうなっているか確かめるため <code>set +o</code> で全オプションを出力させたところ、<code>pipefail</code> が on になっていた。
+ </p>
+ <p>
+ しかし、先述したように Bash における <code>pipefail</code> のデフォルト値は off のはずだ。
+ 実際に、ローカルで <code>alpine:latest</code> を動かしてみたところ、
+ </p>
+ <codeblock>
+ <![CDATA[
+ $ docker run --rm alpine:latest sh -c "set +o"
+ set +o errexit
+ set +o noglob
+ set +o ignoreeof
+ set +o monitor
+ set +o noexec
+ set +o xtrace
+ set +o verbose
+ set +o noclobber
+ set +o allexport
+ set +o notify
+ set +o nounset
+ set +o vi
+ set +o pipefail
+ ]]>
+ </codeblock>
+ <p>
+ 確かに <code>pipefail</code> は無効になっている。
+ </p>
+ <p>
+ なぜスクリプト内で <code>set -o pipefail</code> しているわけでもないのに <code>pipefail</code> が on になっているのか。
+ </p>
+ </section>
+ <section id="where-pipefail-is-enabled">
+ <h>どこで <code>pipefail</code> が on になるか</h>
+ <p>
+ <code>.gitlab-ci.yml</code> で明示的には書いていないので、GitLab Runner (GitLab CI/CD のスクリプトを実行するプログラム) が勝手に追加しているに違いない。
+ そう仮説を立てて <a href="https://gitlab.com/gitlab-org/gitlab-runner">GitLab Runner のリポジトリ</a> を調査したところ、<a href="https://gitlab.com/gitlab-org/gitlab-runner/-/blob/c75da0796a0e3048991dccfdf2784e3d931beda4/shells/bash.go#L276">ソースコード中の以下の箇所</a> で <code>set -o pipefail</code> していることが判明した (コメントは筆者による)。
+ </p>
+ <codeblock language="go">
+ <![CDATA[
+ // pipefail オプションが存在しない環境にも対応するため、
+ // 先に set -o でオプション一覧を表示させたあと、set -o pipefail している
+ buf.WriteString("if set -o | grep pipefail > /dev/null; then set -o pipefail; fi; set -o errexit\n")
+ ]]>
+ </codeblock>
+ </section>
+ <section id="how-to-solve">
+ <h>どのように解決するか</h>
+ <p>
+ 通常の Bash スクリプトを書く場合と同様に、<code>pipefail</code> が on になっていては困る場所だけ off にしてやればよい。
+ </p>
+ <codeblock language="yaml" diff="true" filename=".gitlab-ci.yml">
+ <![CDATA[
+ hoge:
+ stage: test
+ image: alpine:latest
+ script:
+ + - 'set +o pipefail'
+ - 'cat hoge.txt | grep piyo | sed -e "s/foo/bar/g"'
+ + - 'set -o pipefail' # この例の場合、ここで終わりなので戻さなくてもよい
+ rules:
+ - if: '$CI_MERGE_REQUEST_IID'
+ when: always
+ ]]>
+ </codeblock>
+ </section>
+ <section id="remarks">
+ <h>備考</h>
+ <p>
+ なお、上述した実装ファイルは <code>shells/bash.go</code> だが、<code>alpine:latest</code> の例でもそうであったように、シェルが <code>sh</code> である場合にも適用される。
+ </p>
+ </section>
+</article>
diff --git a/vhosts/blog/nuldoc-src/config.ts b/vhosts/blog/nuldoc-src/config.ts
index a1951190..a4f582e7 100644
--- a/vhosts/blog/nuldoc-src/config.ts
+++ b/vhosts/blog/nuldoc-src/config.ts
@@ -15,17 +15,19 @@ export const config = {
siteName: "REPL: Rest-Eat-Program Loop",
siteCopyrightYear: 2021,
tagLabels: {
+ "ci-cd": "CI/CD",
"conference": "カンファレンス",
"cpp": "C++",
"cpp17": "C++ 17",
+ "gitlab": "GitLab",
"isucon": "ISUCON",
"neovim": "Neovim",
"note-to-self": "備忘録",
"ouj": "放送大学",
"perl": "Perl",
"php": "PHP",
- "phpconfuk": "PHP カンファレンス福岡",
"phpcon-odawara": "PHP カンファレンス小田原",
+ "phpconfuk": "PHP カンファレンス福岡",
"phpconokinawa": "PHP カンファレンス沖縄",
"phperkaigi": "PHPerKaigi",
"phpkansai": "PHP カンファレンス関西",
diff --git a/vhosts/blog/public/atom.xml b/vhosts/blog/public/atom.xml
index 60b74a54..8f7ef87d 100644
--- a/vhosts/blog/public/atom.xml
+++ b/vhosts/blog/public/atom.xml
@@ -7,7 +7,15 @@
<author>
<name>nsfisis</name>
</author>
- <updated>2024-04-14T00:00:00+09:00</updated>
+ <updated>2024-04-21T00:00:00+09:00</updated>
+ <entry>
+ <id>urn:uuid:a4c326a6-5ffe-450c-abf2-45833c5efb6a</id>
+ <link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/"></link>
+ <title>【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている</title>
+ <summary>GitLab CI/CD で bash/sh スクリプトを動かすと、pipefail オプションが有効になった状態で実行される。</summary>
+ <published>2024-04-21T00:00:00+09:00</published>
+ <updated>2024-04-21T00:00:00+09:00</updated>
+ </entry>
<entry>
<id>urn:uuid:be9c896d-7efa-42dd-a50a-dda5fd3a7f5c</id>
<link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-14/phpcon-odawara-2024-report/"></link>
diff --git a/vhosts/blog/public/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/index.html b/vhosts/blog/public/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/index.html
new file mode 100644
index 00000000..fb77cdc0
--- /dev/null
+++ b/vhosts/blog/public/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/index.html
@@ -0,0 +1,229 @@
+<!DOCTYPE html>
+<html lang="ja-JP">
+ <head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="author" content="nsfisis">
+ <meta name="copyright" content="&copy; 2024 nsfisis">
+ <meta name="description" content="GitLab CI/CD で bash/sh スクリプトを動かすと、pipefail オプションが有効になった状態で実行される。">
+ <meta name="keywords" content="CI/CD,GitLab">
+ <meta property="og:type" content="article">
+ <meta property="og:title" content="【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている|REPL: Rest-Eat-Program Loop">
+ <meta property="og:description" content="GitLab CI/CD で bash/sh スクリプトを動かすと、pipefail オプションが有効になった状態で実行される。">
+ <meta property="og:site_name" content="REPL: Rest-Eat-Program Loop">
+ <meta property="og:locale" content="ja_JP">
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg">
+ <title>【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている|REPL: Rest-Eat-Program Loop</title>
+ <link rel="stylesheet" href="/style.css?h=0656606dcfb3f6fa094a976e05df9007">
+ <link rel="stylesheet" href="/hl.css?h=340e65ffd5c17713efc9107c06304f7b">
+ </head>
+ <body class="single">
+ <header class="header">
+ <div class="site-logo">
+ <a href="/">REPL: Rest-Eat-Program Loop</a>
+ </div>
+ <nav class="nav">
+ <ul>
+ <li>
+ <a href="/about/">About</a>
+ </li>
+ <li>
+ <a href="/posts/">Posts</a>
+ </li>
+ <li>
+ <a href="/slides/">Slides</a>
+ </li>
+ <li>
+ <a href="/tags/">Tags</a>
+ </li>
+ </ul>
+ </nav>
+ </header>
+ <main class="main">
+ <article class="post-single">
+ <header class="post-header">
+ <h1 class="post-title">【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている</h1>
+ <ul class="post-tags">
+ <li class="tag">
+ <a href="/tags/ci-cd/">CI/CD</a>
+ </li>
+ <li class="tag">
+ <a href="/tags/gitlab/">GitLab</a>
+ </li>
+ </ul>
+ </header>
+ <div class="post-content">
+ <section>
+ <h2 id="changelog">更新履歴</h2>
+ <ol>
+ <li class="revision">
+ <time datetime="2022-11-17">2022-11-17</time>: デジタルサーカス株式会社の社内記事として公開
+ </li>
+ <li class="revision">
+ <time datetime="2024-04-21">2024-04-21</time>: ブログ記事として一般公開
+ </li>
+ </ol>
+ </section>
+ <div class="admonition">
+ <div class="admonition-label">
+ NOTE
+ </div>
+ <div class="admonition-content">
+ この記事は、2022-11-17 に<a href="https://www.dgcircus.com/">デジタルサーカス株式会社</a> の社内 Qiita Team に公開された記事をベースに、加筆修正して一般公開したものです。
+ </div>
+ </div>
+
+ <p>
+ ハマったのでメモ。
+ </p>
+
+ <section id="section--background">
+ <h2><a href="#section--background">前提</a></h2>
+ <section id="section--background--gitlab-ci-cd">
+ <h3><a href="#section--background--gitlab-ci-cd">GitLab CI/CD について</a></h3>
+ <p>
+ GitLab CI/CD では、Docker executor を用いて任意の Docker image 上でスクリプトを走らせることができる。
+ </p>
+
+ <p>
+ 例:
+ </p>
+
+ <pre class="highlight" filename=".gitlab-ci.yml" language="yaml"><code class="highlight"><span class="hljs-attr">hello-world:</span>
+ <span class="hljs-attr">stage:</span> <span class="hljs-string">test</span>
+ <span class="hljs-attr">image:</span> <span class="hljs-string">alpine:latest</span>
+ <span class="hljs-attr">script:</span>
+ <span class="hljs-bullet">-</span> <span class="hljs-string">&#x27;echo &quot;Hello, World!&quot;&#x27;</span>
+ <span class="hljs-attr">rules:</span>
+ <span class="hljs-bullet">-</span> <span class="hljs-attr">if:</span> <span class="hljs-string">&#x27;$CI_MERGE_REQUEST_IID&#x27;</span>
+ <span class="hljs-attr">when:</span> <span class="hljs-string">always</span></code></pre>
+
+ <p>
+ ここで、<code>script</code> に指定したコマンドが失敗する (exit status が 0 以外になる) と、即座に実行が停止され、ジョブは失敗する。
+ </p>
+
+ <p>
+ では、次のようなケースだとどうなるか。
+ </p>
+
+ <pre class="highlight" filename=".gitlab-ci.yml" language="yaml"><code class="highlight"><span class="hljs-attr">hello-world:</span>
+ <span class="hljs-attr">stage:</span> <span class="hljs-string">test</span>
+ <span class="hljs-attr">image:</span> <span class="hljs-string">alpine:latest</span>
+ <span class="hljs-attr">script:</span>
+ <span class="hljs-bullet">-</span> <span class="hljs-string">&#x27;exit 1 | exit 0&#x27;</span>
+ <span class="hljs-attr">rules:</span>
+ <span class="hljs-bullet">-</span> <span class="hljs-attr">if:</span> <span class="hljs-string">&#x27;$CI_MERGE_REQUEST_IID&#x27;</span>
+ <span class="hljs-attr">when:</span> <span class="hljs-string">always</span></code></pre>
+
+ <p>
+ 失敗するコマンドをパイプに接続した。通常 Bash では、パイプの最後のコマンドの exit code が全体の exit code になる。
+ </p>
+ </section>
+
+ <section id="section--background--pipefail-option">
+ <h3><a href="#section--background--pipefail-option"><code>pipefail</code> オプションについて</a></h3>
+ <p>
+ 前述したようなケースにおいて、途中で失敗したときに全体を失敗させるには、<code>pipefail</code> オプションを有効にする。
+ </p>
+
+ <pre class="highlight" language="bash"><code class="highlight"><span class="hljs-comment"># On にする</span>
+<span class="hljs-built_in">set</span> -o pipefail
+<span class="hljs-comment"># Off にする</span>
+<span class="hljs-built_in">set</span> +o pipefail</code></pre>
+
+ <p>
+ こうすると、パイプ全体が失敗するようになる。 この設定は、デフォルトだと off になっている。
+ </p>
+ </section>
+ </section>
+
+ <section id="section--problem">
+ <h2><a href="#section--problem">発生した問題</a></h2>
+ <p>
+ 次のような GitLab CI/CD ジョブが失敗してしまった。
+ </p>
+
+ <pre class="highlight" filename=".gitlab-ci.yml" language="yaml"><code class="highlight"><span class="hljs-attr">hoge:</span>
+ <span class="hljs-attr">stage:</span> <span class="hljs-string">test</span>
+ <span class="hljs-attr">image:</span> <span class="hljs-string">alpine:latest</span>
+ <span class="hljs-attr">script:</span>
+ <span class="hljs-bullet">-</span> <span class="hljs-string">&#x27;cat hoge.txt | grep piyo | sed -e &quot;s/foo/bar/g&quot;&#x27;</span>
+ <span class="hljs-attr">rules:</span>
+ <span class="hljs-bullet">-</span> <span class="hljs-attr">if:</span> <span class="hljs-string">&#x27;$CI_MERGE_REQUEST_IID&#x27;</span>
+ <span class="hljs-attr">when:</span> <span class="hljs-string">always</span></code></pre>
+
+ <p>
+ <code>grep</code> コマンドは、パターンにマッチする行が一行もなかったとき、exit code 1 を返す。よって、<code>pipefail</code> が on になっていると、このジョブは失敗する。 現在の <code>pipefail</code> がどうなっているか確かめるため <code>set +o</code> で全オプションを出力させたところ、<code>pipefail</code> が on になっていた。
+ </p>
+
+ <p>
+ しかし、先述したように Bash における <code>pipefail</code> のデフォルト値は off のはずだ。 実際に、ローカルで <code>alpine:latest</code> を動かしてみたところ、
+ </p>
+
+ <pre class="highlight"><code>$ docker run --rm alpine:latest sh -c &quot;set +o&quot;
+set +o errexit
+set +o noglob
+set +o ignoreeof
+set +o monitor
+set +o noexec
+set +o xtrace
+set +o verbose
+set +o noclobber
+set +o allexport
+set +o notify
+set +o nounset
+set +o vi
+set +o pipefail</code></pre>
+
+ <p>
+ 確かに <code>pipefail</code> は無効になっている。
+ </p>
+
+ <p>
+ なぜスクリプト内で <code>set -o pipefail</code> しているわけでもないのに <code>pipefail</code> が on になっているのか。
+ </p>
+ </section>
+
+ <section id="section--where-pipefail-is-enabled">
+ <h2><a href="#section--where-pipefail-is-enabled">どこで <code>pipefail</code> が on になるか</a></h2>
+ <p>
+ <code>.gitlab-ci.yml</code> で明示的には書いていないので、GitLab Runner (GitLab CI/CD のスクリプトを実行するプログラム) が勝手に追加しているに違いない。 そう仮説を立てて <a href="https://gitlab.com/gitlab-org/gitlab-runner">GitLab Runner のリポジトリ</a> を調査したところ、<a href="https://gitlab.com/gitlab-org/gitlab-runner/-/blob/c75da0796a0e3048991dccfdf2784e3d931beda4/shells/bash.go#L276">ソースコード中の以下の箇所</a> で <code>set -o pipefail</code> していることが判明した (コメントは筆者による)。
+ </p>
+
+ <pre class="highlight" language="go"><code class="highlight"><span class="hljs-comment">// pipefail オプションが存在しない環境にも対応するため、</span>
+<span class="hljs-comment">// 先に set -o でオプション一覧を表示させたあと、set -o pipefail している</span>
+buf.WriteString(<span class="hljs-string">&quot;if set -o | grep pipefail &gt; /dev/null; then set -o pipefail; fi; set -o errexit\n&quot;</span>)</code></pre>
+ </section>
+
+ <section id="section--how-to-solve">
+ <h2><a href="#section--how-to-solve">どのように解決するか</a></h2>
+ <p>
+ 通常の Bash スクリプトを書く場合と同様に、<code>pipefail</code> が on になっていては困る場所だけ off にしてやればよい。
+ </p>
+
+ <pre class="highlight" diff="true" filename=".gitlab-ci.yml" language="yaml"><code class="highlight"> <span class="hljs-attr">hoge:</span>
+ <span class="hljs-attr">stage:</span> <span class="hljs-string">test</span>
+ <span class="hljs-attr">image:</span> <span class="hljs-string">alpine:latest</span>
+ <span class="hljs-attr">script:</span>
+<span class="hljs-string">+</span> <span class="hljs-bullet">-</span> <span class="hljs-string">&#x27;set +o pipefail&#x27;</span>
+ <span class="hljs-bullet">-</span> <span class="hljs-string">&#x27;cat hoge.txt | grep piyo | sed -e &quot;s/foo/bar/g&quot;&#x27;</span>
+<span class="hljs-string">+</span> <span class="hljs-bullet">-</span> <span class="hljs-string">&#x27;set -o pipefail&#x27;</span> <span class="hljs-comment"># この例の場合、ここで終わりなので戻さなくてもよい</span>
+ <span class="hljs-attr">rules:</span>
+ <span class="hljs-bullet">-</span> <span class="hljs-attr">if:</span> <span class="hljs-string">&#x27;$CI_MERGE_REQUEST_IID&#x27;</span>
+ <span class="hljs-attr">when:</span> <span class="hljs-string">always</span></code></pre>
+ </section>
+
+ <section id="section--remarks">
+ <h2><a href="#section--remarks">備考</a></h2>
+ <p>
+ なお、上述した実装ファイルは <code>shells/bash.go</code> だが、<code>alpine:latest</code> の例でもそうであったように、シェルが <code>sh</code> である場合にも適用される。
+ </p>
+ </section>
+ </div>
+ </article>
+ </main>
+ <footer class="footer">
+ &copy; 2021 nsfisis
+ </footer>
+ </body>
+</html>
diff --git a/vhosts/blog/public/posts/atom.xml b/vhosts/blog/public/posts/atom.xml
index 9d0a6973..fbeae0a4 100644
--- a/vhosts/blog/public/posts/atom.xml
+++ b/vhosts/blog/public/posts/atom.xml
@@ -7,7 +7,15 @@
<author>
<name>nsfisis</name>
</author>
- <updated>2024-04-14T00:00:00+09:00</updated>
+ <updated>2024-04-21T00:00:00+09:00</updated>
+ <entry>
+ <id>urn:uuid:a4c326a6-5ffe-450c-abf2-45833c5efb6a</id>
+ <link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/"></link>
+ <title>【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている</title>
+ <summary>GitLab CI/CD で bash/sh スクリプトを動かすと、pipefail オプションが有効になった状態で実行される。</summary>
+ <published>2024-04-21T00:00:00+09:00</published>
+ <updated>2024-04-21T00:00:00+09:00</updated>
+ </entry>
<entry>
<id>urn:uuid:be9c896d-7efa-42dd-a50a-dda5fd3a7f5c</id>
<link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-14/phpcon-odawara-2024-report/"></link>
diff --git a/vhosts/blog/public/posts/index.html b/vhosts/blog/public/posts/index.html
index 4fa6256b..fc4af85e 100644
--- a/vhosts/blog/public/posts/index.html
+++ b/vhosts/blog/public/posts/index.html
@@ -43,6 +43,21 @@
<h1>投稿一覧</h1>
</header>
<article class="post-entry">
+ <a href="/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/">
+ <header class="entry-header">
+ <h2>【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている</h2>
+ </header>
+ <section class="entry-content">
+ <p>
+ GitLab CI/CD で bash/sh スクリプトを動かすと、pipefail オプションが有効になった状態で実行される。
+ </p>
+ </section>
+ <footer class="entry-footer">
+ <time datetime="2024-04-21">2024-04-21</time> 投稿
+ </footer>
+ </a>
+ </article>
+ <article class="post-entry">
<a href="/posts/2024-04-14/phpcon-odawara-2024-report/">
<header class="entry-header">
<h2>PHP カンファレンス小田原 2024 参加レポ</h2>
diff --git a/vhosts/blog/public/tags/ci-cd/atom.xml b/vhosts/blog/public/tags/ci-cd/atom.xml
new file mode 100644
index 00000000..393bec10
--- /dev/null
+++ b/vhosts/blog/public/tags/ci-cd/atom.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <id>tag:blog.nsfisis.dev,2021:tag-ci-cd</id>
+ <title>タグ「CI/CD」一覧|REPL: Rest-Eat-Program Loop</title>
+ <link rel="alternate" href="https://blog.nsfisis.dev/tags/ci-cd/"></link>
+ <link rel="self" href="https://blog.nsfisis.dev/tags/ci-cd/atom.xml"></link>
+ <author>
+ <name>nsfisis</name>
+ </author>
+ <updated>2024-04-21T00:00:00+09:00</updated>
+ <entry>
+ <id>urn:uuid:a4c326a6-5ffe-450c-abf2-45833c5efb6a</id>
+ <link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/"></link>
+ <title>【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている</title>
+ <summary>GitLab CI/CD で bash/sh スクリプトを動かすと、pipefail オプションが有効になった状態で実行される。</summary>
+ <published>2024-04-21T00:00:00+09:00</published>
+ <updated>2024-04-21T00:00:00+09:00</updated>
+ </entry>
+</feed>
diff --git a/vhosts/blog/public/tags/ci-cd/index.html b/vhosts/blog/public/tags/ci-cd/index.html
new file mode 100644
index 00000000..dd028e28
--- /dev/null
+++ b/vhosts/blog/public/tags/ci-cd/index.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html lang="ja-JP">
+ <head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="author" content="nsfisis">
+ <meta name="copyright" content="&copy; 2024 nsfisis">
+ <meta name="description" content="タグ「CI/CD」のついた記事またはスライドの一覧">
+ <meta name="keywords" content="CI/CD">
+ <meta property="og:type" content="article">
+ <meta property="og:title" content="タグ「CI/CD」一覧|REPL: Rest-Eat-Program Loop">
+ <meta property="og:description" content="タグ「CI/CD」のついた記事またはスライドの一覧">
+ <meta property="og:site_name" content="REPL: Rest-Eat-Program Loop">
+ <meta property="og:locale" content="ja_JP">
+ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/ci-cd/atom.xml">
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg">
+ <title>タグ「CI/CD」一覧|REPL: Rest-Eat-Program Loop</title>
+ <link rel="stylesheet" href="/style.css?h=0656606dcfb3f6fa094a976e05df9007">
+ </head>
+ <body class="list">
+ <header class="header">
+ <div class="site-logo">
+ <a href="/">REPL: Rest-Eat-Program Loop</a>
+ </div>
+ <nav class="nav">
+ <ul>
+ <li>
+ <a href="/about/">About</a>
+ </li>
+ <li>
+ <a href="/posts/">Posts</a>
+ </li>
+ <li>
+ <a href="/slides/">Slides</a>
+ </li>
+ <li>
+ <a href="/tags/">Tags</a>
+ </li>
+ </ul>
+ </nav>
+ </header>
+ <main class="main">
+ <header class="page-header">
+ <h1>タグ「CI/CD」一覧</h1>
+ </header>
+ <article class="post-entry">
+ <a href="/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/">
+ <header class="entry-header">
+ <h2>【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている</h2>
+ </header>
+ <section class="entry-content">
+ <p>
+ GitLab CI/CD で bash/sh スクリプトを動かすと、pipefail オプションが有効になった状態で実行される。
+ </p>
+ </section>
+ <footer class="entry-footer">
+ <time datetime="2024-04-21">2024-04-21</time> 投稿
+ </footer>
+ </a>
+ </article>
+ </main>
+ <footer class="footer">
+ &copy; 2021 nsfisis
+ </footer>
+ </body>
+</html>
diff --git a/vhosts/blog/public/tags/gitlab/atom.xml b/vhosts/blog/public/tags/gitlab/atom.xml
new file mode 100644
index 00000000..20e92403
--- /dev/null
+++ b/vhosts/blog/public/tags/gitlab/atom.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <id>tag:blog.nsfisis.dev,2021:tag-gitlab</id>
+ <title>タグ「GitLab」一覧|REPL: Rest-Eat-Program Loop</title>
+ <link rel="alternate" href="https://blog.nsfisis.dev/tags/gitlab/"></link>
+ <link rel="self" href="https://blog.nsfisis.dev/tags/gitlab/atom.xml"></link>
+ <author>
+ <name>nsfisis</name>
+ </author>
+ <updated>2024-04-21T00:00:00+09:00</updated>
+ <entry>
+ <id>urn:uuid:a4c326a6-5ffe-450c-abf2-45833c5efb6a</id>
+ <link rel="alternate" href="https://blog.nsfisis.dev/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/"></link>
+ <title>【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている</title>
+ <summary>GitLab CI/CD で bash/sh スクリプトを動かすと、pipefail オプションが有効になった状態で実行される。</summary>
+ <published>2024-04-21T00:00:00+09:00</published>
+ <updated>2024-04-21T00:00:00+09:00</updated>
+ </entry>
+</feed>
diff --git a/vhosts/blog/public/tags/gitlab/index.html b/vhosts/blog/public/tags/gitlab/index.html
new file mode 100644
index 00000000..b5e091fb
--- /dev/null
+++ b/vhosts/blog/public/tags/gitlab/index.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html lang="ja-JP">
+ <head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="author" content="nsfisis">
+ <meta name="copyright" content="&copy; 2024 nsfisis">
+ <meta name="description" content="タグ「GitLab」のついた記事またはスライドの一覧">
+ <meta name="keywords" content="GitLab">
+ <meta property="og:type" content="article">
+ <meta property="og:title" content="タグ「GitLab」一覧|REPL: Rest-Eat-Program Loop">
+ <meta property="og:description" content="タグ「GitLab」のついた記事またはスライドの一覧">
+ <meta property="og:site_name" content="REPL: Rest-Eat-Program Loop">
+ <meta property="og:locale" content="ja_JP">
+ <link rel="alternate" type="application/atom+xml" href="https://blog.nsfisis.dev/tags/gitlab/atom.xml">
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg">
+ <title>タグ「GitLab」一覧|REPL: Rest-Eat-Program Loop</title>
+ <link rel="stylesheet" href="/style.css?h=0656606dcfb3f6fa094a976e05df9007">
+ </head>
+ <body class="list">
+ <header class="header">
+ <div class="site-logo">
+ <a href="/">REPL: Rest-Eat-Program Loop</a>
+ </div>
+ <nav class="nav">
+ <ul>
+ <li>
+ <a href="/about/">About</a>
+ </li>
+ <li>
+ <a href="/posts/">Posts</a>
+ </li>
+ <li>
+ <a href="/slides/">Slides</a>
+ </li>
+ <li>
+ <a href="/tags/">Tags</a>
+ </li>
+ </ul>
+ </nav>
+ </header>
+ <main class="main">
+ <header class="page-header">
+ <h1>タグ「GitLab」一覧</h1>
+ </header>
+ <article class="post-entry">
+ <a href="/posts/2024-04-21/pipefail-option-in-gitlab-ci-cd/">
+ <header class="entry-header">
+ <h2>【GitLab】 GitLab CI/CD 上での bash/sh は pipefail が有効になっている</h2>
+ </header>
+ <section class="entry-content">
+ <p>
+ GitLab CI/CD で bash/sh スクリプトを動かすと、pipefail オプションが有効になった状態で実行される。
+ </p>
+ </section>
+ <footer class="entry-footer">
+ <time datetime="2024-04-21">2024-04-21</time> 投稿
+ </footer>
+ </a>
+ </article>
+ </main>
+ <footer class="footer">
+ &copy; 2021 nsfisis
+ </footer>
+ </body>
+</html>
diff --git a/vhosts/blog/public/tags/index.html b/vhosts/blog/public/tags/index.html
index 7e0364ca..5f664e49 100644
--- a/vhosts/blog/public/tags/index.html
+++ b/vhosts/blog/public/tags/index.html
@@ -42,6 +42,16 @@
<h1>タグ一覧</h1>
</header>
<article class="post-entry">
+ <a href="/tags/ci-cd/">
+ <header class="entry-header">
+ <h2>CI/CD</h2>
+ </header>
+ <footer class="entry-footer">
+ 1件の記事
+ </footer>
+ </a>
+ </article>
+ <article class="post-entry">
<a href="/tags/conference/">
<header class="entry-header">
<h2>カンファレンス</h2>
@@ -72,6 +82,16 @@
</a>
</article>
<article class="post-entry">
+ <a href="/tags/gitlab/">
+ <header class="entry-header">
+ <h2>GitLab</h2>
+ </header>
+ <footer class="entry-footer">
+ 1件の記事
+ </footer>
+ </a>
+ </article>
+ <article class="post-entry">
<a href="/tags/isucon/">
<header class="entry-header">
<h2>ISUCON</h2>