electronアプリをパイプラインでgitlabのパッケージに登録

# はじめに
この記事は2023年度の振り返りです。

前回の記事で、パイプライン上でminIOにデプロイするものを作成しました。
ただ、もしminIOが消えてしまったときのことを考慮して、gitlabそのものにもバックアップを取っておきたいというのが今回の趣旨になります。

# CD(Code Deploy)
会社ではgitlabを利用してるので、gitlab-runnerを利用した内容になります
```sh:variables(一部抜粋)
variables:
  WIN_BINARY: "${APPNAME}-${VERSION}-setup.exe"
```

```sh:build_job(一部抜粋)
build_job:
  stage: build
  image: electronuserland/builder:18-wine
  rules:
    - if: $CI_COMMIT_TAG
  before_script:
    - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
    - unzip awscliv2.zip
    - ./aws/install -i /usr/local/aws-cli -b /usr/local/bin
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws --version
    - cat /etc/*-release
    - npm install --force
    - rm -rf dist
  script:
    - sed "s/0.0.0/${CI_COMMIT_TAG}/g" package.json > _package.json && mv _package.json package.json
    - export VERSION=$(node -e "console.log(require('./package.json').version)")
    - echo "VERSION=$VERSION" >> variables.env
    - export APPNAME=$(node -e "console.log(require('./package.json').name)")
    - echo "APPNAME=$APPNAME" >> variables.env
    - cat variables.env
    - npm run build:win:publish
  artifacts:
    reports:
      dotenv: variables.env
    name: $CI_COMMIT_REF_SLUG
    paths:
      - $CI_PROJECT_DIR/dist/*.*
    expire_in: 1 month
    when: on_success
```

```sh:upload_job(一部抜粋)
upload_job:
  stage: upload
  needs:
    - job: build_job
      artifacts: true
  rules:
    - if: $CI_COMMIT_TAG
  before_script:
    - apk update
    - apk add curl
  script:
    - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file "./dist/${WIN_BINARY}" "${PACKAGE_REGISTRY_URL}/${WIN_BINARY}"'
    - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file "./dist/latest.yml" "${PACKAGE_REGISTRY_URL_YML}/latest.yml"'
    - echo "${PACKAGE_REGISTRY_URL_YML}/latest.yml"
```

```sh:release_job(一部抜粋)
release_job:
  image: registry.gitlab.com/gitlab-org/release-cli
  needs:
    - job: build_job
      artifacts: true
    - job: upload_job
      artifacts: true
  stage: release
  rules:
    - if: $CI_COMMIT_TAG
  script:
    - echo "Release $VERSION"
    - |
      release-cli create --name "Release $VERSION" --tag-name $VERSION \
      --description 'Created using the release-cli. $CI_COMMIT_TITLE' --ref $CI_COMMIT_SHA \
      --assets-link "{\"name\":\"${APPNAME}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${WIN_BINARY}\"}" \
      --assets-link "{\"name\":\"${APPNAME} Latest\",\"url\":\"${PACKAGE_REGISTRY_URL_YML}/latest.yml\"}"
```

# ざっくり説明
- build_job
    - ビルド→S3へアップロード(前記事)
    - 生成されたexeファイルをartifactsに登録
- upload_job
    - build_jobでartifactsに保存されたものをパッケージとして登録
    - ![l_6814799_90_6cac23c68f6de62bfc06e2997303db63.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/12189fb0-336f-de25-70fe-f57570f6f4bf.png)


- release_job
    - upload_jobで作られたパッケージを元にリリースノートを生成
    - リリースノートにパッケージを紐づけする
    - ![l_6814799_91_8a0a65c8fb912c2f957f00b45d8dc51a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/f589e266-8be8-b547-3bea-e6fa5f19b000.png)


# さいごに
フロントのCDは以上となります。
ここまで色々試行錯誤しましたが、無事に利用できるレベルまでできたので良かったです。
CI側がまだ薄いので、今後の課題として頑張っていきたいと思います。