{"id":2425,"date":"2018-04-12T12:56:40","date_gmt":"2018-04-12T11:56:40","guid":{"rendered":"https:\/\/gergely.imreh.net\/blog\/?p=2425"},"modified":"2018-04-12T13:03:43","modified_gmt":"2018-04-12T12:03:43","slug":"circleci-aur","status":"publish","type":"post","link":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/","title":{"rendered":"Continuous integration testing of Arch User Repository packages"},"content":{"rendered":"<p>I maintain <a href=\"https:\/\/aur.archlinux.org\/packages\/?K=imrehg&amp;SeB=m\">a couple of ArchLinux user-contributed packages<\/a> on the <a href=\"https:\/\/wiki.archlinux.org\/index.php\/Arch_User_Repository\">Arch User Repository (AUR)<\/a>, and over time I&#8217;ve built out a bit of infrastructure around that to make that maintenance easier (and hopefully the results better). The core of it is automated building of packages in Continuous Integration, which catches a number of issues which otherwise would be more difficult.<\/p>\n<p>This write-up will go through the entire packaging process to make it easily reproducible.<!--more--><\/p>\n<h2>Contributing a package<\/h2>\n<p>AUR is a great resource for Arch Linux users, and\u00a0 it is pretty easy to <a href=\"https:\/\/wiki.archlinux.org\/index.php\/Arch_User_Repository#Sharing_and_maintaining_packages\">create and contribute new packages<\/a>.<\/p>\n<p>Packages are created by cloning an empty <a href=\"https:\/\/git-scm.com\/\">git<\/a> repository with the desired package name. I do it in a slightly different setup compared to the wiki that&#8217;s linked just above, as:<\/p>\n<pre class=\"lang:sh decode:true\" title=\"Clone an empty repo to create a new AUR package\">git clone ssh+git:\/\/aur@aur.archlinux.org\/&lt;PACKAGENAME&gt;.git<\/pre>\n<p>Add your PKGBUILD and any other required files, run mksrcinfo, and git commit, and push&#8230; If everything went well, your package is now visible in the <a href=\"https:\/\/aur.archlinux.org\/packages\/?O=0&amp;K=\">AUR search<\/a>.<\/p>\n<p>Next time that repository is cloned, it will contain the code, and changes (i.e. package updates) can be pushed just as well too.<\/p>\n<h2>Keeping track of packages<\/h2>\n<p>As more packages are contributed, it is increasingly hard to keep track of them as separate repositories. One way to improve on this, is creating a &#8220;meta&#8221; repository (or repo), where all the contributed packages are linked as <a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Git-Tools-Submodules\">git submodules<\/a>.<\/p>\n<p>This organization is achieved by creating your meta-repo, and add your package as a submodule:<\/p>\n<pre class=\"lang:sh decode:true \" title=\"Adding AUR package as a submodule to a git repo\">git submodule add ssh+git:\/\/aur@aur.archlinux.org\/&lt;PACKAGENAME&gt;.git<\/pre>\n<p>Then you&#8217;d make package updates in that submodule, and the meta repo would contain all your packages as a collection.<\/p>\n<p>My packages&#8217; meta repo that show this arrangement is on Github at <a href=\"https:\/\/github.com\/imrehg\/aur\">imrehg\/aur<\/a>.<\/p>\n<h2>Continuous integration testing<\/h2>\n<p>What we can do with this setup now, is to automatically check out, build, analyze, and test (including installation) of the all the packages.\u00a0 I&#8217;ve set that up as\u00a0<a href=\"https:\/\/circleci.com\/\">CircleCI<\/a> build jobs for each of the packages: each of them built and installed in a clean Arch Linux environment.<\/p>\n<p>The clean Arch Linux environment is provided by a <a href=\"https:\/\/www.docker.com\/\">Docker<\/a> image, that I&#8217;ve created for this purpose, <a href=\"https:\/\/github.com\/imrehg\/archlinux-makepkg-docker\">archlinux-makepkg-docker<\/a>. That image builds on an upstream Arch Linux image, and sets a few things up:<\/p>\n<ul>\n<li>updates the image with the latest base build system<\/li>\n<li>creates a &#8220;builder&#8221; user that can run sudo<\/li>\n<li>installs two packages from scratch that are sometimes needed for working with AUR packages: &#8220;package-query&#8221; and &#8220;yaourt&#8221;<\/li>\n<li>installs &#8220;<a href=\"https:\/\/wiki.archlinux.org\/index.php\/Namcap\">namcap<\/a>&#8221; to analyze the package<\/li>\n<\/ul>\n<p>Each AUR package is set up with its own CircleCI build job as part of a <a href=\"https:\/\/circleci.com\/docs\/2.0\/workflows\/\">workflow<\/a>.<\/p>\n<p>Since most of the work for each package is pretty much the same, we can simplify things with templates, such as this:<\/p>\n<pre class=\"lang:yaml decode:true\" title=\"A CircleCI config to build my-package\"># Common sections\r\ndefaults: &amp;defaults\r\n  working_directory: ~\/aur\r\n  docker:\r\n    - image: imrehg\/archlinux-makepkg\r\n\r\nupdatepackage: &amp;updatepackage\r\n  name: Update packages\r\n  command: sudo pacman -Syu --noconfirm\r\n\r\ngitupdate: &amp;gitupdate\r\n  name: Git repo updates\r\n  command: |\r\n    sed -i \"s#ssh+git:\/\/aur@aur.archlinux.org#https:\/\/aur.archlinux.org#\" .gitmodules\r\n    git submodule update --init\r\npkgbuildtest: &amp;pkgbuildtest\r\n  name: Testing PKGBUILD\r\n  command: |\r\n    cd ~\/aur\/${CIRCLE_JOB}\r\n    namcap PKGBUILD\r\nbuildtest: &amp;buildtest\r\n  name: Building package\r\n  command: |\r\n    cd ~\/aur\/${CIRCLE_JOB}\r\n    makepkg -sci --noconfirm\r\n\r\n# Main\r\nversion: 2\r\njobs:\r\n  my-package:\r\n    &lt;&lt;: *defaults\r\n    steps:\r\n      - run:\r\n          &lt;&lt;: *updatepackage\r\n      - checkout\r\n      - run:\r\n          &lt;&lt;: *gitupdate\r\n      - run:\r\n          &lt;&lt;: *pkgbuildtest\r\n      - run:\r\n          &lt;&lt;: *buildtest\r\n\r\nworkflows:\r\n  version: 2\r\n  build:\r\n    jobs:\r\n      - my-package\r\n<\/pre>\n<p>The sample CircleCI &#8220;config.yml&#8221; here is set up to build an AUR package called &#8220;my-package&#8221;:<\/p>\n<ul>\n<li>it pulls the Arch Linux Docker image mentioned earlier<\/li>\n<li>updates any outdated OS package<\/li>\n<li>checks out meta repo that we are working from<\/li>\n<li>updates the submodule configuration to be able to pull the required submodule without authentication. the &#8220;ssh+git:\/\/&#8221; setup requires the maintainer&#8217;s SSH credentials, while switching to &#8220;https:\/\/&#8221; the CI environment is allowed to check the package&#8217;s code out (and won&#8217;t be able to push back upstream, which is safer)<\/li>\n<li>runs &#8220;namcap&#8221; on the PKGBUILD to catch any obvious issues<\/li>\n<li>builds and installs the package (including dependencies)<\/li>\n<\/ul>\n<p>As &#8220;my-package&#8221; is set up above, it does not have any line specific in to that package in the build steps. The specifics are set up using CircleCI variables (CIRCLE_JOB) and <a href=\"http:\/\/yaml.org\/spec\/1.2\/spec.html\">YAML<\/a>\u00a0<a href=\"http:\/\/yaml.org\/type\/merge.html\">Merge Key Language-Independent Types<\/a>\u00a0(the &#8220;foo: &amp;foo&#8221; and &#8220;&lt;&lt; : *foo&#8221; section). Thus if there&#8217;s &#8220;another-package&#8221;, it&#8217;s easy to clone the &#8220;my-package&#8221; section as it is, naming that &#8220;another-package&#8221;, and adding a new build job to the end of the file called &#8220;another-package&#8221;. With this &#8220;templating&#8221; when the build steps need to be modified, they can be updated in the header, and all the packages will pick that up.<\/p>\n<p>Workflows are also useful, as\u00a0 jobs can be made dependent on each other, if they are related, such as my &#8220;gnushogi&#8221; and &#8220;xshogi&#8221; packages, or likely any AUR package that requires other AUR packages that need to be built.<\/p>\n<pre class=\"lang:yaml decode:true\" title=\"Workflow with dependency\">...\r\nworkflows:\r\n  version: 2\r\n  build:\r\n    jobs:\r\n      &lt;other jobs&gt;\r\n      - gnushogi\r\n      - xshogi:\r\n          requires:\r\n            - gnushogi\r\n<\/pre>\n<p>This would result in a dependency in the jobs as:<\/p>\n<figure id=\"attachment_2443\" aria-describedby=\"caption-attachment-2443\" style=\"width: 724px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_jobs.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2443\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_jobs.png\" alt=\"\" width=\"724\" height=\"973\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_jobs.png 724w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_jobs-372x500.png 372w\" sizes=\"auto, (max-width: 724px) 100vw, 724px\" \/><\/a><figcaption id=\"caption-attachment-2443\" class=\"wp-caption-text\">Jobs in the CircleCI workflow<\/figcaption><\/figure>\n<p>The workflows also allow for jobs to give files to each other. E.g. as above &#8220;xshogi&#8221; depends on &#8220;gnushogi&#8221; to be installed, I could build all the required dependencies again in &#8220;xshogi&#8221;, but it was already built, I could just pass on the created package from the earlier job to the next, using <a href=\"https:\/\/circleci.com\/blog\/deep-diving-into-circleci-workspaces\/\">CircleCI workspaces<\/a>.<\/p>\n<pre class=\"lang:yaml decode:true\" title=\"Sample file passing between jobs with workspaces\">  gnushogi:\r\n    &lt;&lt;: *defaults\r\n    steps:\r\n      - run:\r\n          &lt;&lt;: *updatepackage\r\n      - checkout\r\n      - run:\r\n          &lt;&lt;: *gitupdate\r\n      - run:\r\n          &lt;&lt;: *pkgbuildtest\r\n      - run:\r\n          &lt;&lt;: *buildtest\r\n      - persist_to_workspace:\r\n          root: gnushogi\r\n          paths: gnushogi-*.pkg.tar.xz\r\n\r\n  xshogi:\r\n    &lt;&lt;: *defaults\r\n    steps:\r\n    &lt;&lt;: *defaults\r\n    steps:\r\n      - run:\r\n          &lt;&lt;: *updatepackage\r\n      - checkout\r\n      - run:\r\n          &lt;&lt;: *gitupdate\r\n      - run:\r\n          &lt;&lt;: *pkgbuildtest\r\n      - attach_workspace:\r\n          at: \/tmp\/workspace\r\n      - run:\r\n          name: Installing gnushogi\r\n          command: sudo pacman -U --noconfirm \/tmp\/workspace\/gnushogi*.pkg.*\r\n      - run:\r\n          &lt;&lt;: *buildtest\r\n<\/pre>\n<p>The meta repo is now ready to go with such &#8220;.circleci\/config.yml&#8221;, and on each push, it will build all the packages defined in the job list. You can check how the results look for my AUR packages in CircleCI&#8217;s <a href=\"https:\/\/circleci.com\/gh\/imrehg\/aur\">build job view<\/a> (one entry by build job, ie. package-per-push) or <a href=\"https:\/\/circleci.com\/gh\/imrehg\/workflows\/aur\">workflow view<\/a>\u00a0(one entry per push, aggregating all jobs).<\/p>\n<figure id=\"attachment_2453\" aria-describedby=\"caption-attachment-2453\" style=\"width: 1020px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_workflow_small.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2453\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_workflow_small.png\" alt=\"\" width=\"1020\" height=\"845\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_workflow_small.png 1020w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_workflow_small-500x414.png 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_workflow_small-768x636.png 768w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/a><figcaption id=\"caption-attachment-2453\" class=\"wp-caption-text\">Last build workflows<\/figcaption><\/figure>\n<p>One of the advantages of this setup, is that if a build fails on any of the package (e.g. a source file is no longer available) it&#8217;s easy to see, and I can catch a number of out-of-date packages sooner than someone reports it on AUR.<\/p>\n<h2>Keeping the build image up to data<\/h2>\n<p>The\u00a0 Arch Linux Docker image is <a href=\"https:\/\/docs.docker.com\/docker-hub\/builds\/\">automatically built<\/a> on Docker Hub (and can be found at <a href=\"https:\/\/hub.docker.com\/r\/imrehg\/archlinux-makepkg\/\">imrehg\/archlinux-makepkg<\/a>. It is kept fresh by an <a href=\"https:\/\/ifttt.com\/\">If This Than That<\/a> applet, which triggers the build every morning.<\/p>\n<figure id=\"attachment_2441\" aria-describedby=\"caption-attachment-2441\" style=\"width: 691px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/aur_build_image_ifttt.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2441 size-full\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/aur_build_image_ifttt.png\" alt=\"\" width=\"691\" height=\"549\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/aur_build_image_ifttt.png 691w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/aur_build_image_ifttt-500x397.png 500w\" sizes=\"auto, (max-width: 691px) 100vw, 691px\" \/><\/a><figcaption id=\"caption-attachment-2441\" class=\"wp-caption-text\">IFTTT Applet to trigger Docker Hub automated builds<\/figcaption><\/figure>\n<p>That applet just uses the <a href=\"https:\/\/ifttt.com\/date_and_time\">Date &amp; Time<\/a> and <a href=\"https:\/\/ifttt.com\/maker_webhooks\">Webhooks<\/a> recipes. The webhook points to the Trigger URL provided by the &#8220;Build Settings \/ Build Triggers&#8221; section on Docker Hub for the image, and it&#8217;s a POST request with payload of:<\/p>\n<pre class=\"lang:js decode:true\" title=\"Docker Hub build trigger payload\">{\"docker_tag\": \"latest\"}<\/pre>\n<figure id=\"attachment_2442\" aria-describedby=\"caption-attachment-2442\" style=\"width: 525px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/docker_hub_triggers.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2442 size-large\" src=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/docker_hub_triggers-1024x563.png\" alt=\"\" width=\"525\" height=\"289\" srcset=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/docker_hub_triggers-1024x563.png 1024w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/docker_hub_triggers-500x275.png 500w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/docker_hub_triggers-768x422.png 768w, https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/docker_hub_triggers.png 1909w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><\/a><figcaption id=\"caption-attachment-2442\" class=\"wp-caption-text\">Docker HUB Build Settings \/ Build Triggers settings<\/figcaption><\/figure>\n<p>Keeping the image fresh like this shortens the build time when running the jobs on CircleCI (fewer packages need to be updated), which especially important as free users have limited CPU time available each month.<\/p>\n<p>Not many packages which use other AUR packages, which likely need more setup here.<\/p>\n<h2>Update workflow<\/h2>\n<p>As an aside, the process to update any given package with this setup as follows:<\/p>\n<ul>\n<li>Update the &#8220;PKGBUILD&#8221; for the package, quite often it&#8217;s just the version number<\/li>\n<li>Update the checksums easily with &#8220;updpkgsums&#8221; (part of &#8220;pacman&#8221; so it should be always available)<\/li>\n<li>Build the package<\/li>\n<li>If everything goes well, update the required &#8220;.SRCINFO&#8221; with &#8220;mksrcinfo&#8221; (part of &#8220;pkgbuild-introspection&#8221;)<\/li>\n<li>git add, commit (signed if you can:), and push to AUR<\/li>\n<li>Clean up the package directory (&#8220;git clean -d -f &amp;&amp; rm -rf src&#8221;)<\/li>\n<li>Going back up in the folder hierarchy to the meta repo git add and commit the changes to the submodules<\/li>\n<li>Push to github, and enjoy the build!<\/li>\n<\/ul>\n<h2>Future<\/h2>\n<p>Many things can be improved on this setup (one day), here are some ideas<\/p>\n<p>It should be possible to <strong>publish the build artifacts<\/strong> to somewhere (say S3) and set it up as a custom Arch Linux package repository, thus can be reused without everyone needing to build from scratch every time.<\/p>\n<p>If that publishing would happen, I&#8217;m guessing it would be good to also <strong>sign the built packages<\/strong>, which might be a bit trickier to set up safely, but would make package distribution nicer and more robust.<\/p>\n<p>In my list of packages there are not that many that depend on other AUR packages. Other <strong>packages with more AUR dependencies<\/strong> might need even more custom setup than shown above, besides the templated sections, to make them speedy and logical.<\/p>\n<p>In the package testing steps, probably should <strong>run &#8220;namcap&#8221; on the finished package<\/strong> too, to catch other issues (e.g. dependencies required but not included).<\/p>\n<hr \/>\n<p>What&#8217;s your experience with maintaining AUR packages, or with CircleCI? Have any feedback on how to make this above even more useful?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Using git submodules and CircleCI workflows to build and test the AUR packages I maintain.<\/p>\n","protected":false},"author":1,"featured_media":2431,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[183,204,205,206],"class_list":["post-2425","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-admin","tag-arch-linux","tag-circleci","tag-docker","tag-yaml"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Continuous integration testing of Arch User Repository packages - ClickedyClick<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Continuous integration testing of Arch User Repository packages - ClickedyClick\" \/>\n<meta property=\"og:description\" content=\"Using git submodules and CircleCI workflows to build and test the AUR packages I maintain.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/\" \/>\n<meta property=\"og:site_name\" content=\"ClickedyClick\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/gergely.imreh\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/gergely.imreh\" \/>\n<meta property=\"article:published_time\" content=\"2018-04-12T11:56:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-04-12T12:03:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_workflow.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1440\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Gergely Imreh\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@imrehg\" \/>\n<meta name=\"twitter:site\" content=\"@imrehg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gergely Imreh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/\"},\"author\":{\"name\":\"Gergely Imreh\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"headline\":\"Continuous integration testing of Arch User Repository packages\",\"datePublished\":\"2018-04-12T11:56:40+00:00\",\"dateModified\":\"2018-04-12T12:03:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/\"},\"wordCount\":1353,\"commentCount\":7,\"publisher\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"image\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/circleci_aur_workflow.png\",\"keywords\":[\"Arch Linux\",\"CircleCI\",\"Docker\",\"YAML\"],\"articleSection\":[\"Admin\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/\",\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/\",\"name\":\"Continuous integration testing of Arch User Repository packages - ClickedyClick\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/circleci_aur_workflow.png\",\"datePublished\":\"2018-04-12T11:56:40+00:00\",\"dateModified\":\"2018-04-12T12:03:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/circleci_aur_workflow.png\",\"contentUrl\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/04\\\/circleci_aur_workflow.png\",\"width\":2560,\"height\":1440},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/2018\\\/04\\\/circleci-aur\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Continuous integration testing of Arch User Repository packages\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/\",\"name\":\"ClickedyClick\",\"description\":\"Life in real, complex and digital.\",\"publisher\":{\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/#\\\/schema\\\/person\\\/42391e2ae52c8ed76b37be509a5707b0\",\"name\":\"Gergely Imreh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\",\"caption\":\"Gergely Imreh\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g\"},\"description\":\"Physicist, hacker. Enjoys avant-guarde literature probably a bit too much. Open source advocate and contributor, both for software and hardware. Follow these posts on the Fediverse by @gergely@gergely.imreh.net\",\"sameAs\":[\"https:\\\/\\\/gergely.imreh.net\\\/\",\"https:\\\/\\\/www.facebook.com\\\/gergely.imreh\",\"https:\\\/\\\/www.instagram.com\\\/imrehg\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/gergelyimreh\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@GergelyImreh\"],\"url\":\"https:\\\/\\\/gergely.imreh.net\\\/blog\\\/author\\\/gergely\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Continuous integration testing of Arch User Repository packages - ClickedyClick","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/","og_locale":"en_GB","og_type":"article","og_title":"Continuous integration testing of Arch User Repository packages - ClickedyClick","og_description":"Using git submodules and CircleCI workflows to build and test the AUR packages I maintain.","og_url":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/","og_site_name":"ClickedyClick","article_publisher":"https:\/\/www.facebook.com\/gergely.imreh","article_author":"https:\/\/www.facebook.com\/gergely.imreh","article_published_time":"2018-04-12T11:56:40+00:00","article_modified_time":"2018-04-12T12:03:43+00:00","og_image":[{"width":2560,"height":1440,"url":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_workflow.png","type":"image\/png"}],"author":"Gergely Imreh","twitter_card":"summary_large_image","twitter_creator":"@imrehg","twitter_site":"@imrehg","twitter_misc":{"Written by":"Gergely Imreh","Estimated reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/#article","isPartOf":{"@id":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/"},"author":{"name":"Gergely Imreh","@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"headline":"Continuous integration testing of Arch User Repository packages","datePublished":"2018-04-12T11:56:40+00:00","dateModified":"2018-04-12T12:03:43+00:00","mainEntityOfPage":{"@id":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/"},"wordCount":1353,"commentCount":7,"publisher":{"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"image":{"@id":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/#primaryimage"},"thumbnailUrl":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_workflow.png","keywords":["Arch Linux","CircleCI","Docker","YAML"],"articleSection":["Admin"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/","url":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/","name":"Continuous integration testing of Arch User Repository packages - ClickedyClick","isPartOf":{"@id":"https:\/\/gergely.imreh.net\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/#primaryimage"},"image":{"@id":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/#primaryimage"},"thumbnailUrl":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_workflow.png","datePublished":"2018-04-12T11:56:40+00:00","dateModified":"2018-04-12T12:03:43+00:00","breadcrumb":{"@id":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/#primaryimage","url":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_workflow.png","contentUrl":"https:\/\/gergely.imreh.net\/blog\/wp-content\/uploads\/2018\/04\/circleci_aur_workflow.png","width":2560,"height":1440},{"@type":"BreadcrumbList","@id":"https:\/\/gergely.imreh.net\/blog\/2018\/04\/circleci-aur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gergely.imreh.net\/blog\/"},{"@type":"ListItem","position":2,"name":"Continuous integration testing of Arch User Repository packages"}]},{"@type":"WebSite","@id":"https:\/\/gergely.imreh.net\/blog\/#website","url":"https:\/\/gergely.imreh.net\/blog\/","name":"ClickedyClick","description":"Life in real, complex and digital.","publisher":{"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gergely.imreh.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/gergely.imreh.net\/blog\/#\/schema\/person\/42391e2ae52c8ed76b37be509a5707b0","name":"Gergely Imreh","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g","caption":"Gergely Imreh"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/1d5be311c5d616a3f4c7dfbc6b736ec817d2508b8c420ec29edb950d33fb4946?s=96&d=retro&r=g"},"description":"Physicist, hacker. Enjoys avant-guarde literature probably a bit too much. Open source advocate and contributor, both for software and hardware. Follow these posts on the Fediverse by @gergely@gergely.imreh.net","sameAs":["https:\/\/gergely.imreh.net\/","https:\/\/www.facebook.com\/gergely.imreh","https:\/\/www.instagram.com\/imrehg\/","https:\/\/www.linkedin.com\/in\/gergelyimreh\/","https:\/\/www.youtube.com\/@GergelyImreh"],"url":"https:\/\/gergely.imreh.net\/blog\/author\/gergely\/"}]}},"_links":{"self":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/2425","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/comments?post=2425"}],"version-history":[{"count":17,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/2425\/revisions"}],"predecessor-version":[{"id":2435,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/posts\/2425\/revisions\/2435"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/media\/2431"}],"wp:attachment":[{"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/media?parent=2425"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/categories?post=2425"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gergely.imreh.net\/blog\/wp-json\/wp\/v2\/tags?post=2425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}