メインコンテンツへスキップ
  1. Blogs/

Gitlab CI/CDでrepositoryにpushする方法

·1257 文字·
Memo Gitlab
hiroki
著者
hiroki
クラウドを作るお仕事をしてます。
目次

はじめに
#

本記事はmemoレベルでしか調査していないため、誤りがある可能性があります。ご注意ください。

Gitlab CI/CDのPipeline実行中に生成されたfileをcommit & pushしたいことが稀にありますが、わりとハマりごとあったのでメモとして残します。

雑に取得したDBのbackupや、情報取得したcsvを保存したい時に使っています。 S3等の外部ストレージに飛ばすことが理想ですが、料金や読み込みが大変な時もあるので

1. .gitlab-ci.ymlの用意
#

基本的には、以下の流れ + .gitlab-ci.ymlでPipeline内部でpushができます。

  1. read/write repositoryの権限を持ったTOKENを作成
  2. ~/.netrc等でlogin情報を記載
  3. branchがdetached HEADになり、変更がcommitできないので、これの対処
  4. 変更をpush
push:
  image: bitnami/git
  before_script:
    - echo -e  "machine gitlab.com\nlogin gitlab-ci-token\npassword $ACCESS_TOKEN" > ~/.netrc # loginはnetrcを利用
    - git config --global user.name "gitlab.runner"
    - git config --global user.email "dummy"
  script:
    - git clone $CI_PROJECT_URL # Pipelineでは(HEAD detached at b7931aa)のようなデタッチドヘッドになるので、自分でcloneする。
    - cd $CI_PROJECT_NAME 
    - touch "test-$(date '+%Y-%m-%d %H:%M:%S').txt"
    - git add .
    - git commit -m "[ci skip] ADD FILE $(date '+%Y-%m-%d %H:%M:%S')" # [ci skip]を入れないと、無限ループになる可能性があるので注意する。
    - git push origin HEAD

2. detached HEAD
#

pipeline内では自動でprojectのcodeがcloneされていますが、branchを確認するとdetached HEADになり変更してもcommitやpushができない状態です。

$ git branch
* (HEAD detached at 677de8a)

解決方法は以下に記載されているようにいくつかありますが、今回はmainに直接pushしたいので別途projectをcloneすることで回避しました。 https://stackoverflow.com/questions/69267025/detached-head-in-gitlab-ci-pipeline-how-to-push-correctly

3. TOKENの権限
#

Gitlab CI/CDではPipline内のみで使える$CI_JOB_TOKENは、cloneはできますがpushはできない権限になっています。

意外とCI/CD内部でpushしたい要望があるらしく、$CI_JOB_TOKENにAllow Git push requests to the repositoryのflagを付けれる機能が検討 + 検証用にリリースされています。

残念ながら本番リリースはまだらしい?ので、今回は新規でTOKENを払い出します。

$CI_JOB_TOKENが使えないので、projectに対してTOKENを発行する必要があります。

  • projectに紐づくTOKENにします。
  • 必要な権限は、read/write_repositoryです。

Project/Group Access Tokenは、free版では使用できないようです。その場合は個人Token等を利用します。 https://forum.gitlab.com/t/gitlab-impossible-to-enable-group-access-token/81540/7

またgitlabでは最長365日のTOKENしか作れなくなっているので、有効期限切れに注意します。 https://about.gitlab.com/blog/2023/10/25/access-token-lifetime-limits/

alt text
その後、Variablesに登録しておきましょう。
alt text

4. 実際に実行してみる
#

これら設定をすると、以下のようにPipeline内部でpushをすることが可能になります。

alt text

おわりに
#

今回のコードやPipelineの実行結果は以下に載せています。参考にどうぞ。

blog / gitlab-ci-push-in-pipeline

0
0

Related

Gitlab CI/CDでseleniumを利用する方法
·2155 文字
Blog Gitlab Python
Pythonのlinter(Ruff)のTIPS
·758 文字
Memo Python
ElasticSearchを使ったlog収集2 -Elastic Agentの追加-
·3798 文字
Blog ElasticSearch