GitLab Pagesで静的コンテンツを公開する

2019年6月21日

GitLabについては/tag/gitlabを参照されたい

GitHubにおいてMavenリポジトリを公開する方法をGitHubにMavenリポジトリを作り、GitHub Pagesで公開するに書いたのだが、GitLabにもPagesというものがあり、同じようなことができる。つまり、

「https://ysugimura.gitlab.io/foobar/」などというURLで静的コンテンツを公開できる。

しかし、masterにpushすればそのまま公開されるGitHubとは少々異なり、GitLabではひと手間が必要だ。

なお、GitLabではGitHubとは異なり、masterの内容にGitLab側で何らかの操作を加えた後に公開することができるようだが、ここではあくまでも、最も簡単な「静的コンテンツをそのまま公開する」ことに注力する。

  • foobarプロジェクトを作成する
  • foobarのトップに「.gitlab-ci.yml」というファイルを作成する。
  • あとは好きなコンテンツを置く。

ということになる。

foobarプロジェクトを作成する

これは問題無いと思うので省略する。なおプロジェクトはPrivateのままでも構わない。リポジトリの内容がそのまま公開されるわけではないからだ。

ファイルを作成する

「.gitlab-ci.yml」および「index.html」というファイルを作成する。

.gitlab-ci.ymlの内容は以下になる。詳しくはわからないが、単純に置いたものをそのまま公開するというものらしい。publicという名前はGitLab内部で使われるもののようで、こちらには関係無い。

pages:
  stage: deploy
  script:
  - mkdir .public
  - cp -r * .public
  - mv .public public
  artifacts:
    paths:
    - public
  only:
  - master

index.htmlは、もちろん何でも良いが例えば以下。

<html>
<body>
this is foobar
</body>
</html>

これを例えばEclipse上で作成した場合のイメージは以下だ(注意:ドットから始まるリソースファイルも表示されるようにしている)。

コミットの後にプッシュする。

静的コンテンツのコピーの実行

以下のようにコピー実行中の表示がされるのだが、これが意外に時間がかかる。単にコピーするだけなのに。

成功すると「成功」の表示になる。

アクセスしてみる

「https://ysugimura.gitlab.io/foobar/」にアクセスすると、意図通りの表示になる。

コンテンツを変更・追加した場合

コンテンツを変更・追加した場合には単にプッシュしてやればよい。このとき、特に.gitlab-ci.ymlを変更する必要は無い。自動で先のCI/CD>ジョブに(最初は)「実行待ち」と表示され、次に「実行中」、「成功」の表示になる。

反映が非常に遅い場合もある

上記で「成功」の表示が出た後でも、反映されるのが非常に遅い場合もあるようだ。何らかのエラーがあるのか、正常で遅いのかがわからないのでイライラする。

以下では、数時間、24時間経過しても404エラーになると言う人が続出している。主に2017年の議論だ。

2019/5/21に試してみたところ、10分程度で表示された。改良はされているのかもしれないが、いずれにしても「すぐに」結果を確認することはできないようだ。

「遅い」理由

これほど遅い理由としては、GitLab PagesがCI/CDの一部として実現されているかららしい。CI/CDというのは要するにこういうことだ。

  • 大勢の開発者がおり、一つのソフトウェアを開発している場合に、
  • 誰かがリポジトリに書き込んだら、最終的な成果を作成すべくビルドが開始される。
  • それなりに時間がかかる。
  • そのビルド結果が開発者に通知される。

という、そもそもはソフトウェア構築向けのものであって、今回のような「単純に静的コンテンツを書き込んで、それを公開するだけ!」というものではないらしい。

本来はそのような複雑なことをするためのものであるがゆえに、GitLabの中での「処理の順番待ち」が発生してしまうのだろう。

ちなみに、そういった「ソフトウェア構築」の場合には、GitLab Pagesなどで公開されてはならないのだが、もちろんデフォルトで公開されるわけではなく、.gitlab-ci.ymlの中に「公開しろ」と指示してあるから公開されたわけだ。

。。。と解釈したのだが、間違いがあるかもしれない。あしからず。

Gitlab PagesをMavenリポジトリとして使う場合

ちなみにだが、これをMavenリポジトリとして使うのも非常に簡単だ。

gradleの場合には、以下を設定して、publishを行い、foobarプロジェクトに対してアーティファクトを出力してやり、その後は単純にfoobarをコミットしてプッシュすればよい。

apply plugin: 'maven-publish'

....

publishing {
  publications {
    target(MavenPublication) {
      groupId  'groupId'
      artifactId 'artifactId'
      version 'version'    
      from components.java   
      artifact sourceJar
    }
  }  
  repositories {
    maven {
      // foobarプロジェクトの場所
      url 'file:///C:/devel/workspace/foobar'         
    }
  }
}

Gitlab Pagesをプライベートにしたい

つまり、Gitlab Pagesを公開してしまうのではなく、限られたメンバーだけが見れるようにすることなのだが、オープンソースのGitlabにはこの機能があるようだがgitlab.comではできないようだ(2019/6時点)。

https://docs.gitlab.com/ee/user/project/pages/introduction.htmlのGitlab Access Controlの項に説明がある。

Note: GitLab Pages access control is not activated on GitLab.com. You can check its progress on the infrastructure issue tracker.